Seleinum如何切换窗口

前言

这些是过去学习和工作中积累的个人总结,不过可能会存在一些主观臆断,如果有说错的地方,请指出来哦!

回答

在 UI 自动化测试的时候,会遇到这样的一个场景,即点击页面的元素之后,会弹出一个新的窗口。

以百度首页为例,打开百度首页,点击左上角的新闻。会打开一个标题为“新闻”的新的窗口。

此时我们需要获取新闻页面的标题,需要怎么操作呢?

switchTo()

在计算机中一个浏览器窗口都是有一个句柄(即为浏览器窗口的id值),而Selenium提供了switchTo().window(windowHandle(句柄))用来处理新的窗口或标签页。

主要是分为以下几个步骤
image

  1. 获取到当前窗口的句柄:driver.getWindowHandle();

  2. 点击元素后,打开新的窗口,获取当前所有窗口的句柄:driver.getWindowHandles();

  3. 循环遍历,判断句柄不一样,则表示切换到了新的窗口

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());
}