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 31 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
pandas修改DataFrame列名的方法
Apr 08 Python
Python3 中把txt数据文件读入到矩阵中的方法
Apr 27 Python
python中cPickle类使用方法详解
Aug 27 Python
python re正则匹配网页中图片url地址的方法
Dec 20 Python
Django 查询数据库并返回页面的例子
Aug 12 Python
利用python-docx模块写批量生日邀请函
Aug 26 Python
tf.concat中axis的含义与使用详解
Feb 07 Python
python随机模块random使用方法详解
Feb 14 Python
无惧面试,带你搞懂python 装饰器
Aug 17 Python
教你怎么用Python操作MySql数据库
May 31 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封装的验证码类分享
2017/02/26 PHP
基于jQuery的简单九宫格实现代码
2012/08/09 Javascript
Eval and new funciton not the same thing
2012/12/27 Javascript
Javascript 实现的数独解题算法网页实例
2013/10/15 Javascript
js获取通过ajax返回的map型的JSONArray的方法
2014/01/09 Javascript
从JQuery源码分析JavaScript函数的apply方法与call方法
2014/09/25 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
2016/08/28 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
2016/12/08 Javascript
Bootstrap CSS布局之列表
2016/12/15 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
AngularJS集合数据遍历显示的实例
2017/12/27 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
生成无限制的微信小程序码的示例代码
2019/09/20 Javascript
详解为element-ui的Select和Cascader添加弹层底部操作按钮
2020/02/07 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
python re模块和正则表达式
2021/03/24 Python
社区网格化管理实施方案
2014/03/21 职场文书
岗位廉政承诺书
2014/03/27 职场文书
致共产党员倡议书
2014/04/16 职场文书
水电站项目建议书
2014/05/12 职场文书
大学生志愿者活动总结
2014/06/27 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
自查自纠工作总结
2014/10/15 职场文书
大学生实习推荐信
2015/03/27 职场文书
高中政治教师教学反思
2016/02/23 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
Python os和os.path模块详情
2022/04/02 Python