使用 Selenium 使用 WindowHandles 跟踪和遍历选项卡和 windows 的最佳方法

Best way to keep track and iterate through tabs and windows using WindowHandles using Selenium

我们正在使用 Selenium webdriver 为 Internet Explorer 11 进行 UI 测试。 在经过测试的 Web 应用程序中,弹出了几个屏幕。在几个测试中,我们最终得到了三个浏览器 windows,因此也是三个 Driver.WindowHandles。 要从一个 WindowHandle 切换到另一个 WindowHandle,我们希望 Driver.WindowHandles 会像最旧的 windows 排在第一位和最新的 windows 最后一样排序。但事实并非如此:它完全是随机的!

因为 windowhandle 是 GUID 我们最终创建了一个字典,其中 WindowHandle GUID 作为键,页面类型的值为在浏览器中加载window。 但这也会导致在例如关闭 window 时维护字典。

这么简单的事情,工作量似乎很大。对此有更好的解决方案吗?

你说的很对:

WindowHandles would be sorted like the oldest windows first and the newest windows last. But this is not the case: It is totaly random!

在一次讨论中,Simon 明确提到:

While the datatype used for storing the list of handles may be ordered by insertion, the order in which the WebDriver implementation iterates over the window handles to insert them has no requirement to be stable. The ordering is arbitrary.

所以,我们会归纳一个WebDriverWait,然后在每次打开一个新的tab/window时收集window句柄,最后迭代根据需要通过 window 句柄和 switchTo().window(newly_opened)

Please adjust the Test Environment if needed [My configuration - Selenium: 3.5.3, IEDriverServer: 3.5.0.0 (64-bit), IE: v10.0]

Java:

package demo;

import java.util.Iterator;
import java.util.Set;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class NEW_TAB_Handling {

    public static void main(String[] args)  {


        System.setProperty("webdriver.ie.driver", "C:\Utility\BrowserDrivers\IEDriverServer.exe");
        WebDriver driver =  new InternetExplorerDriver();
        driver.get("http://www.google.com");
        String first_tab = driver.getWindowHandle();
        System.out.println("Working on Google");
        ((JavascriptExecutor) driver).executeScript("window.open('http://facebook.com/');");
        WebDriverWait wait = new WebDriverWait(driver,5);
        wait.until(ExpectedConditions.numberOfWindowsToBe(2));
        Set<String> s1 = driver.getWindowHandles();
        Iterator<String> i1 = s1.iterator();
        while(i1.hasNext())
        {
            String next_tab = i1.next();
            if (!first_tab.equalsIgnoreCase(next_tab))
            {
                driver.switchTo().window(next_tab);

                System.out.println("Working on Facebook");
            }
        }
        String second_tab = driver.getWindowHandle();
        ((JavascriptExecutor) driver).executeScript("window.open('http://youtube.com/');");
        wait.until(ExpectedConditions.numberOfWindowsToBe(3));
        Set<String> s2 = driver.getWindowHandles();
        Iterator<String> i2 = s2.iterator();
        while(i2.hasNext())
        {
            String next_tab = i2.next();
            if (!first_tab.equalsIgnoreCase(next_tab) && !second_tab.equalsIgnoreCase(next_tab))
            {
                driver.switchTo().window(next_tab);
                System.out.println("Working on Youtube");
            }
        }
        driver.quit();
        System.out.println("Quit the WebDriver instance");
    }
}

控制台输出:

Working on Google
Working on Facebook
Working on Youtube
Quit the WebDriver instance

结尾

您可以找到 based discussion in