< frame> <iframe> 标签,浏览器会在标签中打开一个特定的页面窗口(框架),它在本窗口中嵌套进入一个网页,当用selenium定位页面元素的时候会遇到定位不到frame框架内的元素的问题。

定位frame中的元素前我们需要driver.switch_to.frame()切换到对应的frame中,执行操作后,要操作frame框架外的元素,需要通过driver.switch_to.default_content()切换回主文档页面。

driver.switch_to.frame(index/id/name/WebElement) 切入frame裤架中,参数可以为id/name/index

driver.switch_to.parent_frame() 切换回当前frame的上一层,如果当前已是主文档,则无效果

driver.switch_to.default_content() 切换回主文档


创建如下两个html文件,两个文件放入同一个文件夹内

frame.html

  1. <html>
  2. <head>
  3. <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
  4. <title>frame</title>
  5. </head>
  6. <body>
  7. <div class="row-fluid">
  8. <label>frame外输入框</label>
  9. <input type='text' id="frameinput">
  10. <div class="span10 well">
  11. <h3>frame</h3>
  12. <iframe id="f1" name="frame2" src="inner_frame.html" width="800" height="600"></iframe>
  13. </div>
  14. </div>
  15. </body>
  16. </html>

inner_frame.html

  1. <html>
  2. <head>
  3. <title>inner frame</title>
  4. </head>
  5. <body>
  6. <label id="innerlable">frame1内多选按钮 </label>
  7. <input type="checkbox" id="innercheck" name="inner">
  8. <div class="row-fluid">
  9. <h3>inner frame</h3>
  10. <iframe id="f2" name="frame2" src="http://m.baidu.com/" width="700" height="400">
  11. </iframe>
  12. </div>
  13. </body>
  14. </html>

示例:操作主文档的元素 --> 切换到外层frame 操作外层frame的元素 --> 切换到内层frame 操作内层的元素 --> 切换回外层frame 操作外层frame 的元素 --> 再次切入内层frame操作元素 --> 切换回主文档操作文档元素 -->再去切换到外层frame操作元素

  1. from selenium import webdriver
  2. import time
  3. driver = webdriver.Chrome()
  4. driver.get(r'E:\frame.html') # 打开frame.html页面,注意修改为你的位置
  5. driver.find_element_by_id('frameinput').send_keys('操作frame外的元素')
  6. driver.switch_to.frame(0) # 根据index切换,从0开始
  7. text = driver.find_element_by_id('innerlable').text
  8. print(text)
  9. driver.find_element_by_id('innercheck').click()
  10. driver.switch_to.frame('f2') # 根据id切入 内层frame
  11. driver.find_element_by_id('index-kw').send_keys('selenium frame')
  12. driver.switch_to.parent_frame() # 切换到上一层表单
  13. driver.find_element_by_id('innercheck').click()
  14. driver.switch_to.frame('frame2') # 根据name再次切入内层frame
  15. driver.find_element_by_id('index-bn').click()
  16. driver.switch_to.default_content() # 切换回主文档
  17. driver.find_element_by_ta('frameinput').clear()
  18. driver.switch_to.frame(driver.find_elements_by_tag_name('iframe')) # 通过webelement切换driver.find_element_by_id('innercheck').click()
  19. time.sleep(3)
  20. driver.quit()

1、 driver.switch_to.frame(frame_reference)切换进入frame

switch_to_frame() 将淘汰使用,建议使用switch_to.frame()。

switch_to.frame() 切换frame支持4种不同参数方法进行切换,元素的frame的index,frame的id或name属性,frame元素的WebElement元素对象。

通常采用id和name就能够解决绝大多数问题。但有时候frame并无这两项属性,则可以用index和WebElement来定位:

  • index从0开始,整型参数,根据同层frame的顺序定位
  • WebElement对象,即find_element方法所取得的对象,我们可以用tag_name、xpath等来定位frame对象。如上示例的:driver.switch_to.frame(driver.find_elements_by_tag_name('iframe'))

2、 driver.switch_to.default_content() 切换回主文档

切到frame中之后,我们便不能继续操作主文档的元素,这时如果想操作主文档内容,则需切回主文档。

  1. driver.switch_to.default_content() # 切换到主文档中。

注意:很多人都会忘记这步操作

3、driver.switch_to.parent_frame() 切换到上一层表单

  1. <html>
  2. <iframe id="frame1">
  3. <iframe id="frame2" / >
  4. </iframe>
  5. </html>

嵌套frame很少会遇到,如下frame1为外层,frame2嵌套在frame1中。我们进行切换操作如下:

a. 从主文档切到frame2,一层层切进去

  1. driver.switch_to.frame("frame1")
  2. driver.switch_to.frame("frame2")

