2016-10-03 91 views
0

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

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

+0

检查您是否未自动切换或查看是否可以在不带任何参数的情况下调用窗口方法。 – lauda

+0

我不会自动切换,我需要使用窗口方法的参数来输入不同的凭据才能登录到应用程序。上面张贴的代码片段可以工作,但不是所有的时间(有时主窗口没有做任何东西,弹出后关闭),我不明白为什么。 – Larisa

+0

@Larisa,尝试driver.SwitchTo()。defaultContent()后导致弹出自动关闭的动作。 –

回答

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

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

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

    driver.switchTo().window(secondWinHandle); 
    
+0

我也试过,但没有工作。可能是等待的问题? – Larisa

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

我也尝试过这种方法,但是在切换到父窗口后,仍然不时地挂着驱动程序窗口,而没有做任何事情。我试图等待超过5秒钟,但没有。自动关闭登录弹出窗口后,父窗口会加载一个新的URL。有可能最初存储的名称在新URL加载后更改? (我的意思是这个* String parent = it.next(); *) – Larisa

+0

是否有任何异常抛出?如果这是一个同步问题,你可能不想使用Thread.sleep。你也可以尝试的是在循环之后获取所有窗口句柄并切换到第一个窗口句柄。您可以在之前和之后执行窗口句柄的sysout,以查看是否有任何更改。如果没有,那么这是一个正确同步脚本的问题。 – Sai

+0

没有异常抛出。我也尝试在循环之后获取所有窗口,但有时driver.getWindowHandles()没有给出结果。但是当它工作时,没有任何变化。除了删除Thread.sleep之外,还有其他方法可以解决syncronization吗? – Larisa