Selenium WebDriver .getWindowHandles()返回先前关闭的窗口,如何区分这些窗口和活动窗口?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Selenium WebDriver .getWindowHandles()返回先前关闭的窗口,如何区分这些窗口和活动窗口?相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个循环打开窗口的函数,并根据窗口标题切换到特定的窗口。这适用于前几个窗口,但我自动化的网站利用几个弹出窗口自动关闭操作,如“下一步”按钮,这些句柄似乎在窗口关闭后继续存在。

因此,当我尝试切换到窗口检查其标题时,脚本超时,因为WebDriver无法切换到不存在的窗口。它不会抛出NoSuchWindowException,这很奇怪。

下面是我遍历窗口和按标题切换的方法

public String switchByTitle(String title)
{
    boolean isPage = false;
    String neededHandle = null;

    while(isPage == false)
    {
        for (String winHandle : driver.getWindowHandles())
        {
            try 
            {
                //vvv timeout occurs here vvv
                driver.switchTo().window(winHandle);
                if (driver.switchTo().window(winHandle).getTitle().equals(title))
                {
                    isPage = true;
                    neededHandle = winHandle;
                    break;
                }
            }   
            catch (NoSuchWindowException e)
            {
                continue;
            }
        }
    }
    return neededHandle;
}

更新不理想但我找到了一个解决方法

public String switchByTitle(String title)
    {
        boolean isPage = false;
        String neededHandle = null;
        WebDriverWait wait = new WebDriverWait(driver, 5);

        while(isPage == false)
        {
            for (String winHandle : driver.getWindowHandles())
            {
                try
                {   
                    //shortened timeout to 5 seconds        
                    driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
                    driver.switchTo().window(winHandle);
                    if (driver.switchTo().window(winHandle).getTitle().equals(title))
                    {
                        isPage = true;
                        neededHandle = winHandle;
                        break;
                    }
                }
                catch (NoSuchWindowException e)
                {
                    continue;
                }   
                //added timeout exception
                catch (org.openqa.selenium.TimeoutException e)
                {
                    continue;
                }
            }
        }
        //reset timeout
        driver.manage().timeouts().pageLoadTimeout(1800, TimeUnit.SECONDS);
        return neededHandle;
    }
答案

用它作为解决方法:

public String switchByTitle(String title)
    {
        boolean isPage = false;
        String neededHandle = null;
        WebDriverWait wait = new WebDriverWait(driver, 5);

        while(isPage == false)
        {
            for (String winHandle : driver.getWindowHandles())
            {
                try
                {   
                    //shortened timeout to 5 seconds        
                    driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
                    driver.switchTo().window(winHandle);
                    if (driver.switchTo().window(winHandle).getTitle().equals(title))
                    {
                        isPage = true;
                        neededHandle = winHandle;
                        break;
                    }
                }
                catch (NoSuchWindowException e)
                {
                    continue;
                }   
                //added timeout exception
                catch (org.openqa.selenium.TimeoutException e)
                {
                    continue;
                }
            }
        }
        //reset timeout
        driver.manage().timeouts().pageLoadTimeout(1800, TimeUnit.SECONDS);
        return neededHandle;
    }

以上是关于Selenium WebDriver .getWindowHandles()返回先前关闭的窗口,如何区分这些窗口和活动窗口?的主要内容,如果未能解决你的问题,请参考以下文章

Selenium Webdriver概述

appium的webdriver和selenium有啥区别?

selenium之python源码解读-webdriver继承关系

From  selenium  import  webdriver

Selenium WebDriver(Python)API

selenium+python - webdriver​模拟键盘ENTER没有效果