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 while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
在Python的struct模块中进行数据格式转换的方法
Jun 17 Python
梯度下降法介绍及利用Python实现的方法示例
Jul 12 Python
Python开发的十个小贴士和技巧及长常犯错误
Sep 27 Python
selenium+python自动化测试环境搭建步骤
Jun 03 Python
Python实现word2Vec model过程解析
Dec 16 Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
如何清空python的变量
Jul 05 Python
Python request post上传文件常见要点
Nov 20 Python
Django中如何用xlwt生成表格的方法步骤
Jan 31 Python
python 利用 PIL 将数组值转成图片的实现
Apr 12 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数组循环操作详细介绍 附实例代码
2013/02/03 PHP
PHP容易忘记的知识点分享
2013/04/30 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
javascript function调用时的参数检测常用办法
2010/02/26 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
jQuery的css()方法用法实例
2014/12/24 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
Node.js 使用流实现读写同步边读边写功能
2017/09/11 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
解决layui调用自定义方法提示未定义的问题
2019/09/14 Javascript
vue 实现input表单元素的disabled示例
2019/10/28 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
Python基于回溯法子集树模板解决全排列问题示例
2017/09/07 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
Python处理命令行参数模块optpars用法实例分析
2018/05/31 Python
Python查找文件中包含中文的行方法
2018/12/19 Python
python常用函数与用法示例
2019/07/02 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
python模块和包的应用BASE_PATH使用解析
2019/12/14 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
HTML5的革新 结构之美
2011/06/20 HTML / CSS
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
2014年国庆晚会主持词
2014/09/19 职场文书
会议欢迎词
2015/01/23 职场文书
2015年教研室工作总结范文
2015/05/23 职场文书
交通安全主题班会
2015/08/12 职场文书
初中思品教学反思
2016/02/20 职场文书
Spring实现内置监听器
2021/07/09 Java/Android
详解Python+OpenCV绘制灰度直方图
2022/03/22 Python