软件测试 | 网页 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 则需要层层切换
从 iframe2 切换回 iframe1 可以使用父子切换
这个方法是 selenium 提供的直接从子 frame 切换到父 frame,可以使用在嵌套的 frame 框架中
多窗口处理
元素有属性,浏览器的窗口其实也有属性的,只是看不到,浏览器窗口的属性用句柄(handle)来识别。
当浏览器打开一个窗口时,如果要在新的窗口操作就需要句柄切换。人为操作的话,可以通过眼睛看,识别不同的窗口点击切换。但是脚本没长眼睛,它不知道你要操作哪个窗口,这时候只能句柄来判断了。
句柄的获取
当有多个窗口时,可以用 window_handles 打印一下句柄:
打印出的 window_handles:
句柄的切换
通过打印 handles 可以看出,它是一个列表,那么就可以通过 switch_to.window()
来切换句柄
从上面源代码中的说明可以看出,switch_to.window()
需要我们提供一个 windows_name,可以是 name 也可以是 windows handle。
这里唯一要注意的是 handles[-1]
是一个数组,这里的-1 表示浏览器窗口的倒数第一个。
实战案例
百度搜索“霍格沃兹测试学院”,点击“霍格沃兹测试学院_腾讯课堂”,点击“中高级测试开发「名企定向培养」班-霍格沃兹测试学院”。
这是一段自动化脚本中,因为点击“霍格沃兹测试学院_腾讯课堂”之后会打开一个新的窗口,在这里就需要切换句柄。
搜索微信公众号:TestingStudio 霍格沃兹的干货都很硬核
评论