我们都知道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)
1
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() # 退出框架
- 解决:
本文遇见的情况就是: 元素属性值不是唯一的,每次的值都会随机发生变化
解决办法: 通过定位框架的层级或者标签来定位,不是定位某个固定元素值
原文链接:https://blog.csdn.net/weixin_44342166/article/details/99635635
标签:name,处理,driver,id,非正常,iframe,element,find From: https://www.cnblogs.com/xujunhui/p/17728331.html