软件测试 | 网页 frame 与多窗口处理

当我们要定位一个元素时,怎么都定位不到的时候就要考虑是不是浏览器内嵌里一个 frame 窗口或者要找的元素在新打开的窗口里。这时候就需要将进行 frame 的切换以及窗口的切换。

frame 类似于在原有主 html 的基础上又嵌套一个 html,而且嵌套的 html 是独立使用,互不影响。

当打开一个页面时,光标的定位是在主页面中,如果页面是由多个 frame 组成的,那么无法直接定位到具体的元素,需要切换到自己所需要的 frame 中,再查找该元素。

iframe 解析

如图可以看到iframe的标签

iframe 的多种切换方式

假设一个 HTML 代码

那么通过传入 id、name、index 以及 selenium 的 WebElement 对象来切换 frame

  • index:传入整型的参数,从 0 开始

    • driver.switch_to.frame(0)

  • id:传入字符串的参数

    • driver.switch_to.frame("hogwarts_id")

  • name: 传入字符串的参数

    • driver.switch_to.frame("hogwarts_name")

  • WebElement: 传入 selenium.webelement 对象

    • driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))

iframe 切换回默认页面

在 driver.switch_to.frame()之后,如果还想操作原页面,则可以使用

  • driver.switch_to.default_content()

iframe 多层切换

如图所示多层嵌套的 iframe 从最外部 iframe 切换到 iframe2 则需要层层切换

driver.switch_to.frame("iframe1")
driver.switch_to.frame("iframe2")

从 iframe2 切换回 iframe1 可以使用父子切换

#从ifrme2切换到上一级iframe1
driver.switch_to.parent_frame()
#从ifrme1切换到上一级iframe,如果iframe已经是最上级,则保持不变
driver.switch_to.parent_frame()

这个方法是 selenium 提供的直接从子 frame 切换到父 frame,可以使用在嵌套的 frame 框架中

多窗口处理

元素有属性,浏览器的窗口其实也有属性的,只是看不到,浏览器窗口的属性用句柄(handle)来识别。

当浏览器打开一个窗口时,如果要在新的窗口操作就需要句柄切换。人为操作的话,可以通过眼睛看,识别不同的窗口点击切换。但是脚本没长眼睛,它不知道你要操作哪个窗口,这时候只能句柄来判断了。

句柄的获取

当有多个窗口时,可以用 window_handles 打印一下句柄:

browser = webdrver.Chrome()
handles = browser.window_handles
print(handles)

打印出的 window_handles:

['CDwindow-8012E9EF4DC788A58DC1588E7B8A7C44', 'CDwindow-
11D52927C71E7C2B9984F2D1E2856049']

句柄的切换

通过打印 handles 可以看出,它是一个列表,那么就可以通过 switch_to.window() 来切换句柄

从上面源代码中的说明可以看出,switch_to.window()需要我们提供一个 windows_name,可以是 name 也可以是 windows handle。

from selenium import webdriver
​
browser = webdriver.Chrome()
handles = browser.window_handles
print(handles)
browser.switch_to.window(handles[-1])

这里唯一要注意的是 handles[-1]是一个数组,这里的-1 表示浏览器窗口的倒数第一个。

实战案例

百度搜索“霍格沃兹测试学院”,点击“霍格沃兹测试学院_腾讯课堂”,点击“中高级测试开发「名企定向培养」班-霍格沃兹测试学院”。

这是一段自动化脚本中,因为点击“霍格沃兹测试学院_腾讯课堂”之后会打开一个新的窗口,在这里就需要切换句柄。

from selenium import webdriver


class TestHogwarts:
    def setup_method(self, method):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(3)

    def teardown_method(self, method):
        self.driver.quit()

    def test_hogwarts(self):
        self.driver.get('https://www.baidu.com')
        #在输入框中输入霍格沃兹测试学院
        self.driver.find_element_by_id('kw').send_keys('霍格沃兹测试学院')
        #点击搜索
        self.driver.find_element_by_css_selector('.s_btn').click()
        #使用link_text点击
        self.driver.find_element_by_link_text('霍格沃兹测试学院_腾讯课堂').click()
        #将获取到的window_handles赋值给一个变量handles
        handles = self.driver.window_handles
        #打印handles看看当前浏览器有几个窗口
        print(handles)
        #切换句柄
        self.driver.switch_to.window(handles[-1])
        #点击
        self.driver.find_element_by_partial_link_text('名企定向培养').click()

你可能感兴趣的:(测试,软件测试,测试开发,软件测试)