我正在使用网络驱动程序运行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)的行为相同?
或者,根据我的需要,如何在所有三个浏览器中打开一个新的选项卡/窗口并成功切换到该选项卡/窗口,然后关闭选项卡/窗口并成功切换回原始选项卡/窗口?
答案 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
仅返回原始标签,这可能是由于版本的原因。见