应用场景:

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

最新文章

  1. java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(2)
  2. 关于WEB Service&amp;WCF&amp;WebApi实现身份验证之WCF篇(1)
  3. 学习OpenStack之 (0):基础知识
  4. Vim -&amp;gt; 边确认边查找替换
  5. [原创]ASM动态修改JAVA函数之函数字节码初探
  6. centos生成公钥私钥 securecrt通过公钥访问服务器 winscp通过公钥访问服务器
  7. C++函数式编程实现牛顿法
  8. java学习之—递归实现二分查找法
  9. Faiss安装
  10. css学习1
  11. strlen的容易tle情况
  12. 分类器评估方法:精确度-召回率-F度量(precision-recall-F_measures)
  13. js跳出for循环
  14. python3+requests:post请求四种传送正文方式(详解)
  15. js闭包的应用
  16. 用string存取二进制数据
  17. Linux上安装MySQL及其基础配置
  18. 模仿w3c school的示例导航栏
  19. 【java】AES加密解密|及Base64的使用
  20. Beam概念学习系列之Pipeline Runners

热门文章

  1. ubuntu 16.04安装mysql server入门
  2. Vue2.0 -- 钩子函数/ 过度属性/常用指令/以及Vue-resoure发送请求
  3. 【NLP面试QA】激活函数与损失函数
  4. python文件调用方法
  5. Lack of free swap space on Zabbix server
  6. [HOJ2662]Pieces Assignment&lt;状态压缩dp&gt;
  7. 俩个对象的hashCode()相同,则equals()也一定为true,对吗?
  8. Ptask公告
  9. C 旅店
  10. 面试刷题32:你对tomcat做了哪些性能调优?