Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法从自动关闭的子窗口切换回父窗口_Java_Selenium_Firefox_Webdriver_Window - Fatal编程技术网

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

Java 无法从自动关闭的子窗口切换回父窗口,java,selenium,firefox,webdriver,window,Java,Selenium,Firefox,Webdriver,Window,在两个窗口之间切换时出现问题。场景如下所示: 我打开应用程序的登录页,然后单击登录链接,弹出窗口打开,我键入凭据,然后单击登录按钮(此处弹出窗口自动关闭)。之后,我必须回到原来的窗口,并继续进行其他操作,因为我已经登录到应用程序。 问题是,我经常无法切换回父窗口,在弹出窗口自动关闭后,webdriver将其挂起,不做任何操作,不会抛出错误 我已经尝试过谷歌上的各种解决方案,但一直没有什么真正有效的。 我尝试的最后一段代码如下: getLandingPageObject().performClic

在两个窗口之间切换时出现问题。场景如下所示: 我打开应用程序的登录页,然后单击登录链接,弹出窗口打开,我键入凭据,然后单击登录按钮(此处弹出窗口自动关闭)。之后,我必须回到原来的窗口,并继续进行其他操作,因为我已经登录到应用程序。 问题是,我经常无法切换回父窗口,在弹出窗口自动关闭后,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();
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().问题是在弹出窗口之后