当前位置: 首页 > news >正文

Selenium实战:深度解析Python中嵌套Frame与iFrame的定位与切换技巧,解决Selenium定位不到的问题

在Web自动化测试中,处理网页中的Frame和iFrame是常见的挑战之一。这些元素在网页中扮演着承载独立HTML文档的角色,使得直接定位或操作其中的元素变得复杂。Python的Selenium库提供了强大的工具来应对这些挑战,本文将详细介绍如何使用Selenium在Python中处理嵌套Frame和iFrame,包括通过id、name、索引和WebElement对象切换Frame,以及如何在多层iFrame之间切换并回到默认页面的方法。

一、Frame与iFrame的区别

首先,我们需要明确Frame与iFrame的区别。尽管它们的功能相似,都用于在HTML页面中嵌入另一个HTML页面,但iFrame是HTML5之前的Frame的替代品,提供了更多的灵活性和安全性。Frame通常作为<frameset>的一部分出现,而iFrame则是一个独立的标签。
frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定位而言是一样的,selenium有一组方法对frame进行操作。

当遇到嵌套的frameiframe时,你需要逐层切换。首先切换到最外层的frameiframe,然后在其内部继续寻找并切换到下一层的frameiframe,以此类推。

 

二、切换到Frame或iFrame

在Selenium中,我们需要先切换到目标Frame或iFrame,然后才能定位和操作其中的元素。Selenium提供了几种方法来切换上下文:

1. 通过ID或Name切换(常用)

如果Frame或iFrame有明确的ID或Name属性,我们可以直接使用switch_to.frame()方法并传入相应的ID或Name字符串。

from selenium import webdriverdriver = webdriver.Chrome()
driver.get("你的网页URL")# 通过ID切换
driver.switch_to.frame("frameId")# 或者通过Name切换
driver.switch_to.frame("frameName")

2. 通过索引切换

如果页面中有多个Frame或iFrame,且没有明确的ID或Name,我们可以使用索引来切换。索引从0开始。

# 切换到第一个Frame
driver.switch_to.frame(0)# 切换到第二个Frame
driver.switch_to.frame(1)

3. 通过WebElement对象切换

如果我们已经通过某种方式(如find_element)定位到了Frame或iFrame的WebElement对象,也可以直接传入该对象进行切换。

frame = driver.find_element(By.TAG_NAME,"iframe")
driver.switch_to.frame(frame)
#或者可以这么写
driver.switch_to.frame(driver.find_element(By.TAG_NAME,"iframe"))

三、处理多层iFrame

在复杂的网页中,iFrame可能会嵌套在其他iFrame中。为了定位和操作最内层的iFrame中的元素,我们需要逐层切换。

当遇到嵌套的frameiframe时,你需要逐层切换。首先切换到最外层的frameiframe,然后在其内部继续寻找并切换到下一层的frameiframe,以此类推。

# 假设有两层iFrame
driver.switch_to.frame("outerFrameId")
driver.switch_to.frame("innerFrameId")# 现在可以操作最内层的iFrame中的元素了
# ...# 切换回默认页面(最外层的文档)
driver.switch_to.default_content()# 如果需要再次进入外层iFrame
driver.switch_to.frame("outerFrameId")

四、回到默认页面

在完成Frame或iFrame中的操作后,我们通常需要切换回默认页面(即最外层的文档),以便继续其他操作或关闭浏览器。

driver.switch_to.default_content()

五、案例

这里有一个网站,这个网站有frame标签,以这个网站为例首页 - 流媒体网|IPTV、OTTTV、智能电视、互联网电视、互动电视等电视新媒体行业信息资讯门户11

先定位到iframe,然后定位到 资料 这个标签,获取其中的文字

import timefrom selenium import webdriver
from selenium.webdriver.common.by import Bybrowser = webdriver.Chrome()
browser.get('http://www.lmtw.com/search.php?show=title%2Ckeyboard%2Cwriter&searchget=1&keyboard=%E7%94%B5%E8%A7%86')# 将frame切到要获取的标签,参数是,frame标签里面的id,或者name
browser.switch_to.frame('xxx')
#等待10秒,确保frame已经加载完成
time.sleep(10)
# 进入frame后定位到 资料 标签
mess = browser.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/a[4]')
# 输出标签中的信息
print(mess.text)
# 退出浏览器
browser.close()

六、注意事项

  • 在进行Frame或iFrame切换时,确保目标Frame或iFrame已经加载完成,否则可能会引发异常。
  • 切换Frame或iFrame后,所有的定位和操作都将在该Frame或iFrame的上下文中进行,直到你切换回默认页面或另一个Frame/iFrame。
  • 尽量避免在多层嵌套的Frame/iFrame之间频繁切换,因为这可能会使代码难以理解和维护。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 掌握Jenkins自动化部署:从代码提交到自动上线的全流程揭秘
  • 国内服务器安装Docker提示Failed to connect to download.docker.com port 443的解决方案
  • 使用 Hugging Face 和 Milvus 构建 RAG 系统
  • 机器学习——第十二章计算学习理论
  • 笔记(day21) 多线程以及锁的概念(超级完整版)
  • ASPICE标准与汽车网络安全:协同确保软件质量与系统安全
  • pycharm windows/mac 指定多版本python
  • 思科OSPF动态路由配置8
  • 《Ubuntu22.04环境下的ROS2学习笔记2》
  • 【数学建模】趣味数学模型——等额还款数学模型
  • 【精选】基于Python大型购物商城系统(京东购物商城,淘宝购物商城,拼多多购物商城爬虫系统)
  • 信贷域——信贷基础概念
  • 【联想电脑】:使用拓展坞后转接HDMI,无法识别显示屏
  • CentOS 7的安装流程
  • 技术分享-商城篇-购物支付(十一)
  • 【面试系列】之二:关于js原型
  • android图片蒙层
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • JavaScript类型识别
  • maven工程打包jar以及java jar命令的classpath使用
  • vue自定义指令实现v-tap插件
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 前端学习笔记之观察者模式
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 智能合约开发环境搭建及Hello World合约
  • 回归生活:清理微信公众号
  • 如何用纯 CSS 创作一个货车 loader
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 通过调用文摘列表API获取文摘
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​比特币大跌的 2 个原因
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #AngularJS#$sce.trustAsResourceUrl
  • #window11设置系统变量#
  • $.ajax()方法详解
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • .bashrc在哪里,alias妙用
  • .net core控制台应用程序初识
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET开发不可不知、不可不用的辅助类(一)
  • .net快速开发框架源码分享
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .net下简单快捷的数值高低位切换
  • .Net小白的大学四年,内含面经
  • .NET值类型变量“活”在哪?
  • .NET中winform传递参数至Url并获得返回值或文件
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • /bin/bash^M: bad interpreter: No such file or directory
  • @ComponentScan比较
  • @Controller和@RestController的区别?
  • @Pointcut 使用