selenium 处理iframe
  p2QdBCa7ky7t 2023年11月02日 21 0

iframe是HTML标签,作用是文档中的文档,或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架(即行内框架), 作用就是嵌套网页。

以XXX邮箱账号或手机号码输入框为例,我们先按正常定位方法试下能否定位成功。

selenium 处理iframe_selenium

代码如下:

selenium 处理iframe_selenium_02

报错信息如下:

Traceback (most recent call last):

  1. ......
  2. raise exception_class(message, screen, stacktrace)

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable

(Session info: chrome=76.0.3809.132)

让我们定位到元素看下到底发生了什么

selenium 处理iframe_iframe_03

我们发现要定位的这个元素在当套的iframe页面里,我们要操作这个元素,需要先切换到iframe页面,才能正常定定位

一、怎么切换到iframe

1.iframe有固定id或name属性

①有id属性,且唯一

driver.switch_to.frame(‘id’)

②有那name性,且唯一

driver.switch_to.frame(‘name’)

selenium 处理iframe_selenium_04

2.如果是动态id或者没有id和name属性,可以xpath或css定位解决

检查发现126邮箱id=”x-URS-iframexxxxxx” 是动态id, 所以,我们不能直接通过id定位

我们用之前学过的css定位,代码如下:

selenium 处理iframe_selenium_05

邮箱或手机号输入框写入了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’)]”)

selenium 处理iframe_css_06

二、从iframe切回到主文档

切换到iframe框架内后,就不能直接定位主文档元素了,比如切换到iframe之后,再定位126邮箱页面的企业邮箱链接。

selenium 处理iframe_selenium_07

代码如下:

selenium 处理iframe_selenium_08

结果报错,因为在iframe框架内,没有切换到主文档,不能直接定位到主文档的元素

selenium 处理iframe_css_09

处理办法是,需回主文档,进行定位,使用:driver.switch_to.default_content()

selenium 处理iframe_css_10

运行之后,切换到iframe框架,然后再切回主文档,定位企业邮箱链接

三、嵌多层套iframe的操作

但时候页面会有多层嵌套iframe,这时候我们需要层层切换iframe

  1. <iframe id="Editor1" src="" frameborder="0" scrolling="no" >
  2. <iframe id="eWebEditor" width="100%" height="100%" scrolling="yes" frameborder="0" src="">
  3. <input type="text" id="TeacherTxt" name="Teacher" size="12" maxlength="12" >
  4. </iframe>
  5. </iframe>

比如这个源码中,有三层iframe嵌套,如果我们想定位到id=”TeWebEditor这一层,代码如下:

selenium 处理iframe_iframe_11

那么如果我们又想切换到上一层呢,driver.switch_to.parent_frame(),表示从当前的子iframe切换到父iframe,即上级iframe

selenium 处理iframe_iframe_12

总结:遇到iframe时,需要先切换到iframe框架内,再进行定位;多层嵌套的,层层切换iframe;在iframe框架内,定位主文档的元素,需切回到主文档再定位

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  1BVmdlLr07sm   2023年11月30日   63   0   0 HTMLcss
p2QdBCa7ky7t
最新推荐 更多