Best way to keep track and iterate through tabs and windows using WindowHandles using Selenium

前端 未结 1 1117
-上瘾入骨i
-上瘾入骨i 2020-11-22 06:37

We are working with Selenium webdriver to make UI tests for Internet Explorer 11.  In the tested webapplication there are several screens popping up. In several tests we end

1条回答
  •  旧巷少年郎
    2020-11-22 07:27

    You are pretty correct when you say:

    WindowHandles would be sorted like the oldest windows first and the newest windows last. But this is not the case: It is totaly random!

    In a discussion, Simon clearly mentioned that:

    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.

    So, we will induce an WebDriverWait and then collect the window handles every time we open a new tab/window and finally iterate through the window handles and switchTo().window(newly_opened) as required:

    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 s1 = driver.getWindowHandles();
            Iterator 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 s2 = driver.getWindowHandles();
            Iterator 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");
        }
    }
    

    Console Output:

    Working on Google
    Working on Facebook
    Working on Youtube
    Quit the WebDriver instance
    

    Outro

    You can find the python based discussion in Open web in new tab Selenium + Python

    0 讨论(0)
提交回复
热议问题