python之处理selenium工具中的frame/iframe/frameset框架切换问题
前言
① frame 标签有 frameset 、 frame 、 iframe 三种; frameset 跟其他普通标签没有区别,不会影响到元素正常的定位;而 frame 与 iframe 对selenium定位而言是一样的,selenium工具中有一组方法对frame/iframe框架进行操作。
②iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。【解释:就像是我们的某个主页,里面有好多小模块,每 个 小模块用这个叫做iframe的东西分开来,方便维护,也方便开发各自开发各自的部分,互不相干】
③通常不在同一个iframe分为两种情况:一种是包含(嵌套),一种是平级。
④为什么我们要定位iframe?介于iframe是独立开的一个一个的小模块,就像是船舱的特性,所以iframe就行船舱的舱门,想要进入船舱去找东西,就必须先进入舱门,所以当元素在不同的iframe时,就必须先进入到元素所在地的iframe之后才能定位到元素。
⑤定位iframe几种方式:1.用iframe中的ID来定位;2.用iframe中的name来定位;3.用xpath来定位;4.用css来定位
1、进入iframe
♦ 首先我们用self.driver.switch_to.frame()这个方法来进入iframe框架,如果iframe是包含关系,需要从最外面的iframe一层一层进入。 self.driver.switch_to.frame() ♦1.用iframe中的ID来定位 self.driver.switch_to.frame(‘noticeCheckWin’)
♦2.用iframe中的name来定位 self.driver.switch_to.frame(‘noticeCheckWin’)
♦3.用xpath来定位 self.frame2 = self.driver.find_element_by_xpath(‘/html/body/div[2]/div[2]/div[2]/iframe[3]’) self.driver.switch_to.frame(self.frame2)#定位动态的iframe,可以把动态的部分删了然后再用xpath定位
♦4.用css来定位 self.frame3 = self.driver.find_element_by_css_selector(‘body > div.h-main > div.h-screen.layout > div.h-screen-con > iframe’)#也可以查出所有的路径用下标切出来 self.driver.switch_to.frame(self.frame3)
2、退出iframe ♦ 退出iframe有两种形式:1.退出所有的iframe切换到主文档 2.退回到父级iframe ♦1.退出所有的iframe切换到主文档 self.driver.switch_to.default_content()、
♦2.退回到父级iframe switch to.parent_frame()#退回到自己想要的层级
方法
①iframe框架有name或者id属性值
driver.switch_to.frame('iframe-id')
driver.switch_to.frame('iframe-name')
【注意】不得不提到 switch_to_frame() 方法,很多人在这样写的时候会发现,这句话被划上了删除线,原因是最新版本的selenium库对相关方法进行了升级,之后很有可能会不支持,建议的写法是 switch_to.frame()
②frame/iframe框架没有name或者id属性值:采用xpath元素定位方式(使用iframe的其他属性)
例如:
代码如下:
xf = self.driver.find_element_by_xpath('//iframe[@allowtransparency="true"]')
driver.switch_to.frame(xf)
③跳出当前frame/iframe框架(返回上一层的frame/iframe框架)
self.driver.switch_to.parent_frame()
④返回最外层frame/iframe框架
driver.switch_to.default_content()
实例
实例①:切入frame框架
selenium工具提供了 switch_to.frame() 方法来切入frame框架;
switch_to.frame(reference) # reference是传入的参数,用来定位frame,可以传入id、name、index以及selenium的WebElement对象;
html代码:
<html> <head><title>iframe test</title></head> <body> <iframe id="frame1" src="" name="name1"></iframe> <br> <iframe id="frame2" src="" name="name2"></iframe> </body> </html>
python脚本代码:
from selenium import webdriver driver = webdriver.Chrome() driver.switch_to.frame(0) # 1.用frame的index来定位,第一个是0
# driver.switch_to.frame("frame1") # 2.用id来定位
# driver.switch_to.frame("name1") # 3.用name来定位
# driver.switch_to.frame(driver.find_element_by_id("frame1")) # 4.用WebElement对象来定位
通常采用id和name定位元素的方式就能够解决绝大多数问题。但有时候frame标签并无这两项属性,则可以用index和WebElement来定位:
(1)index从0开始,传入整型参数即判定为用index定位,传入str参数则判定为用id/name定位。
(2)WebElement对象,即用find_element系列方法所取得的对象,我们可以用tag_name、xpath等来定位frame对象。
实例②:切出frame框架
切到frame框架中之后,我们便不能继续操作主文档的元素,这时如果想操作主文档内容,则需切回主文档。
selenium工具提供了 switch_to.default_content() 方法来切出 frame框架;
driver.switch_to.default_content()
实例③:嵌套frame框架的操作
html代码:
<html> <head><title>iframe test</title></head> <body> <iframe id="frame1" src="" name="name1"> <iframe id="frame2" src="" name="name2"> </iframe> </iframe> </body> </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框架中跳来跳去了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!