首页  >  问答  >  正文

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

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

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

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

P粉744691205P粉744691205319 天前651

全部回复(1)我来回复

  • P粉986937457

    P粉9869374572023-11-05 16:56:30

    你说得非常正确:

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

    因此,我们将引发 WebDriverWait ,然后每次打开新选项卡/窗口时收集窗口句柄,最后迭代窗口句柄和 switchTo().window(newly_opened) 根据需要:

    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

    其他

    您可以在以下位置找到基于 的讨论在新选项卡中打开 Web Selenium + Python

    回复
    0
  • 取消回复