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 ...
随机推荐
- vue init定制团队模板使用方法
每次做项目都要自己搭建项目目录,或者换了公司就的重新搭建项目目录,是不是很麻烦呢?有没有想过一次性把项目目录搭建好,以后直接用呢?你首先想到的可能是复制自己原来的项目,然后删除.修改等等.然而有个更方 ...
- selenium webdriver学习(七)------------如何处理alert、confirm、prompt对话框( 转)
selenium webdriver学习(七)------------如何处理alert.confirm.prompt对话框 博客分类: Selenium-webdriver alertpromptc ...
- caffe 下一些参数的设置
weight_decay防止过拟合的参数,使用方式:1 样本越多,该值越小2 模型参数越多,该值越大一般建议值:weight_decay: 0.0005 lr_mult,decay_mult关于偏置与 ...
- 分布式TensorFlow集群local server使用详解
通过local server理解分布式TensorFlow集群的应用与实现. 简介 TensorFlow从0.8版本开始,支持分布式集群,并且自带了local server方便测试. Local ...
- H3C 10BASE-T线缆和接口
- element-ui css 文件加载 失败(https://unpkg.com/element-ui/lib/theme-chalk/index.css,加载失败)
在main.js文件引入 import Vue from 'vue'; import Element from 'element-ui'; import 'element-ui/lib/theme ...
- H3C 配置基本ACL
- Vue之webpack的安装与配置及其简单应用
一.文件结构 二.index.html <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- InetAddress与Socket
InetAddress:构造方法私有,不能直接创建对象. InetAddress getByName(String host):在给定主机名的情况下确定主机的ip地址. InetAddress get ...
- while循环&CPU占用率高问题深入分析与解决方案
直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方.使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果, ...