selenium之 frame、iframe

news/2025/3/29 17:43:51/文章来源:https://www.cnblogs.com/maoning/p/18794008

frame、iframe

相信大部分使用selenium的同学都会遇见一个现象,就是明明可以定位到元素,但是就是无法操作;这个是因为遇到了frame、iframe这个东西

frame标签有frameset、frame、iframe三种,

frameset和其他普通标签没有区别,不会影响到定位

它们两个的学名叫做框架,顾名思义,首先你要进去这个框架再进行操作,操作完成再从这个框架离开

selenium就提供了三种方式,来进行frame、iframe的访问

  • WebElement
  • name、id
  • 使用索引

话不多说,让我们开始实践

WebElement

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Serviceserve_path = r'D:\Code_Study\driver\chromedriver-win64\chromedriver.exe'
service = Service(serve_path)
browser = webdriver.Chrome(service=service)
browser.get(f'https://the-internet.herokuapp.com/nested_frames')
# WebElement;先找到这个框架元素,在进行切换
frameset = browser.find_element(By.NAME, "frame-top")
# 切换到大的frame
browser.switch_to.frame(frameset)
# 定位上半部分中间的frame,并切换
frame_middle = browser.find_element(By.NAME, "frame-middle")
browser.switch_to.frame(frame_middle)
# 输出里面的内容
print(browser.find_element(By.ID, "content").text) # MIDDLE

name、id

# 如果frama有Id、name属性的话,可以使用该属性;如果不是唯一的话,会默认找第一个
# 先找到上面的frame,再找到中间的
browser.switch_to.frame("frame-top")
browser.switch_to.frame("frame-left")
# # 输出里面的内容
print(browser.find_element(By.TAG_NAME, "body").text) # LEFT

使用索引

frame_top = browser.find_elements(By.TAG_NAME, 'frame')[0]
browser.switch_to.frame(frame_top)
frame_right = browser.find_elements(By.TAG_NAME, 'frame')[2]
browser.switch_to.frame(frame_right)
print(browser.find_element(By.TAG_NAME, "body").text) # RIGHT

注意离开框架

不管你使用上面什么方法,最后需要离开框架,切换回默认内容

  • switch_to.parent_frame()返回父文档
  • switch_to.default_content()返回主文档
# 离开框架
# switch_to.default_content()返回主文档
# switch_to.parent_frame()返回父文档frame_top = browser.find_elements(By.TAG_NAME, 'frame')[0]
browser.switch_to.frame(frame_top)
frame_right = browser.find_elements(By.TAG_NAME, 'frame')[2]
browser.switch_to.frame(frame_right)
print(browser.find_element(By.TAG_NAME, "body").text) # RIGHT
# 返回父文档,回到frame_top
# browser.switch_to.parent_frame()
# print(browser.page_source)
"""
<html><head></head><frameset frameborder="1" name="frameset-middle" cols="33%,33%,33%"><frame src="/frame_left" scrolling="no" name="frame-left"><frame src="/frame_middle" scrolling="no" name="frame-middle"><frame src="/frame_right" scrolling="no" name="frame-right" cd_frame_id_="757301613216e105ebb32711cd5c35dd">
</frameset>
</html>
"""# 直接返回主文档
browser.switch_to.default_content()
print(browser.page_source)
"""
<html><head></head><frameset frameborder="1" rows="50%,50%"><frame src="/frame_top" scrolling="no" name="frame-top" cd_frame_id_="a74a433876cf3abadc9fddf601c55829"><frame src="/frame_bottom" scrolling="no" name="frame-bottom"><noframes>Frames are not rendering.</noframes>
</frameset>
</html>
"""

好了,frame的东西到这里就结束了;有疑问的可以评论区讨论

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-面经

