当应用程序我正在测试打开第二级弹出窗口时,我正面临一个问题(我的意思是,一个弹出窗口会弹出另一个弹出窗口)。我使用Selenium for Java,版本2.42.2,使用IE Driver。
我的代码目前管理所有其他流程和单个弹出窗口,但是当出现第二级弹出窗口时,我的webdriver对象变得无法响应,只是卡在任何试图调用的方法中。发生这种情况时,我需要手动关闭弹出窗口,然后驱动程序方法继续执行调用的方法。
也许值得一提的是,如果我从主页面调用第二个弹出窗口(而不是从另一个弹出窗口),我可以毫无问题地管理它,所以问题似乎与嵌套窗口的数量有关,而不是特定的页面的问题。
看看下面的代码:
String url = "/example.jsp"
int counter = 0;
boolean windowDetected = false;
// Waiting until page with given url gets detected
// It tries 10 times before it continues
while (counter++ < 10 && !windowDetected) {
waitForSeconds(1); // Just invokes Thread.sleep method,
System.out.println("before getting handlers, iteration " + counter + " of 10");
Set<String> handlers = driver.getWindowHandles();
System.out.println("after getting handlers, number of handlers: " + handlers.size());
for (String handler : handlers) {
try {
System.out.println("Moving to " + handler);
driver.switchTo().window(handler);
}
catch (NoSuchWindowException e) {
System.out.println("Window not found, it probably redirected to a different window");
break;
}
if (driver.getCurrentUrl().contains(url)) {
windowDetected = true;
waitForPageLoading(); // It just verify current page status to be completed
break;
}
}
}
我可以在其他应用程序页面中使用上面的代码在特定窗口中正确定位驱动程序,但是当有第二级弹出窗口时,它只挂起就行Set handlers = driver.getWindowHandles();这是弹出窗口出现后调用驱动程序对象的第一个方法。同样,如果我调用了另一个驱动程序方法,如driver.getPageSource(),则该方法也会发生同样的情况。
我无法更改应用程序结构(我的范围仅用于测试),因此现在无法对Web应用程序代码进行更改。我已经阅读了不同的选项,例如尝试使用Robot类,但我认为使用更复杂的页面并且难以维护将难以实现。
我对如何解决这个问题有所了解?非常感谢提前。
致以最诚挚的问候,
阿尔贝托。
答案 0 :(得分:0)
在查看IEDriverServer更改日志后,转移到此驱动程序的较新版本解决了该问题。以前是2.24.2,现在使用2.44。一种略有不同的行为,但它完成了我想要的东西