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 相关文章推荐
urllib2自定义opener详解
Feb 07 Python
python遍历文件夹并删除特定格式文件的示例
Mar 05 Python
python实现在无须过多援引的情况下创建字典的方法
Sep 25 Python
Python实现竖排打印传单手机号码易撕条
Mar 16 Python
pycham查看程序执行的时间方法
Nov 29 Python
Python中collections模块的基本使用教程
Dec 07 Python
python直接获取API传递回来的参数方法
Dec 17 Python
用python画一只可爱的皮卡丘实例
Nov 21 Python
python pprint模块中print()和pprint()两者的区别
Feb 10 Python
python使用paramiko实现ssh的功能详解
Mar 06 Python
浅谈Python中range与Numpy中arange的比较
Mar 11 Python
如何用Python绘制3D柱形图
Sep 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
基于mysql的论坛(5)
2006/10/09 PHP
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
php数字游戏 计算24算法
2012/06/10 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
2017/08/15 PHP
PHP设计模式之原型设计模式原理与用法分析
2018/04/25 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
2019/04/02 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
javascript URL锚点取值方法
2009/02/25 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
js实现的简单radio背景颜色选择器代码
2015/08/18 Javascript
js设置和获取自定义属性的方法
2016/10/20 Javascript
Node.js中你不可不精的Stream(流)
2018/06/08 Javascript
vue中使用codemirror的实例详解
2018/11/01 Javascript
微信小程序API—获取定位的详解
2019/04/30 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
JavaScript中的Proxy对象
2020/11/27 Javascript
python实现将元祖转换成数组的方法
2015/05/04 Python
Python单链表简单实现代码
2016/04/27 Python
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
2017/07/20 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
Python reduce函数作用及实例解析
2020/05/08 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
2020/10/15 Python
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
幼儿园教学管理制度
2014/02/04 职场文书
电大会计学自我鉴定
2014/02/06 职场文书
企业承诺书怎么写
2014/05/24 职场文书
如何写股份合作协议书
2014/09/11 职场文书
python面向对象版学生信息管理系统
2021/06/24 Python