目录 MVCC概念?如何实现? 可重复读概念 可重复读下,快照是在什么时候生成的,是事务启动时,还是语句执行前 可重复读下,执行两个select语句,会生成几个快照?MVCC概念?如何实现? MVCC概念:通过「版本链」来控制并发事务访问同一个记录时的行为就叫 MVCC(多版本并发控制…

算法备案五大真相

一些开发者已经了解到算法备案是AI类产品必做的一项资质了,但因为经验有限,依然存在一些盲点和不清楚的地方。今天,我就整理出了最基础但也最重要的五大算法备案真相,供大家参考。如有其它疑问,欢迎进一步咨询算法备案办理问题。一、流程统一,审核不统一 算法备案有全国统…

Cknife配置

项目地址 https://github.com/Chora10/Cknife 使用Java编译器 这里使用eclipse 1. File->Open Project from File System...选择目录,点击完成2. 在刚添加的项目上按右键,并点击导出Export选择可运行的jar文件选择路径3. 这里没有选择或没有配置有效的“Launch configurat…

医疗场景实战:百条数据 RFT 微调盘古大模型,精度大幅提升

摘要:RFT强化微调是一种新型LLM微调方法,通过强化学习与传统微调结合,少量数据即可显著增强领域场景的模型能力。本文分享自华为云社区《医疗场景实战|百条数据RFT微调盘古大模型,效果超越DS》,作者:盘古大模型官方账号。 医疗场景实战|百条数据RFT微调盘古大模型,效果超…

SQL Server 启用 sa

Hello World ‍‍ ‍‍‍‍‍

一文看懂大数据生态圈完整知识体系

随着大数据行业的发展,大数据生态圈中相关的技术也在一直迭代进步,希望能通过本文帮助大家快速构建大数据生态圈的完整知识体系。 目前大数据生态圈中的核心技术总结下来如图1所示,分为以下9类,下面分别介绍。大数据生态下9类核心技术 01 数据采集技术框架 数据采集也被称为…

神秘另解集合,想出来一样的东西这辈子有了

P1600 考虑重链剖分。然后把每个路径给变成 \(O(\log n)\) 个重链,根据重链剖分的性质,每条重链的 dfs 序都为连续,所以把图画出来大概是像下图这样:横轴是时间,纵轴是 dfs 序。一个时间 \(t\) 在节点 \(p\) 的人数就是经过 \((t,\text{dfn}_p)\) 的线段数量。线段数量为 …

功率器件热设计基础(十三)——使用热系数Ψth(j-top)获取结温信息

功率半导体热设计是实现IGBT、碳化硅SiC高功率密度的基础,只有掌握功率半导体的热设计基础知识,才能完成精确热设计,提高功率器件的利用率,降低系统成本,并保证系统的可靠性。。。**前言 ** 功率半导体热设计是实现IGBT、碳化硅SiC高功率密度的基础,只有掌握功率半导体的…

Nmap学习笔记

Nmap学习笔记 九步:Enumerate targets 列出目标 Discover live hosts 发现活动主机 Reverse-DNS lookup 反向 DNS 查询 Scan Ports 端口扫描 Detect versions 版本侦测 Detect OS 系统侦测 Traceroute 路由追踪 Scripts 脚本 Write output 输出Nmap Live Host Discovery---存…

postman 免登录使用

取消Help下面的所有勾选 重启即可I have a dream : Sandy beach B-J-N.

不同板卡间的同步序列出峰问题

简述 使用两块不同板卡,对前导ZC序列一收一发,在接收板上做本地相关,相关结果显示相关性有延迟,目前推测为射频滤波器问题。 异常情况 目前有一套FMQL45T900+CX9261s的板卡,运行OFDM波形进行灵敏度测试。由于只有一套,且收发隔离度仅有约50dB,导致无法在自回环的情况下进…

dl380 gen10微码升级

一、Updating the BIOS and/or iLO firmware using the iLO web interface 1、 通过浏览器登录iLO 5,在Firmware & OS Software页面选择Update Firmware。 2、选择Local file,将已保存至本地的固件文件挂载到选择文件处。3、 点击Flash,阅读更新提示,确认无误后点击OK即…