selenium自动化测试入门 定位frame和iframe中的元素对象
< 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
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<title>frame</title>
</head>
<body>
<div class="row-fluid">
<label>frame外输入框</label>
<input type='text' id="frameinput">
<div class="span10 well">
<h3>frame</h3>
<iframe id="f1" name="frame2" src="inner_frame.html" width="800" height="600"></iframe>
</div>
</div>
</body>
</html>
inner_frame.html
<html>
<head>
<title>inner frame</title>
</head>
<body>
<label id="innerlable">frame1内多选按钮 </label>
<input type="checkbox" id="innercheck" name="inner">
<div class="row-fluid">
<h3>inner frame</h3>
<iframe id="f2" name="frame2" src="http://m.baidu.com/" width="700" height="400">
</iframe>
</div>
</body>
</html>
示例:操作主文档的元素 --> 切换到外层frame 操作外层frame的元素 --> 切换到内层frame 操作内层的元素 --> 切换回外层frame 操作外层frame 的元素 --> 再次切入内层frame操作元素 --> 切换回主文档操作文档元素 -->再去切换到外层frame操作元素
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get(r'E:\frame.html') # 打开frame.html页面,注意修改为你的位置
driver.find_element_by_id('frameinput').send_keys('操作frame外的元素')
driver.switch_to.frame(0) # 根据index切换,从0开始
text = driver.find_element_by_id('innerlable').text
print(text)
driver.find_element_by_id('innercheck').click()
driver.switch_to.frame('f2') # 根据id切入 内层frame
driver.find_element_by_id('index-kw').send_keys('selenium frame')
driver.switch_to.parent_frame() # 切换到上一层表单
driver.find_element_by_id('innercheck').click()
driver.switch_to.frame('frame2') # 根据name再次切入内层frame
driver.find_element_by_id('index-bn').click()
driver.switch_to.default_content() # 切换回主文档
driver.find_element_by_ta('frameinput').clear()
driver.switch_to.frame(driver.find_elements_by_tag_name('iframe')) # 通过webelement切换driver.find_element_by_id('innercheck').click()
time.sleep(3)
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中之后,我们便不能继续操作主文档的元素,这时如果想操作主文档内容,则需切回主文档。
driver.switch_to.default_content() # 切换到主文档中。
注意:很多人都会忘记这步操作
3、driver.switch_to.parent_frame() 切换到上一层表单
<html>
<iframe id="frame1">
<iframe id="frame2" / >
</iframe>
</html>
嵌套frame很少会遇到,如下frame1为外层,frame2嵌套在frame1中。我们进行切换操作如下:
a. 从主文档切到frame2,一层层切进去
driver.switch_to.frame("frame1")
driver.switch_to.frame("frame2")
b. 从frame2再切回frame1,selenium提供了一个方法能够从子frame切回到父frame,而不用我们切回主文档再切进来。
driver.switch_to.parent_frame() # 如果当前已是主文档,则无效果
parent_frame()这个相当于后退的方法,我们可以随意切换不同的frame。
selenium自动化测试入门 定位frame和iframe中的元素对象的更多相关文章
- 操作Frame和IFrame中页面元素
HTML <iframe> 标签 定义:iframe 元素会创建包含另外一个文档的内联框架(即行内框架). frame标签有frameset.frame.iframe三种,frameset ...
- Java中通过Selenium WebDriver定位iframe中的元素
转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 问题:有一些元素,无论是通过id或是xpath等等,怎么都定位不到. 分析:这很可能是因为你要定位 ...
- Java Selenium (十二) 操作弹出窗口 & 智能等待页面加载完成 & 处理 Iframe 中的元素
一.操作弹出窗口 原理 在代码里, 通过 Set<String> allWindowsId = driver.getWindowHandles(); 来获取到所有弹出浏览器的句柄, 然 ...
- Js/Jquery获取iframe中的元素
转载: Js/Jquery获取iframe中的元素 - - ITeye技术网站http://java-my-life.iteye.com/blog/1275205 在web开发中,经常会用到ifram ...
- js 获取iframe中的元素
今天要修改编辑器插件中的元素遇到的问题 jquery 在父窗口中获取iframe中的元素 1.Js代码 格式:$("#iframe的ID").contents().find(&qu ...
- Js/Jquery获取iframe中的元素 在Iframe中获取父窗体的元素方法
在web开发中,经常会用到iframe,难免会碰到需要在父窗口中使用iframe中的元素.或者在iframe框架中使用父窗口的元素 js 在父窗口中获取iframe中的元素 1. 格式:window ...
- 父窗口中获取iframe中的元素
js 在父窗口中获取iframe中的元素 1. 格式:window.frames["iframe的name值"].document.getElementById("ifr ...
- 获取父窗口元素或者获取iframe中的元素(相同域名下)
jquery方法 在父窗口中获取iframe中的元素 //方法1 $("#iframe的ID").contents().find("iframe中的元素"); ...
- 获取iframe中的元素
父窗口中获取iframe中的元素 var ifr = document.getElementById('suggustion').contentWindow.document.body; 在ifram ...
随机推荐
- HZOJ 旋转子段
作者的正解: 算法一:对于30%的数据: 直接枚举区间直接模拟,时间复杂度O(N3). 算法二:对于60%的数据:枚举旋转中心点,然后再枚举旋转的端点, 我们可以用O(n)的预处理求前缀和记录固定点, ...
- JavaScript 字符串转为数字
js中字符串转为数字主要4种,分别为转换函数,强制转换,js变量弱类型转换,正则表达式. 1.转换函数 JS中提供了两个转换函数parseInt()和parseFloat(),parseInt()将值 ...
- 洛谷P2672 推销员 题解 贪心
题目链接:https://www.luogu.org/problem/P2672 这道题目是贪心,贪心的思想是: 选择 \(m\) 户人家的最大疲劳值应该是以下两种方案中的较大值: 方案一:选择 \( ...
- java 两种进程创建方式比较
A extends Thread: 简单 不能再继承其他类了(Java单继承) 同份资源不共享 A implements Runnable:(推荐) 多个线程共享一个目标资源,适合多线程处理同一份资源 ...
- laravel 是怎么做到运行 composer dump-autoload 不清空 classmap 映射关系的呢?
我看 laravel 的 composer.json 文件 autoload 也没配置 vendor/autoload_classmap.php 里的映射关系,正常来说,如果没有配置,执行 compo ...
- PHP开源框架Laravel的安装与配置
编将带领大家一步步在Windows 7平台下搭建该框架: 工具/原料 windows 7 Composer Laravel最新框架 方法/步骤 1 安装composer.安装之前要确保目录:w ...
- [转]在Windows中安装Memcached
Memcached是一个高并发的内存键值对缓存系统,它的主要作用是将数据库查询结果,内容,以及其它一些耗时的计算结果缓存到系统内存中,从而加速Web应用程序的响应速度. Memcached最开始是作为 ...
- python的if判断
if 判断条件的时候,如果是多个条件一起进行判断,那么就需要逻辑运算符 并且-----------and 或者-----------or 非(取反)----not if 条件1 and 条件2 ...
- spring boot + thymeleaf 乱码问题
spring boot + thymeleaf 乱码问题 hellotrms 发布于 2017/01/17 15:27 阅读 1K+ 收藏 0 答案 1 开发四年只会写业务代码,分布式高并发都不会还做 ...
- flex布局属性说明
flex布局又称为盒子布局或弹性布局,用来为盒状模型提供最大的灵活性,任何一个容器都可以指定为 Flex 布局. 给父容器添加display: flex/inline-flex;属性,即可使容器内容采 ...