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基础教程之数字处理(math)模块详解
Mar 25 Python
在Python中进行自动化单元测试的教程
Apr 15 Python
Django自定义用户认证示例详解
Mar 14 Python
Django学习教程之静态文件的调用详解
May 08 Python
解决python报错MemoryError的问题
Jun 26 Python
Python笔记之工厂模式
Nov 20 Python
python实现人机五子棋
Mar 25 Python
Python 程序员必须掌握的日志记录
Aug 17 Python
详解查看Python解释器路径的两种方式
Oct 15 Python
python 模拟登陆github的示例
Dec 04 Python
python利用文件时间批量重命名照片和视频
Feb 09 Python
全网非常详细的pytest配置文件
Jul 15 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.ini中文版(2)
2006/10/09 PHP
BBS(php &amp; mysql)完整版(三)
2006/10/09 PHP
php 图片上添加透明度渐变的效果
2009/06/29 PHP
第4章 数据处理-php正则表达式-郑阿奇(续)
2011/07/04 PHP
php分页函数完整实例代码
2014/09/22 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
ThinkPHP 5.1 跨域配置方法
2019/10/11 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
配置Grunt的Task时通配符支持和动态生成文件名问题
2015/09/06 Javascript
从零开始做一个pagination分页组件
2017/03/15 Javascript
微信小程序 下拉菜单简单实例
2017/04/13 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
2018/01/03 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
从vue源码解析Vue.set()和this.$set()
2018/08/30 Javascript
js实现每日签到功能
2018/11/29 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
2019/04/17 Javascript
微信小程序组件传值图示过程详解
2019/07/31 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
python 将日期戳(五位数时间)转换为标准时间
2019/07/11 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
最热门的自我评价
2013/12/30 职场文书
护士检查书
2014/01/17 职场文书
施工安全责任书
2014/04/14 职场文书
离婚协议书怎么写
2014/09/12 职场文书
2015年控辍保学工作总结
2015/05/18 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript
MySQL和Oracle批量插入SQL的通用写法示例
2021/11/17 MySQL
分享几个简单MySQL优化小妙招
2022/03/31 MySQL