前言
这些是过去学习和工作中积累的个人总结,不过可能会存在一些主观臆断,如果有说错的地方,请指出来哦!
回答
在 UI 自动化测试的时候,会遇到这样的一个场景,即点击页面的元素之后,会弹出一个新的窗口。
以百度首页为例,打开百度首页,点击左上角的新闻。会打开一个标题为“新闻”的新的窗口。
此时我们需要获取新闻页面的标题,需要怎么操作呢?
switchTo()
在计算机中一个浏览器窗口都是有一个句柄(即为浏览器窗口的id值),而Selenium提供了switchTo().window(windowHandle(句柄))用来处理新的窗口或标签页。
主要是分为以下几个步骤
-
获取到当前窗口的句柄:driver.getWindowHandle();
-
点击元素后,打开新的窗口,获取当前所有窗口的句柄:driver.getWindowHandles();
-
循环遍历,判断句柄不一样,则表示切换到了新的窗口
for(String handle : allHandle){
if (!handle.equals(mainHandle)) {
driver.switchTo().window(handle);
break;
}
}
当然在实际测试中,我们会遇到各种不同的情况。
例如需要在切换到新的窗口页面进行测试,并在完成测试后关闭当前页面并返回到首页进行下一步操作。这时,可以使用 driver.close()方法关闭当前页面,然后使用
driver.switchTo().window(handle)切换回首页。其中
handle` 参数是指首页窗口的句柄。这样就能够方便地在不同的测试页面之间切换,完成测试任务。
又如当新打开的窗口加载时间较长时,可以使用显示等待的方式,设置一个等待时间,例如30秒。在每隔0.5秒的时间内,通过轮询新开窗口的元素,找到元素时,则说明新窗口已经加载完成,可以继续后续操作。如果在等待时间内未找到元素,则可以捕获异常,以便后续定位问题。
代码示例
@Test
public void Test1() {
// 打开百度首页
driver.get("https://www.baidu.com/");
// 窗口最大化
driver.manage().window().maximize();
// 百度首页的句柄
String baiduMainHandle = driver.getWindowHandle();
// 点击新闻按钮
driver.findElement(By.xpath("//a[contains(@href,'news.baidu')]")).click();
//获取浏览器全部句柄
Set<String> allWindowHandles = driver.getWindowHandles();
for(String handle : allWindowHandles){
if (!handle.equals(baiduMainHandle)) {
driver.switchTo().window(handle);
break;
}
}
// 打印新闻页面的标题
System.out.println(driver.getTitle());
}