iframe是HTML标签,作用是文档中的文档,或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架(即行内框架), 作用就是嵌套网页。
以XXX邮箱账号或手机号码输入框为例,我们先按正常定位方法试下能否定位成功。
代码如下:
报错信息如下:
Traceback (most recent call last):
- ......
- raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
(Session info: chrome=76.0.3809.132)
让我们定位到元素看下到底发生了什么
我们发现要定位的这个元素在当套的iframe页面里,我们要操作这个元素,需要先切换到iframe页面,才能正常定定位
一、怎么切换到iframe
1.iframe有固定id或name属性
①有id属性,且唯一
driver.switch_to.frame(‘id’)
②有那name性,且唯一
driver.switch_to.frame(‘name’)
2.如果是动态id或者没有id和name属性,可以xpath或css定位解决
检查发现126邮箱id=”x-URS-iframexxxxxx” 是动态id, 所以,我们不能直接通过id定位
我们用之前学过的css定位,代码如下:
邮箱或手机号输入框写入了vivi,表示切换iframe,定位成功
这里再补充下xpath其他的三种方法
1.contains(a, b) 如果a中含有字符串b,则返回true,否则返回false
driver.find_element_by_xpath(“//div[contains(@id, ‘btn-attention’)]”)
2.starts-with(a, b) 如果a是以字符串b开头,返回true,否则返回false
driver.find_element_by_xpath(“//div[starts-with(@id, ‘btn-attention’)]”)
3.ends-with(a, b) 如果a是以字符串b结尾,返回true,否则返回false
driver.find_element_by_xpath(“//div[ends-with(@id, ‘btn-attention’)]”)
二、从iframe切回到主文档
切换到iframe框架内后,就不能直接定位主文档元素了,比如切换到iframe之后,再定位126邮箱页面的企业邮箱链接。
代码如下:
结果报错,因为在iframe框架内,没有切换到主文档,不能直接定位到主文档的元素
处理办法是,需回主文档,进行定位,使用:driver.switch_to.default_content()
运行之后,切换到iframe框架,然后再切回主文档,定位企业邮箱链接
三、嵌多层套iframe的操作
但时候页面会有多层嵌套iframe,这时候我们需要层层切换iframe
- <iframe id="Editor1" src="" frameborder="0" scrolling="no" >
- <iframe id="eWebEditor" width="100%" height="100%" scrolling="yes" frameborder="0" src="">
- <input type="text" id="TeacherTxt" name="Teacher" size="12" maxlength="12" >
- </iframe>
- </iframe>
比如这个源码中,有三层iframe嵌套,如果我们想定位到id=”TeWebEditor这一层,代码如下:
那么如果我们又想切换到上一层呢,driver.switch_to.parent_frame(),表示从当前的子iframe切换到父iframe,即上级iframe
总结:遇到iframe时,需要先切换到iframe框架内,再进行定位;多层嵌套的,层层切换iframe;在iframe框架内,定位主文档的元素,需切回到主文档再定位
标签:定位,处理,driver,selenium,文档,切换,iframe,id From: https://blog.51cto.com/u_16304318/7916327