Java Selenium Web驱动程序在从另一个弹出窗口(IE驱动程序)获取弹出窗口后被阻止

Java Selenium Web驱动程序在从另一个弹出窗口(IE驱动程序)获取弹出窗口后被阻止,java,internet-explorer,selenium,selenium-webdriver,popupwindow,Java,Internet Explorer,Selenium,Selenium Webdriver,Popupwindow,当我正在测试的应用程序打开第二级弹出窗口时,我面临一个问题(我的意思是,弹出窗口会弹出另一个弹出窗口)。我正在使用Selenium for Java,版本2.42.2,带有IE驱动程序 我的代码目前管理所有其他流和单个弹出窗口,但当出现第二级弹出窗口时,我的webdriver对象变得不负责任,只是停留在试图调用的任何方法中。当这种情况发生时,我需要手动关闭弹出窗口,然后驱动程序方法继续执行调用的方法 也许值得一提的是,如果我从主页调用第二个弹出窗口(而不是从另一个弹出窗口),我可以毫无问题地管理

当我正在测试的应用程序打开第二级弹出窗口时,我面临一个问题(我的意思是,弹出窗口会弹出另一个弹出窗口)。我正在使用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;
    }
  }
}
String url=“/example.jsp”
int计数器=0;
布尔窗口检测=假;
//正在等待,直到检测到具有给定url的页面
//它尝试了10次才继续
而(检测到计数器+++<10&&!windowDetected){
waitForSeconds(1);//只调用Thread.sleep方法,
System.out.println(“在获取处理程序之前,迭代“+counter+”,共10次”);
Set handlers=driver.getWindowHandles();
System.out.println(“获取处理程序后,处理程序的数量:“+handlers.size()”);
for(字符串处理程序:处理程序){
试一试{
System.out.println(“移动到”+处理程序);
driver.switchTo()窗口(处理程序);
}
捕获(无捕获){
System.out.println(“未找到窗口,它可能重定向到其他窗口”);
打破
}
if(driver.getCurrentUrl()包含(url)){
windowDetected=true;
waitForPageLoading();//它只是验证当前要完成的页面状态
打破
}
}
}
我能够在特定窗口中正确定位驱动程序,在其他应用程序页面中使用上述代码,但当有第二级弹出窗口时,它只是挂在行Set handlers=driver.getWindowHandles()上;这是弹出窗口出现后在驱动程序对象上调用的第一个方法。类似地,如果我调用了另一个驱动程序方法,比如driver.getPageSource(),同样的情况也会发生在该方法中

我无法更改应用程序结构(我的范围仅用于测试它),因此,现在对web应用程序代码进行更改不是我的选择。我读过不同的选项,比如尝试Robot类,但我认为它很难用更复杂的页面实现,也很难维护

你知道我该如何解决这个问题吗?非常感谢

致以最良好的祝愿


Alberto。

在查看了IEDriverServer变更日志后,使用此驱动程序的更新版本解决了问题。以前是2.24.2,现在是2.44。一个稍有不同的行为,但这实现了我想要的