Home  >  Q&A  >  body text

Best way to track and iterate over tabs and windows using WindowHandles using Selenium

We are working with Selenium webdriver for UI testing for Internet Explorer 11. In the test web application, several screens pop up. In some tests we ended up with three browser windows and therefore three Driver.WindowHandles. To switch from one WindowHandle to another, we expect Driver.WindowHandles to be sorted with the oldest window first and the newest window last. But that's not the case: it's completely random!

Because windowhandle is a GUID, we end up creating a dictionary with the WindowHandle GUID as the key and the value as the value for the type of page loaded in the browser window. But this will also cause the dictionary to be maintained when the window is closed.

Seems like a lot of work for such a simple thing. Is there a better solution?

P粉744691205P粉744691205371 days ago695

reply all(1)I'll reply

  • P粉986937457

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

    You are absolutely right:

    In a discussion, Simon clearly mentioned:

    So we will raise WebDriverWait, then collect the window handle every time a new tab/window is opened, and finally iterate over the window handle and switchTo().window( newly_opened) As needed:

    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");
        }
    }

    Console output:

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

    other

    You can find discussions based on at Open Web Selenium Python in a new tab

    reply
    0
  • Cancelreply