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

news2024/11/15 7:32:57

在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 webdriver

driver = 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 time

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = 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之间频繁切换,因为这可能会使代码难以理解和维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2055486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SFP光模块、gt口、PMD、PMA、PCS之间的关系

ZYNQ内部的GT&#xff08;高速收发器&#xff09;接口包含了PCS&#xff08;物理编码子层&#xff09;与PMA&#xff08;物理介质接入层&#xff09;。这两个层在高速数据传输中起着至关重要的作用。 PCS层&#xff08;物理编码子层&#xff09; PCS层位于协调子层&#xff0…

Ubuntu虚拟机服务器的搭建

01.VMware安装 略。 02.Ubuntu虚拟机安装 略。 03.配置Ubuntu虚拟机网络 参考视频&#xff1a; Ubutu虚拟机网络配置&#xff08;桥接&#xff09;https://www.bilibili.com/video/BV1bG411V72A/?spm_id_from333.999.0.0&vd_sourced1fd4bcc46805ab35cc8bbb5a8bf318f…

win11如何查看串口的名字

1、右击win然后点击设备管理器 2、点击端口然后右击串口点击属性 3、进入窗口后点击Port information即可看见Port name属性就是串口名字

uniapp/vue如何实现一个子表单及子表单作用

子表单是一个辅助表单或一个表&#xff0c;它允许在主表单中添加多个行式项目&#xff0c;以处理与主记录相关联的多个辅助项目或数据。子表单在多种应用场景中发挥着重要作用&#xff0c;特别是在需要处理一对多关系的数据时。 以下是对子表单的详细解析&#xff1a; 定义与特…

苍穹外卖day10

苍穹外卖day10 Spring Task订单状态定时处理WebSocket应用&#xff08;弹幕&#xff0c;网页聊天&#xff0c;体育实况更新&#xff0c;股票基金实时更新&#xff09; 来单题型代码实现需求分析 客户催单 Spring Task 链接: 在线生成器 在线生成器 订单状态定时处理 每分钟检…

木舟0基础学习Java的第二十五天(JavaWeb)

XML 概念和体系 XML指可扩展标记语言&#xff08;EXtensible Markup Language&#xff09; XML没有预定义标签 需要自定义标签 <标签></标签> XML特点 XML数据以纯文本格式存储 实现不同应用程序之间的数据通信 实现不同平台的数据通信 实现不同平台的数据共…

Linux------Cortex-A架构的处理器运行模型与其寄存器组

寄存器组分为 外设寄存器组 比如&#xff1a;和总线相连的io寄存器&#xff0c;usart配置寄存器&#xff0c;spi配置寄存器等等 内核寄存器组&#xff1a;R0-R15 CPSR SPSR一共18个寄存器组&#xff0c;内核寄存器组用来记录当前程序地址状态&#xff0c;当前执行指令等&a…

8月来得及|1000/660/880题45天带刷计划!

刷题不在于多&#xff0c;而在于精 你选的这几本题集没有问题&#xff0c;660题专门训练客观题&#xff0c;880题和1000题都是不错的综合性题集&#xff0c;特别适合在强化阶段进行刷题训练&#xff0c;但是问题是你做这么多题&#xff0c;也不一定能起到多好的作用。 刷题的…

Linux | 进程概念详解:冯诺依曼体系结构、进程基本概念、PCB、进程组织、fork()创建子进程、进程运行逻辑

文章目录 进程概念1、冯诺依曼体系结构2、进程2.1基本概念2.2描述进程-PCB2.3组织进程2.4查看进程2.5通过系统调用获取进程标识符2.6通过系统调用创建进程-fork初识头文件与返回值fork函数的调用逻辑和底层逻辑 进程概念 1、冯诺依曼体系结构 目前我们认识的计算机中&#xff…

dm 到 dm 的 HS 同步部署

一、数据库部署 完成两节点数据库部署并初始化&#xff0c;配置参数如下&#xff1a; 节点 192.168.2.132 192.168.2.133 数据库版本 DM8 DM8 实例名 DM1 DM2 端口号 5236 5236 数据文件路径 /home/dmdba/dmdata /home/dmdba/dmdata 二、 dmhs 部署 1. 部署…

