c# - 使用 Selenium 使用 WindowHandles 跟踪和迭代选项卡和窗口的最佳方法

标签 c# selenium selenium-webdriver webdriverwait window-handles

我们正在与 Selenium webdriver 合作,为 Internet Explorer 11 进行 UI 测试。 在测试的 Web 应用程序中,会弹出几个屏幕。在一些测试中,我们最终得到了三个浏览器窗口,因此也得到了三个 Driver.WindowHandles。 为了从一个 WindowHandle 切换到另一个,我们期望 Driver.WindowHandles 的排序方式是最旧的窗口在前,最新的窗口在最后。但事实并非如此:它完全是随机的!

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

对于这么简单的事情来说,似乎需要做很多工作。有没有更好的解决方案?

最佳答案

你说得非常正确:

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 ,然后每次打开新选项卡/窗口时收集窗口句柄,最后迭代窗口句柄和 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
<小时/>

片尾

您可以找到基于Open web in new tab Selenium + Python中的讨论

关于c# - 使用 Selenium 使用 WindowHandles 跟踪和迭代选项卡和窗口的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59840088/

相关文章:

javascript - 如何使用 ASP.NET Core 2.1 和 React JS 创建下载功能?

c# - 使用 npoi 单元格范围地址读取 excel

excel - 如何通过 Selenium VBA 向某些 HTML 元素发送文本?

python - XPath : is it possible? (Python) 中的累加器

c# - 需要帮助理解 C# 泛型

c# - UIA 自定义条件

python - 为什么我在 selenium 中找不到带有占位符的输入元素?

java - Selenium 在 Firefox 浏览器窗口中运行一些测试时出现 "Can' t 查找配置文件目录错误

python - 从 PHP 脚本在 Python 中调用 Webdriver 时,Firefox 无法打开

java - 从选择 ul 获取文本