b. 从frame2再切回frame1,selenium提供了一个方法能够从子frame切回到父frame,而不用我们切回主文档再切进来。

  1. driver.switch_to.parent_frame() # 如果当前已是主文档,则无效果

parent_frame()这个相当于后退的方法,我们可以随意切换不同的frame。

selenium自动化测试入门 定位frame和iframe中的元素对象的更多相关文章

  1. 操作Frame和IFrame中页面元素

    HTML <iframe> 标签 定义:iframe 元素会创建包含另外一个文档的内联框架(即行内框架). frame标签有frameset.frame.iframe三种,frameset ...

  2. Java中通过Selenium WebDriver定位iframe中的元素

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 问题:有一些元素,无论是通过id或是xpath等等,怎么都定位不到. 分析:这很可能是因为你要定位 ...

  3. Java Selenium (十二) 操作弹出窗口 & 智能等待页面加载完成 & 处理 Iframe 中的元素

    一.操作弹出窗口   原理 在代码里, 通过 Set<String> allWindowsId = driver.getWindowHandles(); 来获取到所有弹出浏览器的句柄, 然 ...

  4. Js/Jquery获取iframe中的元素

    转载: Js/Jquery获取iframe中的元素 - - ITeye技术网站http://java-my-life.iteye.com/blog/1275205 在web开发中,经常会用到ifram ...

  5. js 获取iframe中的元素

    今天要修改编辑器插件中的元素遇到的问题 jquery 在父窗口中获取iframe中的元素 1.Js代码 格式:$("#iframe的ID").contents().find(&qu ...

  6. Js/Jquery获取iframe中的元素 在Iframe中获取父窗体的元素方法

    在web开发中,经常会用到iframe,难免会碰到需要在父窗口中使用iframe中的元素.或者在iframe框架中使用父窗口的元素 js 在父窗口中获取iframe中的元素  1. 格式:window ...

  7. 父窗口中获取iframe中的元素

    js 在父窗口中获取iframe中的元素 1. 格式:window.frames["iframe的name值"].document.getElementById("ifr ...

  8. 获取父窗口元素或者获取iframe中的元素(相同域名下)

    jquery方法 在父窗口中获取iframe中的元素 //方法1 $("#iframe的ID").contents().find("iframe中的元素"); ...

  9. 获取iframe中的元素

    父窗口中获取iframe中的元素 var ifr = document.getElementById('suggustion').contentWindow.document.body; 在ifram ...

随机推荐

  1. 薪资管理系统(Java面向对象思想)

    package com.test3; import java.util.*; import java.io.*; /** * @author qingfeng * 重要思想:面向对象思想(添加员工管理 ...

  2. LOJ 10239 有趣的数列

    LOJ 10239 有趣的数列 首先可以将奇数视作入栈,偶数视作出栈,那么它是卡特兰数,其实打表也能看出来,而且好像可以用dp? 不过这道题的难点不在这里,p不是素数,所以不能用求逆元来做,不过前50 ...

  3. 如何用JS和HTML 做一个桌面炒股小插件【原创】

    首先,使用node-webkit 做环境,废话不多说,直接贴HTML <!DOCTYPE html> <html xmlns="http://www.w3.org/1999 ...

  4. HDU1686 Oulipo 题解 KMP算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686 题目大意:给你一个子串t和一个母串s,求s中有多少个子串t. 题目分析:KMP模板题. cal_ ...

  5. KMPnext数组运用、最小循环节问题

    http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html http://www.cnblogs.com/wuyiqi/archive/ ...

  6. iptables一个包过滤防火墙实例

    环境:redhat9 加载了string time等模块 eth0 接外网──ppp0 eth1 接内网──192.168.0.0/24 #!/bin/sh # modprobe ipt_MASQUE ...

  7. Java Integer类的缓存

    首先看一段代码(使用JDK 5),如下: public class Hello { public static void main(String[] args) { int a = 1000, b = ...

  8. CentOS7在防火墙与端口上的操作

    https://jingyan.baidu.com/article/cdddd41cb3bf6c53cb00e1ac.html CentOS7在安装软件包或类库的时候,常常会因为防火墙的拦截和端口未开 ...

  9. C#将可编译为本地机器码

    微软宣布了.net native的开发者预览版,详见这里. 这是一个大家期待了很多年的特性.每年在技术论坛上都有无数的人问,C#能否编译成本地机器码. 有了这个特性之后,更多开发商会开始选择C#来开发 ...

  10. web.xml和@WebServlet

    web.xml <servlet> <servlet-name>DZDYServlet</servlet-name> <servlet-class>包名 ...