Java Selenium Web驱动程序在从另一个弹出窗口(IE驱动程序)获取弹出窗口后被阻止
当我正在测试的应用程序打开第二级弹出窗口时,我面临一个问题(我的意思是,弹出窗口会弹出另一个弹出窗口)。我正在使用Selenium for Java,版本2.42.2,带有IE驱动程序 我的代码目前管理所有其他流和单个弹出窗口,但当出现第二级弹出窗口时,我的webdriver对象变得不负责任,只是停留在试图调用的任何方法中。当这种情况发生时,我需要手动关闭弹出窗口,然后驱动程序方法继续执行调用的方法 也许值得一提的是,如果我从主页调用第二个弹出窗口(而不是从另一个弹出窗口),我可以毫无问题地管理它,因此问题似乎与嵌套窗口的数量有关,而不是与页面的特定问题有关 看看下面的代码: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对象变得不负责任,只是停留在试图调用的任何方法中。当这种情况发生时,我需要手动关闭弹出窗口,然后驱动程序方法继续执行调用的方法 也许值得一提的是,如果我从主页调用第二个弹出窗口(而不是从另一个弹出窗口),我可以毫无问题地管理
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。一个稍有不同的行为,但这实现了我想要的