Background:
frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对 Selenium定位而言是一样的,Seleniun有一组方法对frame进行操作。
frameset不用切,frame需层层切!
# | 方法 | 方法描述 |
---|---|---|
1 | switch_to.frame(reference) | 切换到frame中 |
2 | switch_to.default_content() | 返回主文档 |
3 | switch_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()