无法在IE上使用Java中的Selenium WebDriver获取新窗口句柄
当我单击页面上的按钮(在IE浏览器中)时,会打开一个新的弹出页面。我尝试获取此弹出窗口的窗口句柄失败。这是我的第一次尝试:无法在IE上使用Java中的Selenium WebDriver获取新窗口句柄,java,selenium,selenium-webdriver,popup,webdriver,Java,Selenium,Selenium Webdriver,Popup,Webdriver,当我单击页面上的按钮(在IE浏览器中)时,会打开一个新的弹出页面。我尝试获取此弹出窗口的窗口句柄失败。这是我的第一次尝试: String baseWin = driver.getWindowHandle(); System.out.println(baseWin); Set<String>s = driver.getWindowHandles(); Iterator<String> ite = s.iterator(); while ( ite.hasNext() ) {
String baseWin = driver.getWindowHandle();
System.out.println(baseWin);
Set<String>s = driver.getWindowHandles();
Iterator<String> ite = s.iterator();
while ( ite.hasNext() ) {
String popUpHandle = ite.next();
if(!baseWin.equals(popUpHandle)) {
driver.switchTo().window(popUpHandle);
System.out.println(driver.switchTo().window(popUpHandle).getTitle());
String baseWin=driver.getWindowHandle();
System.out.println(baseWin);
set=driver.getWindowHandles();
迭代器ite=s.Iterator();
while(ite.hasNext()){
字符串popUpHandle=ite.next();
如果(!baseWin.equals(popUpHandle)){
driver.switchTo()窗口(popUpHandle);
System.out.println(driver.switchTo().window(popUpHandle.getTitle());
此尝试仅打印基本窗口的句柄,如果第二个print语句位于if()语句之外,但位于while()语句之内,并且在if()语句之后,它只输出基本窗口的标题。因此句柄集似乎只包含基本窗口句柄
这是我的第二次尝试:
String baseWin = driver.getWindowHandle();
System.out.println(baseWin);
ArrayList<String> popUpWin = new ArrayList<String>(driver.getWindowHandles());
popUpWin.remove(baseWin);
driver.switchTo().window(popUpWin.get(0));
System.out.println(driver.switchTo().window(popUpWin.get(0)));
String baseWin=driver.getWindowHandle();
System.out.println(baseWin);
ArrayList popUpWin=新的ArrayList(driver.getWindowHandles());
popUpWin.remove(baseWin);
driver.switchTo().window(popUpWin.get(0));
System.out.println(driver.switchTo().window(popUpWin.get(0));
此尝试返回一个错误,表示数组popUpWin为空,即size==0。因此,在调用driver.getWindowHandles()时,弹出窗口的句柄未被检索,并且仅包含基本窗口的句柄。这是IE问题吗?是否有解决方法?还是我忽略了代码中的某些内容?(请注意,我忽略了此处包含的代码中的暂停,因此我不认为这是问题所在。)请注意,弹出窗口不是一个新窗口,而是一个Iframe,将其视为Iframe
驱动程序。getWindowHandles();
用于处理浏览器中的多个选项卡,而不是处理Iframe
您应该使用
driver.switchTo().frame()
切换到该弹出窗口您需要做两件事:
driver.getWindowHandles();
或driver.getWindowHandles().size();
您将获得所有句柄,包括原始窗口和新窗口。更准确地说,您只需将所有4个域的安全设置设置为相同,这意味着您可以取消选中所有4个域的“启用受保护模式”,但显然不鼓励这样做driver.switchTo().window(windowName);
后,需要添加((JavascriptExecutor)driver.executeScript(“window.focus();”);
,IE驱动程序才能对窗口执行任何操作
这是因为IE驱动程序需要它正在处理的窗口位于前台,这条线帮助驱动程序获得窗口的焦点,以便它可以在窗口上执行您想要的任何操作 String baseWin = driver.getWindowHandle();
//Some methods to open new window, e.g.
driver.findElementBy("home-button").click();
//loop through all open windows to find out the new window
for(String winHandle : driver.getWindowHandles()){
if(!winHandle.equals(baseWin)){
driver.switchTo().window(winHandle);
//your actions with the new window, e.g.
String newURL = driver.getCurrentUrl();
}
}
//switch back to the main window after your actions with the new window
driver.close();
driver.switchTo().window(baseWin);
//let the driver focus on the base window again to continue your testing
((JavascriptExecutor) driver).executeScript("window.focus();");
您使用的是什么版本的selenium?这是Windows 7 IE8 selenium 2.12的一个已知问题。但这是lilke 2011Hi的问题。这个答案并没有解决问题。我想知道是否应该更具体一些。“弹出”是第二个独立的IE窗口。driver.switchTo().frame(driver.findElement(By.id(“id”))未成功,并且输入帧号0或1也不成功。该页面是否托管在web上?您可以与我共享链接吗?请让我查看我的自我我已测试了第一个选项(启用保护模式)=>效果非常好!感谢“启用保护模式”-对所有不适用于我的区域启用或禁用此值。有什么想法吗?更新:条件:现在我已经用selenium java 3.8.0版和IEDriverServer 3.8.0尝试了此方法,但还需要满足一个条件:您必须加载html页面,并且从该html页面中,您必须用新页面打开新窗口。如果您按此方式打开新选项卡/窗口另一种方式,例如手动作为新页面或通过插件(我没有测试Flash和ActiveX),Selenium可能不会检测到这个寡妇!(我的案例)因此它实际上是工作的,但请注意如何打开新选项卡/页面/窗口。