无法从自动关闭的子窗口切换回父窗口

时间:2016-10-03 08:39:30

标签: java selenium firefox webdriver window

在两个窗口之间切换时遇到问题。 场景如下: 我打开应用程序的登录页面,然后单击登录链接,打开一个弹出窗口,输入凭据,然后单击登录按钮(此处弹出窗口自动关闭)。之后我必须回到原始窗口,继续执行其他操作,因为我已登录到应用程序。 问题是,经常发生这种情况,我无法切换回父窗口,弹出窗口自动关闭后,它只是悬挂的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

任何想法我怎么能解决这个问题? 谢谢!

2 个答案:

答案 0 :(得分:0)

  1. 在点击登录链接之前获取父窗口

    String parentWindowHandle = driver.getWindowHandle();
    
  2. 点击登录链接后切换到新窗口(这只是其中一种方法)

     for (String handle : driver.getWindowHandles()) {
        driver.switchTo().window(handle);
    }
    
  3. 完成登录后,返回父窗口

    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();