selenium学习教程之定位以及切换frame(iframe)


Posted in Python onJanuary 04, 2021

总有人看不明白,以防万一,先在开头大写加粗说明一下:

frameset不用切,frame需层层切!

很多人在用selenium定位页面元素的时候会遇到定位不到的问题,明明元素就在那儿,用firebug也可以看到,就是定位不到,这种情况很有可能是frame在搞鬼(原因之一,改天专门说说定位不到元素,可能的一些原因及处理办法)。

frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定位而言是一样的,selenium有一组方法对frame进行操作。

1.怎么切到frame中(switch_to.frame())

selenium提供了switch_to.frame()方法来切换frame

switch_to.frame(reference)

不得不提到switch_to_frame(),很多人在这样写的时候会发现,这句话被划上了删除线,原因是这个方法已经out了,之后很有可能会不支持,建议的写法是switch_to.frame()

reference是传入的参数,用来定位frame,可以传入id、name、index以及selenium的WebElement对象,假设有如下HTML代码 index.html:

<html lang="en">
<head>
 <title>FrameTest</title>
</head>
<body>
<iframe src="a.html" id="frame1" name="myframe"></iframe>
</body>
</html>

想要定位其中的iframe并切进去,可以通过如下代码:

from selenium import webdriver
driver = webdriver.Firefox()
driver.switch_to.frame(0) # 1.用frame的index来定位,第一个是0
# driver.switch_to.frame("frame1") # 2.用id来定位
# driver.switch_to.frame("myframe") # 3.用name来定位
# driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) # 4.用WebElement对象来定位

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

  • index从0开始,传入整型参数即判定为用index定位,传入str参数则判定为用id/name定位
  • WebElement对象,即用find_element系列方法所取得的对象,我们可以用tag_name、xpath等来定位frame对象

举个栗子:

<iframe src="myframetest.html" />

用xpath定位,传入WebElement对象:

driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@src,'myframe')]"))

2.从frame中切回主文档(switch_to.default_content())

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

driver.switch_to.default_content()

3.嵌套frame的操作(switch_to.parent_frame())

有时候我们会遇到嵌套的frame,如下:

<html>
 <iframe id="frame1">
  <iframe id="frame2" / >
 </iframe>
</html>

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

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

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

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

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

所以只要善用以下三个方法,遇到frame分分钟搞定:

driver.switch_to.frame(reference)
driver.switch_to.parent_frame()
driver.switch_to.default_content()

补充

另外补充一下,之前曾看到过用点分法来切入嵌套frame的方法,但我试验之后发现并不能定位到frame,如果有同学可以成功,麻烦留言告知一下,用法如下:

driver.switch_to.frame('frame1.0.frame3')

据说以上代码可以切到 “frame1” 下的 “第一个frame” 下的 “frame3” 中。

总结

到此这篇关于selenium学习教程之定位以及切换frame(iframe)的文章就介绍到这了,更多相关selenium定位及切换frame(iframe)内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用python装饰器验证配置文件示例
Feb 24 Python
Python中return语句用法实例分析
Aug 04 Python
Python通过matplotlib画双层饼图及环形图简单示例
Dec 15 Python
使用Python和xlwt向Excel文件中写入中文的实例
Apr 21 Python
Python多线程原理与用法详解
Aug 20 Python
python assert的用处示例详解
Apr 01 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
May 23 Python
Python登录系统界面实现详解
Jun 25 Python
Python API len函数操作过程解析
Mar 05 Python
python3实现将json对象存入Redis以及数据的导入导出
Jul 16 Python
Django执行源生mysql语句实现过程解析
Nov 12 Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 Python
python自动打开浏览器下载zip并提取内容写入excel
Jan 04 #Python
python Scrapy框架原理解析
Jan 04 #Python
如何用 Python 处理不平衡数据集
Jan 04 #Python
Python创建简单的神经网络实例讲解
Jan 04 #Python
python实现跨年表白神器--你值得拥有
Jan 04 #Python
Python列表元素删除和remove()方法详解
Jan 04 #Python
python3列表删除大量重复元素remove()方法的问题详解
Jan 04 #Python
You might like
PHP 如何向 MySQL 发送数据
2006/10/09 PHP
php循环输出数据库内容的代码
2008/05/24 PHP
php 时间计算问题小结
2009/01/04 PHP
php生成图片验证码-附五种验证码
2015/08/19 PHP
showModelessDialog()使用详解
2006/09/07 Javascript
表单内同名元素的控制
2006/11/22 Javascript
javascript闭包的高级使用方法实例
2013/07/04 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
JS实现图片放大缩小的方法
2017/02/15 Javascript
js实现五星评价功能
2017/03/08 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
微信小程序 支付功能(前端)的实现
2017/05/24 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
2017/11/15 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
js实现图片跟随鼠标移动效果
2019/10/16 Javascript
JS遍历树层级关系实现原理解析
2020/08/31 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
使用Python对Csv文件操作实例代码
2017/05/12 Python
python读取TXT每行,并存到LIST中的方法
2018/10/26 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
python递归法解决棋盘分割问题
2019/07/17 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
10条PHP编程习惯
2014/05/26 面试题
CLR与IL分别是什么含义
2016/08/23 面试题
毕业生就业自荐书
2013/12/15 职场文书
文秘大学生求职信
2014/02/25 职场文书
会议主持词
2014/03/17 职场文书