在两个窗口之间切换时遇到问题。 场景如下: 我打开应用程序的登录页面,然后单击登录链接,打开一个弹出窗口,输入凭据,然后单击登录按钮(此处弹出窗口自动关闭)。之后我必须回到原始窗口,继续执行其他操作,因为我已登录到应用程序。 问题是,经常发生这种情况,我无法切换回父窗口,弹出窗口自动关闭后,它只是悬挂的webdriver,没有做任何事情,也没有抛出错误。
我已经尝试过在谷歌上找到的各种解决方案,但没有任何真正有效的方法。 我尝试过的最后一段代码如下:
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();
我使用Firefox 47.0.1和Selenium 2.53.1
任何想法我怎么能解决这个问题? 谢谢!
答案 0 :(得分:0)
在点击登录链接之前获取父窗口
String parentWindowHandle = driver.getWindowHandle();
点击登录链接后切换到新窗口(这只是其中一种方法)
for (String handle : driver.getWindowHandles()) {
driver.switchTo().window(handle);
}
完成登录后,返回父窗口
driver.switchTo().window(secondWinHandle);
答案 1 :(得分:0)
代码中使用的逻辑似乎存在问题。当你使用: Iterator 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();