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实现跨文件全局变量的方法
Jul 07 Python
Django入门使用示例
Dec 12 Python
python实现快速排序的示例(二分法思想)
Mar 12 Python
Python pymongo模块用法示例
Mar 31 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
pandas取出重复数据的方法
Jul 04 Python
django foreignkey外键使用的例子 相当于left join
Aug 06 Python
Python3常见函数range()用法详解
Dec 30 Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 Python
Python filter()及reduce()函数使用方法解析
Sep 05 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
May 22 Python
Python中else的三种使用场景
Jun 16 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 addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
PHP中require和include路径问题详解
2014/12/25 PHP
PHP使用file_get_content设置头信息的方法
2016/02/14 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
2014/09/06 Javascript
JavaScript生成二维码图片小结
2015/12/27 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
2017/11/27 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
2018/08/20 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
JS实现悬浮球只在一侧滑动并且是横屏状态下
2020/08/19 Javascript
[02:11]DOTA2上海特级锦标赛主赛事第二日RECAP
2016/03/04 DOTA
Python 文件重命名工具代码
2009/07/26 Python
python实现批量下载新浪博客的方法
2015/06/15 Python
python先序遍历二叉树问题
2017/11/10 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
对numpy中数组元素的统一赋值实例
2018/04/04 Python
Sanic框架配置操作分析
2018/07/17 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
2018/12/21 Python
python安装scipy的步骤解析
2019/09/28 Python
Python中zip()函数的解释和可视化(实例详解)
2020/02/16 Python
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
优秀的毕业生的自我评价
2013/12/12 职场文书
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
司考复习计划
2015/01/19 职场文书
会议通知格式范文
2015/04/15 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
导游词之泰山玉皇顶
2019/12/23 职场文书
python for循环赋值问题
2021/06/03 Python