【发布时间】:2015-06-23 12:14:47
【问题描述】:
当我正在测试的应用程序打开一个二级弹出窗口(我的意思是,一个弹出另一个弹出窗口)时,我遇到了一个问题。我正在使用 Selenium for Java,版本 2.42.2,带有 IE 驱动程序。
我的代码当前管理所有其他流和单个弹出窗口,但是当出现第二级弹出窗口时,我的 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 类,但我认为使用更复杂的页面很难实现并且难以维护。
知道如何解决这个问题吗?非常感谢。
最好的问候,
阿尔贝托。
【问题讨论】:
标签: java internet-explorer selenium selenium-webdriver popupwindow