一尘不染

使用Selenium的WindowHandles跟踪选项卡和窗口并进行迭代的最佳方法

c#

我们正在与Selenium Webdriver一起为Internet Explorer
11进行UI测试。在经过测试的Web应用程序中,弹出几个屏幕。在几次测试中,我们最终得到三个浏览器窗口,因此还有三个Driver.WindowHandles。要从一个WindowHandle切换到另一个WindowHandle,我们希望将Driver.WindowHandles排序为最旧的窗口优先,最新的窗口最后。但是事实并非如此:这完全是随机的!

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

对于这样一个简单的事情,这似乎是很多工作。有更好的解决方案吗?


阅读 795

收藏
2020-05-19

共1个答案

一尘不染

您说的很正确:

WindowHandles的排序方式将像最旧的窗口在前,最新的窗口在后。但是事实并非如此:这完全是随机的!

在讨论中,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)根据需要遍历窗口句柄:

请调整Test Environment如果需要的话[我的配置- Selenium :3.5.3IEDriverServer
:3.5.0.0(64位)
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

奥托罗

您可以在新标签Selenium + Python中的Open
web中
找到基于python的讨论

2020-05-19