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网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 Python
python fabric使用笔记
May 09 Python
在Linux系统上安装Python的Scrapy框架的教程
Jun 11 Python
Python脚本实现虾米网签到功能
Apr 12 Python
python实现批量修改文件名代码
Sep 10 Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 Python
Python KMeans聚类问题分析
Feb 23 Python
pytorch 彩色图像转灰度图像实例
Jan 13 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
Apr 24 Python
python爬虫实例之获取动漫截图
May 31 Python
Python ConfigParser模块的使用示例
Oct 12 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Apr 13 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
Syphon 秘笈
2021/03/03 冲泡冲煮
神盾加密解密教程(三)PHP 神盾解密工具
2014/06/08 PHP
PHP滚动日志的代码实现
2015/06/10 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
PHP中-&gt;和=&gt;的含义及使用示例解析
2020/08/06 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
2013/07/08 Javascript
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
jQuery扩展_动力节点Java学院整理
2017/07/05 jQuery
用JS实现简单的登录验证功能
2017/07/28 Javascript
浅析前端路由简介以及vue-router实现原理
2018/06/01 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
js实现星星海特效的示例
2020/09/28 Javascript
ES11新增的这9个新特性,你都掌握了吗
2020/10/15 Javascript
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
Keras设置以及获取权重的实现
2020/06/19 Python
Python字典dict常用方法函数实例
2020/11/09 Python
python录音并调用百度语音识别接口的示例
2020/12/01 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
python爬虫线程池案例详解(梨视频短视频爬取)
2021/02/20 Python
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
int和Integer有什么区别
2013/05/25 面试题
《音乐之都维也纳》教学反思
2014/04/16 职场文书
公司承诺书范文
2014/05/19 职场文书
特教教师先进事迹
2014/05/21 职场文书
公司总经理岗位职责范本
2014/08/15 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python
详解nginx location指令
2022/01/18 Servers