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

Posted

技术标签:

【中文标题】使用 Selenium 使用 WindowHandles 跟踪和迭代选项卡和窗口的最佳方法【英文标题】:Best way to keep track and iterate through tabs and windows using WindowHandles using Selenium 【发布时间】:2018-02-25 08:23:47 【问题描述】:

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

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

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

【问题讨论】:

我对 C# 不太熟悉,但可以通过 Java 构建答案。这能满足你的问题吗? 是的,没问题。 【参考方案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): p>

如果需要请调整Test Environment [我的配置 - 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 中找到基于python 的讨论

【讨论】:

感谢您的回答。但是当有第三个或第四个窗口时它是如何工作的呢? 嗨 Debanjan,我最初的问题是关于 3 个窗口句柄。所以我不能接受你的答案作为答案。我知道您可以在两个窗口句柄之间切换,但棘手的部分是当有两个以上的句柄时。 @KoenMeijer 用How to handle 3 windowhandles 更新了我的答案。让我知道这是否能回答您的问题。 谢谢 Debanjan,因此您还必须跟踪对象中的所有 WindowHandles。当您关闭窗口时,您还必须移除 winodwhandle。在我看来,对于这么简单的事情要做很多工作。这个问题没有其他解决方案吗?

以上是关于使用 Selenium 使用 WindowHandles 跟踪和迭代选项卡和窗口的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 的 Selenium WebDriver (Selenium 2) 中 selenium.refresh() 的等效代码

请教各位大神,图片中这种下拉菜单如何使用selenium进行选择?

如何使用 Java 在 selenium webdriver 中打开新选项卡,或者如何使用 selenium webdriver 使用动作类在 selenium 中按 ctrl + T [重复]

selenium关于断言的使用

selenium关于断言的使用

selenium关于断言的使用