我使用IEdriver(32位),IE(已安装版本11)和Selenium 3.3.1, 以下是我用来切换到新窗口的代码。
String parentWin = driver.getWindowHandle();
click(By.cssSelector("#linkID_OpenNewWin"));
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Set<String> winList = driver.getWindowHandles();
for (String winHandle : winList)
{
if (!winHandle.equals(parentWin))
{
driver.switchTo().window(winHandle); // switch focus of WebDriver to the next found window handle
}
}
当我尝试使用IE驱动程序执行上述代码时,它无法找到新打开的窗口, 但是使用Chrome驱动程序,它会按预期执行,所有窗口都会得到处理。
答案 0 :(得分:0)
我可以看到这段代码存在一些问题。
首先,您应该在单击链接之前设置隐式等待,否则理论上至少可以在新窗口完全打开之前继续。其次,尽管在测试用例中只有两个窗口,父项加上新的,循环应该可以正常工作,但如果由于某种原因有额外的窗口(制表符),则没有中断;声明,所以你的循环将继续。这很可能是你隐式等待的位置,但是当你找到匹配时退出循环是一个很好的编程习惯。
答案 1 :(得分:0)
首先,不要使用隐式等待...更喜欢显式等待,例如WebDriverWait
。它将帮助您以更确定的方式控制脚本流程。
我的猜测是,在IE实际显示窗口之前,您的脚本正在继续。我建议您计算窗口句柄的数量,然后单击生成新窗口的链接,然后等待窗口句柄计数增加1.现在您知道窗口已打开,您可以继续抓住新窗口句柄并切换到它。
int expectedNumberOfWindows = driver.getWindowHandles().size() + 1; // or you can hardcode 2 if it should always be 2
String parentWin = driver.getWindowHandle();
click(By.cssSelector("#linkID_OpenNewWin"));
new WebDriverWait(driver, 3).until(ExpectedConditions.numberOfWindowsToBe(expectedNumberOfWindows));
switchToNewWindow(parentWin);
// do stuff in new window
我通常将计划重用的代码放入函数中。这是一个切换到新窗口的窗口,即不是父窗口的窗口。
public void switchToNewWindow(String currentWindow)
{
for (String winHandle : driver.getWindowHandles())
{
if (!winHandle.equals(currentWindow))
{
driver.switchTo().window(winHandle);
}
}
}
注意:这实际上只有在您拥有单个现有窗口且生成单个新窗口的情况下才能确定。在其他情况下,它只会切换到第一个不是父窗口的窗口,它可能是你想要的窗口,也可能不是。