如何在多个浏览器中获得相同的新选项卡/窗口行为?

时间:2016-09-29 23:00:26

标签: selenium-webdriver cross-browser

我正在使用网络驱动程序运行Selenium测试。

当我尝试在浏览器中打开新标签页或新窗口时,行为会有所不同,具体取决于我正在测试的浏览器。

这是我正在使用的方法。对于新选项卡而不是新窗口,代码是相同的,只需用“t”而不是“n”替换按下的键。

protected void logOutInAnotherTab() {
    driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "n");
    List<String> tabs = new ArrayList<>(driver.getWindowHandles());
    driver.switchTo().window(tabs.get(1));
    PageObject.logout(driver);
    PageUtil.waitForPageLoad(driver, 3);
    driver.close();
    driver.switchTo().window(tabs.get(0));
}

应该打开一个新的选项卡/窗口,切换到它,导航到注销URL(结束用户的会话),然后关闭选项卡/窗口(切换到原始选项卡/窗口),允许测试继续用户会话结束的情况。

如果我为标签执行此操作,当我调用driver.getWindowHandles()时,Firefox和IE都只返回原始标签,这会导致下一行的索引超出界限。换句话说,webdriver无法识别新选项卡,因此切换到它失败。

如果我为windows做,我有同样的问题,但只有IE遭受它; Firefox Web驱动程序获得两个窗口就好了。此外,IE加载与原始窗口相同的页面,而不是起始页面或主页,这会带来其他问题。

在所有情况下,我都可以让Chrome按照我的预期行事。

当我处理多个标签页或窗口时,如何使所有这三种桌面浏览器(IE,Firefox和Chrome)的行为相同?

或者,根据我的需要,如何在所有三个浏览器中打开一个新的选项卡/窗口并成功切换到该选项卡/窗口,然后关闭选项卡/窗口并成功切换回原始选项卡/窗口?

1 个答案:

答案 0 :(得分:0)

基本上我根据标签名称切换标签。以下是我的代码,希望它有意义。

public void SwitchTo(String tabName) {

        String currentHandle = driver.getWindowHandle();
        Set<String> set = driver.getWindowHandles();

        for (String s : set) {

            if (currentHandle.equals(s)) {
                continue;
            }

            driver.switchTo().window(s);

            if (driver.getTitle().equals(tabName)) {
                break;
            }
        }
    }

注意:我刚刚提供了我的本地方法而没有驱动程序初始化,不知道“什么是驱动程序?”。

  

如果我为标签执行此操作,当我调用driver.getWindowHandles()时,Firefox和IE都只返回原始标签。

我可以看到getWindowHandles仅返回原始标签,这可能是由于版本的原因。见

Firefox does not list tabs in getAllWindowHandles