户外无线麦克风哪个牌子好,领夹麦克风十大品牌排行榜推荐

​为了在数字时代的浪潮中有效传达自己的思想和感情&#xff0c;选择合适的声音工具变得尤为重要。无线领夹麦克风就是这样一种工具&#xff0c;它能够帮助我们在任何环境下都保持最佳的语音传递效果。经过慎重考虑和市场调研&#xff0c;我为大家推荐几款性能卓越且价格合理的…

测试报告----功能测试

目录 一、项目背景 二、项目功能 &#xff08;1&#xff09;页面1&#xff1a;用户注册 &#xff08;2&#xff09;页面2&#xff1a;登陆页面 &#xff08;3&#xff09;页面3&#xff1a;信息主页 &#xff08;4&#xff09;页面4&#xff1a;详情页面 ​编辑&#xf…

获取当前路由器的外网IP(WAN IP)

GPT-4o (OpenAI) 获取当前路由器的外网IP&#xff08;WAN IP&#xff09;可以通过以下几种方法&#xff1a; 1. 访问路由器管理页面&#xff1a; - 通常路由器的管理页面可以通过在浏览器中输入路由器的IP地址来访问&#xff08;例如&#xff0c;192.168.0.1 或 192.168.1…

接口基础知识9:详解response body(响应体)

课程大纲 一、定义 HTTP响应体&#xff08;HTTP Response Body&#xff09;&#xff1a;服务器返回给客户端的数据部分&#xff0c;‌它包含了服务器对客户端请求的响应内容&#xff08;如客户端请求的资源、客户端请求的执行结果&#xff09;。 与请求类似&#xff0c;HTTP …

使用python实现3D聚类图

实验记录&#xff0c;在做XX得分预测的实验中&#xff0c;做了一个基于Python的3D聚类图&#xff0c;水平有限&#xff0c;仅供参考。 一、以实现三个类别聚类为例 代码&#xff1a; import pandas as pd import numpy as np from sklearn.decomposition import PCA from sk…

【Prometheus】监控系统

目录 一.Prometheus概述 1.Prometheus的认识与了解 2.Prometheus的特点 3.Prometheus存储引擎 TSDB 的特点优势 4.Prometheus 的生态组件 Prometheus server Client Library Exporters Service Discovery Alertmanager Pushgateway Grafana 5.Prometheus 的…

二叉树(四)

一、二叉树的性质 二、练习 1.某二叉树共有399个节点&#xff0c;其中有199个度为2的节点&#xff0c;则二叉树中的叶子节点数为&#xff08; &#xff09;。 A.不存在这样的树 B.200 C.198 D.199 答案&#xff1a;B 参考二叉树的性质第三条 2.在具有2…

如何将系统/数据/程序从一个硬盘驱动器迁移到另一个硬盘驱动器

何时需要硬盘迁移软件 大多数时候&#xff0c;计算机用户考虑迁移硬盘的原因是&#xff1a; 旧硬盘太小&#xff0c;无法存储不断增加的数据&#xff0c;您需要将这些数据转移到更大的硬盘上。 您购买了比当前硬盘更大更快的新硬盘&#xff0c;并且想要将程序和数据移动到新硬…

数据库分库分表的介绍

为什么要分库分表 把存于一个库的数据分散到多个库中&#xff0c;把存于一个表的数据分散到多个表中。如果说读写分离是为了分散数据库读写操作压力&#xff0c;分库分表就是为了分散存储压力&#xff0c;一般情况下&#xff0c;单表数据量到达千万级别&#xff0c;就可以考虑…

怎么才能真正学好网络安全?一文搞懂网络安全体系

文章目录 前言 网络安全研发具体干什么&#xff1f;二进制安全具体干什么&#xff1f;网络渗透具体干什么&#xff1f;网络渗透方向的工作有下面几个方向&#xff1a;网络安全的学习路线网络安全的学习路线大纲网络安全初体验学习方法 如何入门学习网络安全【黑客】 【----帮助…