Java 无法从自动关闭的子窗口切换回父窗口
在两个窗口之间切换时出现问题。场景如下所示: 我打开应用程序的登录页,然后单击登录链接,弹出窗口打开,我键入凭据,然后单击登录按钮(此处弹出窗口自动关闭)。之后,我必须回到原来的窗口,并继续进行其他操作,因为我已经登录到应用程序。 问题是,我经常无法切换回父窗口,在弹出窗口自动关闭后,webdriver将其挂起,不做任何操作,不会抛出错误 我已经尝试过谷歌上的各种解决方案,但一直没有什么真正有效的。 我尝试的最后一段代码如下:Java 无法从自动关闭的子窗口切换回父窗口,java,selenium,firefox,webdriver,window,Java,Selenium,Firefox,Webdriver,Window,在两个窗口之间切换时出现问题。场景如下所示: 我打开应用程序的登录页,然后单击登录链接,弹出窗口打开,我键入凭据,然后单击登录按钮(此处弹出窗口自动关闭)。之后,我必须回到原来的窗口,并继续进行其他操作,因为我已经登录到应用程序。 问题是,我经常无法切换回父窗口,在弹出窗口自动关闭后,webdriver将其挂起,不做任何操作,不会抛出错误 我已经尝试过谷歌上的各种解决方案,但一直没有什么真正有效的。 我尝试的最后一段代码如下: getLandingPageObject().performClic
getLandingPageObject().performClickOnEmailLink();
getDriver().manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
Iterator<String> it = handles.iterator();
// iterate through your windows
while (it.hasNext()) {
String parent = it.next();
String newwin = it.next();
getDriver().switchTo().window(newwin);
typeLoginCredentials(username, password);
performClickOnLoginButton();
Thread.sleep(5000);
getDriver().switchTo().window(parent);
}
}
loginShouldBeSuccessful();
getLandingPageObject().performClickOnEmailLink();
getDriver().manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
迭代器it=handles.Iterator();
//遍历你的窗口
while(it.hasNext()){
字符串parent=it.next();
字符串newwin=it.next();
getDriver().switchTo().window(newwin);
TypeLoginRedentials(用户名、密码);
performClickOnLoginButton();
睡眠(5000);
getDriver().switchTo().window(父窗口);
}
}
登录必须成功();
我使用Firefox 47.0.1和Selenium 2.53.1
你知道我该怎么解决这个问题吗?
谢谢大家!
String parentWindowHandle = driver.getWindowHandle();
driver.switchTo().window(secondWinHandle);
String parentWindowHandle = driver.getWindowHandle();
driver.switchTo().window(secondWinHandle);
String parentWindowHandle = driver.getWindowHandle();
driver.switchTo().window(secondWinHandle);
String parentWindowHandle = driver.getWindowHandle();
driver.switchTo().window(secondWinHandle);
代码中使用的逻辑似乎有问题。使用时: 迭代器it=handles.Iterator() 打开的窗口数为2,所以无论在其中执行什么操作(即登录和自动关闭窗口),条件循环都将执行两次 在第二次迭代中,父窗口句柄将被覆盖,驱动程序无法再切换到它 为了避免这种情况,您必须在循环外部或内部提取并存储父窗口句柄一次。下面粘贴了第一个解决方案的修改代码段。正在移动
String parent = it.next();
循环外部捕获父窗口句柄并保留值
Iterator<String> it = handles.iterator();
String parent = it.next();
// iterate through your windows
while (it.hasNext()) {
String newwin = it.next();
getDriver().switchTo().window(newwin);
typeLoginCredentials
(username,password);
performClickOnLoginButton();
Thread.sleep(5000);
}
getDriver().switchTo().window(newwin);
loginShouldBeSuccessful();
Iterator it=handles.Iterator();
字符串parent=it.next();
//遍历你的窗口
while(it.hasNext()){
字符串newwin=it.next();
getDriver().switchTo().window(newwin);
类型索引
(用户名、密码);
performClickOnLoginButton();
睡眠(5000);
}
getDriver().switchTo().window(newwin);
登录必须成功();
代码中使用的逻辑似乎有问题。使用时:
迭代器it=handles.Iterator()
打开的窗口数为2,所以无论在其中执行什么操作(即登录和自动关闭窗口),条件循环都将执行两次
在第二次迭代中,父窗口句柄将被覆盖,驱动程序无法再切换到它
为了避免这种情况,您必须在循环外部或内部提取并存储父窗口句柄一次。下面粘贴了第一个解决方案的修改代码段。正在移动
String parent = it.next();
循环外部捕获父窗口句柄并保留值
Iterator<String> it = handles.iterator();
String parent = it.next();
// iterate through your windows
while (it.hasNext()) {
String newwin = it.next();
getDriver().switchTo().window(newwin);
typeLoginCredentials
(username,password);
performClickOnLoginButton();
Thread.sleep(5000);
}
getDriver().switchTo().window(newwin);
loginShouldBeSuccessful();
Iterator it=handles.Iterator();
字符串parent=it.next();
//遍历你的窗口
while(it.hasNext()){
字符串newwin=it.next();
getDriver().switchTo().window(newwin);
类型索引
(用户名、密码);
performClickOnLoginButton();
睡眠(5000);
}
getDriver().switchTo().window(newwin);
登录必须成功();
检查您是否没有自动切换,或者查看是否可以在没有任何参数的情况下调用window方法。我不会自动切换,我需要使用window方法的参数键入不同的凭据才能登录到应用程序。我上面发布的代码可以正常工作,但并非始终有效(有时在弹出窗口关闭后,主窗口会挂起而不做任何事情),我不明白为什么。@拉里萨,在导致弹出窗口自动关闭的操作之后,尝试driver.SwitchTo().defaultContent()。@SandipanPramanik没有使用driver.SwitchTo().defaultContent()。问题是,在弹出窗口自动关闭后,主窗口将加载一个新的URL,与单击按钮提示弹出窗口之前的URL不同。这与此有关?另一个问题是,我的测试被参数化为使用4种不同类型的帐户运行,这意味着4个浏览器实例ts同时在我的本地计算机上。在windows之间切换时可能会出现问题吗?请检查您是否未自动切换,或者查看是否可以在没有任何参数的情况下调用window方法。我不会自动切换,我需要使用window方法的参数键入不同的凭据才能登录到应用程序。Th我上面发布的一段代码可以正常工作,但并非始终有效(有时在弹出窗口关闭后,主窗口什么也不做就挂起了),我不明白为什么。@Larisa,在导致弹出窗口自动关闭的操作之后,尝试driver.SwitchTo().defaultContent()。@SandipanPramanik没有使用driver.SwitchTo().defaultContent().问题是在弹出窗口之后