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实现划词翻译
Apr 23 Python
Python字符串处理之count()方法的使用
May 18 Python
Python使用matplotlib绘制动画的方法
May 20 Python
python实现网站的模拟登录
Jan 04 Python
python访问mysql数据库的实现方法(2则示例)
Jan 06 Python
Python实现读取json文件到excel表
Nov 18 Python
python3中函数参数的四种简单用法
Jul 09 Python
python3实现爬取淘宝美食代码分享
Sep 23 Python
python cv2.resize函数high和width注意事项说明
Jul 05 Python
python中_del_还原数据的方法
Dec 09 Python
python函数的两种嵌套方法使用
Apr 02 Python
pd.DataFrame中的几种索引变换的实现
Jun 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
php下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
php类常量用法实例分析
2015/07/09 PHP
Centos PHP 扩展Xchche的安装教程
2016/07/09 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
PHP进阶学习之命名空间基本用法分析
2019/06/18 PHP
一个不错的用JavaScript实现的UBB编码函数
2007/03/09 Javascript
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
JavaScript中SQL语句的应用实现
2010/05/04 Javascript
浏览器打开层自动缓慢展开收缩实例代码
2013/07/04 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
一个js过滤空格的小函数
2014/10/10 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
2015/10/20 Javascript
JS实现网页标题随机显示名人名言的方法
2015/11/03 Javascript
jquery 获取索引值在一定范围的列表方法
2018/01/25 jQuery
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS TNC
2018/03/30 DOTA
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
python基础教程之获取本机ip数据包示例
2014/02/10 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
Python基于模块Paramiko实现SSHv2协议
2020/04/28 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
浅析Python 序列化与反序列化
2020/08/05 Python
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
护理专业推荐信
2013/11/07 职场文书
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
雷锋电影观后感
2015/06/10 职场文书
2019军训心得体会
2019/06/27 职场文书
2019事业单位个人工作总结范文
2019/08/26 职场文书
go语言中GOPATH GOROOT的作用和设置方式
2021/05/05 Golang
MySQL中order by的使用详情
2021/11/17 MySQL
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers