搜尋

首頁  >  問答  >  主體

使用 Selenium 使用 WindowHandles 追蹤和迭代選項卡和視窗的最佳方法

我們正在與 Selenium webdriver 合作,為 Internet Explorer 11 進行 UI 測試。 在測試的 Web 應用程式中,會彈出幾個畫面。在一些測試中,我們最終得到了三個瀏覽器窗口,因此也得到了三個 Driver.WindowHandles。 為了從一個 WindowHandle 切換到另一個,我們期望 Driver.WindowHandles 會按照最舊的視窗在前、最新的視窗在後的方式進行排序。但事實並非如此:它完全是隨機的!

因為 windowhandle 是一個 GUID,所以我們最終建立了一個字典,其中 WindowHandle GUID 作為鍵,其值為瀏覽器視窗中載入的頁面類型的值。 但這也會導致在關閉視窗時維護字典。

對於這麼簡單的事情來說,似乎需要做很多工作。有沒有更好的解決方案?

P粉744691205P粉744691205419 天前749

全部回覆(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
  • 取消回覆