python之处理selenium工具中的frame/iframe/frameset框架切换问题(selenium切换iframe窗口)

网友投稿 1486 2022-08-28


python之处理selenium工具中的frame/iframe/frameset框架切换问题(selenium切换iframe窗口)

前言

① 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.退回到父级iframeswitch 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代码:

iframe test

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代码:

iframe test

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框架中跳来跳去了。

去期待陌生,去拥抱惊喜。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python之处理selenium中的获取元素属性问题 || 处理selenium中的获取文本问题 || 处理selenium中的窗口切换问题 || 处理selenium中的鼠标悬停问题(python selenium循环判断元素是否存在)
下一篇:java实现马踏棋盘游戏
相关文章

 发表评论

暂时没有评论,来抢沙发吧~