使用Selenium自动化测试定位iframe以及修改img标签的display属性值
在使用 Selenium 进行自动化测试时,处理 iframe
是一个常见问题。当页面中出现 iframe
时,需要先切换到该 iframe
内部,才能正常定位和操作其中的元素。以下是处理 iframe
的步骤和示例代码:
步骤
- 切换到
iframe
:使用switch_to.frame()
方法切换到目标 iframe。 - 定位和操作 iframe 中的元素:在切换到
iframe
后,可以使用find_element
方法定位元素并进行操作。 - 切换回主文档:使用
switch_to.default_content()
方法切换回主文档,以便继续操作页面中的其他元素。
示例代码
以下是一个完整的示例,假设在点击一个按钮后会出现一个 iframe
:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time# 设置 WebDriver 的路径(例如 ChromeDriver)
driver_path = '/path/to/chromedriver' # 请替换为你的 chromedriver 路径# 启动 Chrome 浏览器
driver = webdriver.Chrome(executable_path=driver_path)# 打开目标网站
driver.get('https://example.com') # 请替换为目标网站的 URL# 等待并点击一个按钮,假设这会加载出一个 iframe
button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'myButton')) # 替换为实际按钮的选择器
)
button.click()# 等待 iframe 加载
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'iframe')) # 等待 iframe 加载
)# 切换到 iframe,假设这里使用索引 0 来选择第一个 iframe
driver.switch_to.frame(0)# 现在可以定位并操作 iframe 内部的元素
input_field = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'iframeInput')) # 替换为实际 iframe 内部元素的选择器
)
input_field.send_keys('输入内容')# 还可以点击按钮等其他操作
submit_button = driver.find_element(By.ID, 'iframeSubmit') # 替换为实际按钮的选择器
submit_button.click()# 处理完成后可以切换回主文档
driver.switch_to.default_content()# 继续操作主文档中的其他元素
# ...# 如果需要关闭浏览器
driver.quit()
关键点说明
-
切换到
iframe
:- 使用
driver.switch_to.frame()
方法切换到指定的iframe
。可以使用frame
的索引(如0
,表示第一个iframe
)、name
属性,或持有WebElement
对象(如iframe_element
)进行切换。
- 使用
-
等待条件:
- 使用
WebDriverWait
和expected_conditions
来有效等待元素加载,这样可以提高稳定性。
- 使用
-
切换回主文档:
- 在完成对
iframe
中元素的操作后,使用driver.switch_to.default_content()
切换回主文档,以便继续操作其他页面元素。
- 在完成对
-
处理嵌套 iframe:
- 如果
iframe
中还有其他iframe
,则需要多层次地切换。
- 如果
同时可以使用 Python 的 Selenium 库来修改网页元素的 display
属性,使其在 block
和 none
之间切换。比如CSNDN上面的点赞,就是由两个img标签构成(未点赞和点赞两个状态的图标),一个img标签的display属性是block,另一个img标签的display属性是none。以下是一个简单的示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time# 设置 WebDriver 的路径(例如 ChromeDriver)
driver_path = '/path/to/chromedriver' # 请替换为你的 chromedriver 路径# 启动 Chrome 浏览器
driver = webdriver.Chrome(executable_path=driver_path)# 打开一个网页(例如本地 HTML 文件)
driver.get('file:///path/to/your/html/file.html') # 请替换为你的 HTML 文件路径# 找到要操作的元素
element = driver.find_element(By.ID, 'myDiv')# 初始显示状态
print(f"初始 display 属性: {element.value_of_css_property('display')}")# 切换显示状态
def toggle_display():if element.value_of_css_property('display') == 'none':driver.execute_script("arguments[0].style.display = 'block';", element)else:driver.execute_script("arguments[0].style.display = 'none';", element)# 切换显示状态几次
for _ in range(5):toggle_display()print(f"当前 display 属性: {element.value_of_css_property('display')}")time.sleep(1)# 关闭浏览器
driver.quit()
在这个示例中:
- 使用
webdriver.Chrome
启动 Chrome 浏览器,并打开一个本地 HTML 文件。 - 使用
find_element
找到要操作的元素(通过 ID)。 - 使用
value_of_css_property
获取当前的display
属性。 - 使用
driver.execute_script
执行 JavaScript 来切换display
属性。 - 循环切换显示状态,并在每次切换后打印当前的
display
属性。
相关文章:

使用Selenium自动化测试定位iframe以及修改img标签的display属性值
在使用 Selenium 进行自动化测试时,处理 iframe 是一个常见问题。当页面中出现 iframe 时,需要先切换到该 iframe 内部,才能正常定位和操作其中的元素。以下是处理 iframe 的步骤和示例代码: 步骤 切换到 iframe:使用…...

