selenium自动化测试-处理iframe

Selenium自动化测试-iframe处理css

上一篇,咱们介绍了元素的内容、属性、状态信息。写自动化脚本时会遇到 iframe嵌套页面,这时直接定位是不行的,今天咱们要介绍怎么处理iframe定html

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

 

以163网易邮箱帐号或手机号码输入框为例,咱们先按正常定位方法试下可否定位成功。web

代码以下:chrome

报错信息以下:app

Traceback (most recent call last):框架

      ......学习

     raise exception_class(message, screen, stacktrace)测试

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

  (Session info: chrome=76.0.3809.132)

 

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

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

<iframe name="" frameborder="0" id="x-URS-iframe1570682661270.0098" scrolling="no" style="width: 100%; height: 100%; border: none; background: none;" src="https://dl.reg.163.com/webzj/v1.0.1/pub/index_dl2_new.html?cd=https%3A%2F%2Fmimg.127.net%2Fp%2Ffreemail%2Findex%2Funified%2Fstatic%2F2019%2Fcss%2F&cf=urs.163.bc0e7491.css&MGID=1570682661270.0098&wdaId=&pkid=CvViHzl&product=mail163" __idm_frm__="472"></iframe>
 

 

1、怎么切换到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')]") 

 

2、从iframe切回到主文档

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

代码以下:

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

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

运行以后,切换到iframe框架,而后再切回主文档,定位企业邮箱连接

3、嵌多层套iframe的操做

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

<frame src="" id="index_main" name="main" scrolling="Yes" noresize="noresize">

        <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>

好比这个源码中,有三层iframe嵌套,若是咱们想定位到id="TeWebEditor这一层,代码以下:

driver.switch_to_.rame("inden_main")
driver.switch_to_.rame("EEditor1)
driver.switch_to_.rame("eeWebEditor"

 

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

# 切换到第一层iframe
driver.switch_to_.rame("inden_main")
# 切换到第二层iframe
driver.switch_to_.rame("EEditor1)
切换到第三层iframe
driver.switch_to_.rame("eeWebEditor)
从新切换到父iframe,即切换到第二层iframe
driver.switch_to.parent_frame()

  

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

下一篇将介绍单选框和多选框的操做

 

 若是学习中有什么疑问,欢迎关注公众号:ITester软件测试小栈

相关文章
相关标签/搜索