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

We are working with Selenium webdriver to make UI tests for Internet Explorer 11. Several screens appeared in the tested web application. In several tests, we end with three browser windows, as well as three Driver.WindowHandles. To switch from one WindowHandle to another, we expected Driver.WindowHandles to be sorted like the oldest windows and the most recent windows. But this is not so: this is a random case!

Since the window descriptor is a GUID, we created a dictionary with a WindowHandle GUID as a key with the value of the page type that loads in the browser window. But it also leads to saving the dictionary when closing the window, for example.

This seems like a lot for such a simple question. Is there a better solution for this?

+4
source share
1 answer

You are absolutely right when you say:

WindowHandles will sort both the oldest windows first and the newest windows last. But this is not so: it is completely accidental!

In the 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 call WebDriverWaitand then collect window handles every time we open a new tab / window, and finally iterate over window handles and switchTo().window(newly_opened), as necessary:

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<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

Outro

Open web Selenium + Python

+1

All Articles