frame/iframe多表单切换
2024-08-29 22:14:30
应用场景:
在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。
frame.html
<html>
<head>
<link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.mincss" rel="stylesheet" />
<script type="text/javascript">$(document).ready(function(){});</script>
</head>
<body>
<div class="row-fluid">
<div class="span10 well">
<h3>frame</h3>
<iframe id="if" name="nf" src="http://www.baidu.com" width="1600" height="800"></iframe>
</div>
</div>
</body>
<script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></script>
</html>
在上面的html代码中,我通过iframe表单嵌入一个百度页面,用浏览器打开后如图所示:
这时候直接定位页面上的百度输入框一定会报错:找不到元素。因此可以使用switch_to.frame()先找到frame.html中的
#导包
from selenium import webdriver
from time import sleep
#定义浏览器句柄
driver=webdriver.Chrome()
#打开本地frame.html
url="file:///C:/Users/Charseki/Desktop/Web%E8%87%AA%E5%8A%A8%E5%8C%96/iframe%E5%A4%9A%E8%A1%A8%E5%8D%95%E5%88%87%E6%8D%A2/frame.html"
driver.get(url)
#窗口最大化
driver.maximize_window()
#直接去拿百度输入框元素
#driver.find_element_by_xpath('//input[@id="kw"]')
#发现报错,因为元素在iframe表单里面
#正确的方法:进入到iframe表单,再去获取百度输入框元素
driver.switch_to.frame(driver.find_element_by_xpath('//iframe[contains(@src,"www.baidu.com")]'))
driver.find_element_by_xpath('//input[@id="kw"]').send_keys("可以操作元素了")
#点击“百度一下”按钮
driver.find_element_by_xpath('//input[@id="su"]').click()
sleep(3)
driver.quit()
switch_to.frame()默认可以直接取表单的id或name属性。如果iframe没有可以用的id和name属性,则可以通过下面的方式进行定位。
#先通过xpath定位到iframe
xf=driver.find_element_by_xpath('//*[@class="if"]')
#再将定位对象传给switch_to.frame()方法
driver.switch_to.frame(xf)
......
driver.switch_to.parent_frame()
如果完成了在当前表单上的操作,则可以通过switch_to.parent_frame()方法跳出当前一级表单。该方法默认对应于离它最近的switch_to.frame()方法。除此之外,在进入多级表单的情况下,还可以通过switch_to.default_content()跳回最外层的页面。
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Talk is cheap,show me the code.
最新文章
- java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(2)
- 关于WEB Service&;WCF&;WebApi实现身份验证之WCF篇(1)
- 学习OpenStack之 (0):基础知识
- Vim -&;gt; 边确认边查找替换
- [原创]ASM动态修改JAVA函数之函数字节码初探
- centos生成公钥私钥 securecrt通过公钥访问服务器 winscp通过公钥访问服务器
- C++函数式编程实现牛顿法
- java学习之—递归实现二分查找法
- Faiss安装
- css学习1
- strlen的容易tle情况
- 分类器评估方法:精确度-召回率-F度量(precision-recall-F_measures)
- js跳出for循环
- python3+requests:post请求四种传送正文方式(详解)
- js闭包的应用
- 用string存取二进制数据
- Linux上安装MySQL及其基础配置
- 模仿w3c school的示例导航栏
- 【java】AES加密解密|及Base64的使用
- Beam概念学习系列之Pipeline Runners
热门文章
- ubuntu 16.04安装mysql server入门
- Vue2.0 -- 钩子函数/ 过度属性/常用指令/以及Vue-resoure发送请求
- 【NLP面试QA】激活函数与损失函数
- python文件调用方法
- Lack of free swap space on Zabbix server
- [HOJ2662]Pieces Assignment<;状态压缩dp>;
- 俩个对象的hashCode()相同,则equals()也一定为true,对吗?
- Ptask公告
- C 旅店
- 面试刷题32:你对tomcat做了哪些性能调优?