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

posted @ 2021-11-29 10:02  习久性成  阅读(1620)  评论(0编辑  收藏  举报