DAY13
面试遇到的新知识点 char str[10],只有10个字符的空间,但是只能存储9个字符,最后一个字符用来存储终止符\0 strlen只会计算\n,不会计算\0 值传递: void test2(char * str) {str "hello\n"; }int main() {char * str;test2(str);…...

WPF 自定义用户控件(Content根据加减按钮改变值)
前端代码: <UserControl.Resources><Style x:Key"Num_Button_Style" TargetType"Button"><Setter Property"MinWidth" Value"30" /><Setter Property"Height" Value"35" />&l…...

CPU、GPU、显卡
CPU VS GPUCPU(Central Processing Unit),中央处理器GPU(Graphics Processing Unit),图形处理单元GPU 的技术演变CUDA(Compute Unified Device Architecture) 显卡(Video…...

深入理解 Django 自定义用户模型
1. 引言 Django 作为一个强大的 Web 框架,内置了用户认证系统。然而,实际项目中我们通常需要扩展用户模型,以满足不同的业务需求。Django 提供了继承 AbstractUser 的方式,让我们能够轻松地定制用户模型。本文将通过一个自定义用…...

顺序表和链表的区别
顺序表和链表的区别 不同点顺序表链表(带头双向循环)存储空间物理上一定连续逻辑上连续物理上不一定连续随机访问(用下标随机访问)支持:O(1)不支持:O(N)任意位置插入或者删除元素可能需要搬移元素…...

系分-数据库总结
历年试题2024年05月试题 BCN范式,模式分解,触发器类型2023年05月试题 NoSQL基本特点,NoSQL对比,混合数据库2022年05月试题4 两段锁,事务并发,数据一致,本地事务发布20…...

new Date()解析
JavaScript 中的 new Date() 构造函数用于创建一个表示日期和时间的对象。Date 对象使得你可以以多种方式获取、设置和格式化日期和时间。让我们深入解析一下 new Date() 及其用法。 创建 Date 对象 可以通过多种方式创建 Date 对象: 不带参数: let no…...

df 的各种用法 以及与du 的区别
df的用法 在 Linux 中,“df”(disk free)是一个用于显示磁盘空间使用情况的命令。 一、主要功能 它可以列出文件系统的磁盘空间使用情况,包括磁盘总容量、已使用空间、可用空间以及使用率等信息。 二、常见用法及参数 基本用法&a…...

2024年下半年软考准考证什么时候打印?
2024年下半年软考准考证打印入口网址如下: https://bm.ruankao.org.cn/sign/welcome 广东的同学特别注意:准考证打印截止时间是11月8号,也就是考试前一天。一定要提前打印准考证,考试当天是无法打印的。 2024年下半年软考准考证…...

企业安全运行与维护(Enterprise Security Operation and Maintenance)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

每日“亿“题 东方博宜OJ 1424-自然数的分解
原题链接:1424 - 自然数的分解-东方博宜OJ 题目描述 给定自然数 n ,将其拆分成若干自然数的和。输出所有解,每组解中数字按从小到大排列。相同数字的不同排列算一组解。 如,读入整数 3 ,分解方案如下: …...

初识Linux · 文件(1)
目录 前言: 回顾语言层面的文件 理解文件的预备知识 文件和磁盘 使用和认识系统调用函数 前言: 本文以及下篇文章,揭露的都是Linux中文件的奥秘,对于文件来说,初学Linux第一节课接触的就是文件,对于C…...

【MYSQL】mysql约束---自增长约束(auto_increment)
1、概念 在Mysql中,当主键为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。 注意:自增长约束通常与主键放在一起使用。 通过给…...

基于STM32设计的智能学习台灯(华为云IOT)(238)
文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成【4】ESP8266工作模式配置1.2 设计思路【1】整体设计思路【2】整体构架【3】上位机开发思路1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要1.4 开发工具的选择【1…...

网络层协议 --- IP
序言 在这篇文章中我们将介绍 IP协议,经过这篇文章的学习,我们就会了解运营商到底是如何为我们提供服务的以及平时我们所说的内网,公网到底又是什么,区别是什么? IP 地址的基本概念 1. IP 地址的定义 每一个设备接入…...

Java虚拟机(JVM)介绍
**Java虚拟机(JVM)**是Java平台的核心组件,它提供了一个运行时环境,使得Java程序可以在不同的操作系统和硬件平台上运行而无需修改。 JVM的架构 JVM主要由以下几个部分组成: 类加载器(Class Loader…...

1000题-计算机网络系统概述
术语定义与其他术语的关系SDU(服务数据单元)相邻层间交换的数据单元,是服务原语的表现形式。在OSI模型中,SDU是某一层待传送和处理的数据单元,即该层接口数据的总和。 - SDU是某一层的数据集,准备传递给下一…...

Authentication Lab | IP Based Auth Bypass
关注这个靶场的其它相关笔记:Authentication Lab —— 靶场笔记合集-CSDN博客 0x01:IP Based Auth Bypass 前情提要 有些开发人员为了图方便,会给站点设置一个 IP 白名单,如果访问站点的用户的 IP 在白名单内,则允许访…...

linux中的火墙优化策略
1.火墙介绍 1. netfilter 2. iptables 3. iptables | firewalld 2.火墙管理工具切换 在rocky9 中默认使用的是 firewalld firewalld -----> iptables dnf install iptables - services - y systemctl stop firewalld systemctl disable firewalld systemctl mask fi…...

GO网络编程(三):海量用户通信系统1:登录功能初步
一、准备工作 需求分析 1)用户注册 2)用户登录 3)显示在线用户列表 4)群聊(广播) 5)点对点聊天 6)离线留言 主界面 首先,在项目根目录下初始化mod,然后按照如下结构设计目录: 海量用户通信系统/ ├── go.mod ├── client/ │ ├──…...

