硒中的多个选项卡

时间:2019-08-06 05:04:37

标签: java selenium-webdriver

我在这里有一个问题,请您解释一下。

为什么在打开第二个和第三个窗口的过程中,我们按照下面的方法调用getWindowHandles

win = driver.getWindowHandles();
iterate = win.iterator();
first_window = iterate.next();
System.out.println(first_window);  // first handle
second_window = iterate.next();
System.out.println(second_window);  // second handle

在第三个窗口操作期间我们不能直接调用以下内容

String Third_window = iterate.next();
System.out.println(Third_window);
driver.switchTo().window(Third_window);

1 个答案:

答案 0 :(得分:0)

每当您在Web应用程序中浏览多个窗口时,我们都需要使用getWindowHandles()方法处理多个窗口。该窗口将返回每个窗口的唯一字母数字ID(字符串对象),这些窗口是通过使用Webdriver对象的任何链接/按钮单击而打开,关联或实例化的。

getWindowHandles()返回所有当前窗口的窗口句柄列表。

因此,每当您在驱动程序对象上调用getWindowHandles()时。它存储了所有打开的窗口的唯一窗口句柄,包括父窗口句柄。您可以在内部循环中逐个切换到每个窗口,并查找特定的Web元素,如果找到,则可以在该窗口上工作(在您的第3个窗口中)。这样一来,您将确保您的代码将在正确的窗口上运行,而不仅仅是基于假定的窗口编号。此外,您还需要存储父窗口句柄,以便在其他窗口上完成工作后可以切换回去。 / p>

代码:

String parentWindowHandle = driver.getWindowHandle();
Set<String> childWindows = driver.getWindowHandles();
Iterator<String> iterator = childWindows.iterator();


while(iterator.hasNext())
{
    String child = iterator.next();

    if(!child.equalsIgnoreCase(parentWindowHandle))
    {
        driver.switchTo().window(child);
        try
        {
            if (driver.findElement(By.id("id_of_some_element_on_that_window")).isDisplayed())
            {
                break;
            }
        }
        catch(Exception e) // you can catch the specific exoection NoSuchElement or other
        {
            System.out.println("Element not found."+e.getMessage());
        }

    }
}

// rest of code to work on desired window

driver.switchTo().window(parentWindowHandle);

希望这会有所帮助:)