本文操作iframe时遇到的报错有:
- NoSuchFrameException: Message: no such frame: element is not a frame
- in frame raise NoSuchFrameException(frame_reference)
selenium.common.exceptions.NoSuchFrameException: Message: x-URS-iframe
我们都知道iframe 是HTML里面的一个用于网页嵌套网页的框架,一个网页可以嵌套到另一个网页中,可以嵌套多层,当然也可以平衡嵌套,常见的一般有两种:
- 嵌套 框架 (大框架下包含小框架)
- 平行 嵌套 (平衡摆放,平级关系)
一般定位iframe的方法
1、iframe有具体的name 和 id 属性(id和name的属性值如果是动态变化的数字 就不能使用)
.switch_to_iframe("id or name 的属性值")
2、iframe标签本身没有id 和 name 属性
- 方式1:定位iframe元素
iframe = driver.find_elements_by_tag_name("iframe")[0] # 根据需要填入index,这里定位HTML里的第一个
driver.switch_to.frame(iframe)
- 方式2:用Xpath或css定位到iframe的父类
name = driver.find_element_by_xpath('//*[@id="panel"]')
driver.switch_to_iframe(name)
3、框架有进入就会有退出 — 针对平行iframe标签
.switch_to.default_content()
下面说说,定位163邮箱遇到的一些坑
坑一:
- 输入代码:用固定id的方法定位
# import time
# from selenium import webdriver
# driver = webdriver.Chrome()
# driver.get("https://email.163.com")
# time.sleep(50) # 我怕不够时间加载,所以时间加长了(排除时间太短产生timeout的错误)
# driver.switch_to.default_content()
# driver.switch_to.frame('x-URS-iframe1565846475124.4539') # 切换到框架(这里用了ID属性)
# driver.find_element_by_name("email").send_keys("bingo")
# time.sleep(1)
# driver.find_element_by_name("password").send_keys("123456")
# time.sleep(1)
# driver.find_element_by_id("dologin").click()
# driver.switch_to.default_content() # 退出框架
- 报错:定位不到对应的iframe
in frame raise NoSuchFrameException(frame_reference)
selenium.common.exceptions.NoSuchFrameException: Message: x-URS-iframe
- 分析:iframe标签的id会变动
- 解决:发现这里的iframe标签的id会变动,所以不能用id属性直接定位,需要更改定位方式
坑二:
- 输入代码:用xpath定位iframe的父类
# import time
# from selenium import webdriver
# driver = webdriver.Chrome()
# driver.get("https://email.163.com")
# time.sleep(2)
# name = driver.find_element_by_xpath('//*[@id="panel"]') # iframe 的父类
# driver.switch_to.frame(name)
# driver.find_element_by_name("email").send_keys("bingo")
# time.sleep(1)
# driver.find_element_by_name("password").send_keys("123456")
# time.sleep(1)
# driver.find_element_by_id("dologin").click()
# driver.switch_to.default_content() # 退出框架
- 报错:定位到的元素不是框架
in check_response raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchFrameException: Message: no such frame: element is not a frame
- 分析:既让定位到的是元素,那我就直接定位iframe标签了
- 解决:
输入代码
# import time
# from selenium import webdriver
# driver = webdriver.Chrome()
# driver.get("https://email.163.com")
# time.sleep(2)
# iframe = driver.find_elements_by_tag_name("iframe")[0]
# driver.switch_to.frame(iframe)
# driver.find_element_by_name("email").send_keys("bingo")
# time.sleep(1)
# driver.find_element_by_name("password").send_keys("123456")
# time.sleep(1)
# driver.find_element_by_id("dologin").click()
# driver.switch_to.default_content() # 退出框架
结果:定位成功
如有不足欢迎指正,如需转载,请附上本文链接,如果觉得对你有帮助,欢迎给我一个小小的赞,谢谢!