[Selenium][Notes]Day7:🔟定位frame/iframe

153 阅读1分钟

Background:

frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对 Selenium定位而言是一样的,Seleniun有一组方法对frame进行操作。

frameset不用切,frame需层层切!

#方法方法描述
1switch_to.frame(reference)切换到frame中
2switch_to.default_content()返回主文档
3switch_to.parent_frame()后退,返回父文档

1. 切换frame switch_to.frame(reference)

reference是传入的参数,用来定位frame,可以传入id、name、index以及selenium的WebElement对象。reference一般输id,但是也有动态id的情况,可以使用xpath定位,然后传入WebElement对象

# 1.用frame的index来定位,第一个是0
self.driver.switch_to.frame(0) 
# 2.用id来定位
self.driver.switch_to.frame("frame1") 
# 3.用name来定位
self.driver.switch_to.frame("myframe")
# 4.用xpath传入WebElement对象来定位
bottom = self.driver.find_element_by_xpath('/html/frameset/frame[2]')
self.driver.switch_to.frame(bottom)

2. 返回主文档 switch_to.default_content()

切换进入frame之中后,就不能对主文档的元素进行操作了,如果需要操作,那么只能再切换回去

# 跳出frame
self.driver.switch_to.default_content()

3. 返回父文档 switch_to.switch_to.parent_frame()

遇到嵌套的frame的时候,要一层一层切换进去,如果已经切换到frame2中,想要回到上一级就需要这个方法。

self.driver.switch_to.frame("frame1")  # 切换frame1  
self.driver.switch_to.frame("frame2")  # 从frame1切换到frame2
# 从frame2返回到frame1
self.driver.switch_to.parent_frame()

实例Code:

from selenium import webdriver
from time import sleep

class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get('http://sahitest.com/demo/framesTest.htm')

    def test(self):
        # 进入frame1
        top = self.driver.find_element_by_name('top')
        self.driver.switch_to.frame(top)
        self.driver.find_element_by_xpath('/html/body/table/tbody/tr/td[1]/a[1]').click()
        sleep(2)
        # 跳出frame1
        self.driver.switch_to.default_content()
        # 进入frame2
        bottom = self.driver.find_element_by_xpath('/html/frameset/frame[2]')
        self.driver.switch_to.frame(bottom)
        self.driver.find_element_by_xpath('/html/body/table/tbody/tr/td[2]/a[1]').click()
        sleep(2)
        self.driver.quit()

if __name__ == '__main__':
    case = TestCase()
    case.test()