Windows安全加固详解
一、补丁管理 使用适当的命令或工具,检查系统中是否有未安装的更新补丁。 Systeminfo 尝试手动安装一个系统更新补丁。 • 下载适当的补丁文件。 • 打开命令提示符或PowerShell,并运行 wusa.exe <patch_file_name>.msu。 二、账号管…...

JavaScript函数基础(通俗易懂篇)
10.函数 10.1 函数的基础知识 为什么会有函数? 在写代码的时候,有一些常用的代码需要书写很多次,如果直接复制粘贴的话,会造成大量的代码冗余; 函数可以封装一段重复的javascript代码,它只需要声明一次&a…...

云RDS MySQL迁移至本地MySQL
本地准备工作 1.安装:percona-xtrabackup 上传percona-xtrabackup-2.3.9-Linux-x86_64.tar.gz包到/usr/local tar -zxvf percona-xtrabackup-2.3.9-Linux-x86_64.tar.gz mv percona-xtrabackup-2.3.9-Linux-x86_64 percona-xtrabackup 2.创建数据目录 cd /data/ mkdir rds-mys…...

【C++ 11】nullptr 空指针
文章目录 【 0. 问题背景 】0.1 野指针和悬空指针0.2 传统空指针 NULL0.3 传统空指针的局限性 【 1. 基本用法 】【 2. nullptr 的应用 】2.1 nullptr 解决 NULL 的遗留BUG2.2 简单实例 【 0. 问题背景 】 0.1 野指针和悬空指针 总结 野指针悬空指针产生原因指针变量未被初始…...

Flutter + Three.js (WebView)实现桌面端3d模型展示和交互
文章目录 flutter(桌面端)瓶颈一、Flutterthree.js二、Flutterthree.js 实现思路1.在Flutter 中使用webview 进行嵌套2.开启上面嵌套的页面地址2.在含有three.js 的html 中引入模型3.两个页面之间进行通信,如图: 总结 flutter(桌面端)瓶颈 Flutter 本身…...

学习日志35
拆卸线问题(Disassembly Line Balancing Problem, DLBP)是生产工程和运筹学中的一个特殊问题,它涉及到将废弃产品有效地拆解成可回收利用的部件和材料。随着环保意识的增强和资源回收技术的发展,DLBP逐渐成为研究的热点。这类问题…...

http cache-control
Cache-Control 是 HTTP 协议中用于控制缓存行为的重要头部字段。它定义了客户端和服务器端如何缓存资源,以及缓存的有效期。以下是关于 Cache-Control 的详细解释: 请求指令 max-age 指示客户端接受的响应最大年龄。如果缓存的响应超过这个年龄&#x…...

kubernetes 中的微服务
微服务:用控制器来完成集群的工作负载,那么应用如何暴漏出去?需要通过微服务暴漏出去后才能被访问 - Service是一组提供相同服务的Pod对外开放的接口。 - 借助Service,应用可以实现服务发现和负载均衡。 - service默认只支持…...

电脑无法无线投屏的解决办法
在前司的时候经常遇到电脑无法使用无线投屏器的情况,今天就来聊聊如何解决。 1.不会连接。这种情况,经常发生在WIN10升级WIN11之后,一般是两种办法,一种是同时按键盘上的WINDOWS和K键,右下角就会出来连接的图标&#…...