Selenium Tips: Working with Multiple Windows

Posted by Matthew Heusser in Selenium Resources

One common Selenium issue is dealing with popup windows. You might also want to create your own new windows to do something in a shared session. For example: To create a new account, the pop back to the original page to see that the javascript has updated to ‘see’ this new ‘friend’ appears on a friends list.

For multiple window tasks, Selenium IDE provides the following commands:

  • openWindow(url, windowId): Will open your new window
  • waitForPopup(windowId, timeout): Will wait for the window to be opened and loaded
  • selectwindow(windowId): Will focus on this windows and any future actions will act on it

We could, then create the above test using Selenium IDE to run on http://google.com:

open /
type q sauce labs
click btnG
waitForTextPresent Sauce Labs
openWindow /search?q=santiago santiago
waitForPopUp santiago 30000
selectWindow santiago
assertTitle santiago - Google Search
selectWindow null
assertTitle sauce labs - Google Search

However, the IDE won't be able to play back that test as written. Let’s look at some code that does the same thing with webdriver3, created in Java and capable of running on Sauce OnDemand.

      System.setProperty("webdriver.chrome.driver","./chromedriver");

      WebDriver driver = new org.openqa.selenium.chrome.ChromeDriver(); 

      // And now use this to visit Google
      driver.get("https://www.google.com/");
      driver.findElement(By.id("gb")).click();
      driver.findElement(By.name("q")).click();
      driver.findElement(By.name("q")).clear();
      driver.findElement(By.name("q")).sendKeys("sauce labs");
      driver.findElement(By.name("q")).sendKeys(Keys.ENTER);

      ((JavascriptExecutor) driver).executeScript("window.open('https://www.google.com/search?q=Santiago')");
      Set <String> handles = driver.getWindowHandles();
      String firstWindowHandle = driver.getWindowHandle();
      handles.remove(firstWindowHandle);
      driver.switchTo().window(firstWindowHandle);

      System.out.println("Page title is: " + driver.getTitle());

      String secondWindowHandle = handles.iterator().next();
      driver.switchTo().window(secondWindowHandle);
      System.out.println("Page title is: " + driver.getTitle());

      driver.quit();
   }

This slightly different code, expressed in java, opens the window and does the parallel work that you expected it to do. Best of all, the tip is available in git, along with all of the dependencies and the build and run scripts for linux and macintosh. Windows users may need to add a .bat extension or change the parameters slightly as expressed in the README.md, which also contains links in case the dependencies become out of date.

Of course, you can think of webdriver as an API and write this in any language webdriver supports, like Ruby, C#, or node.js. The function names will be essentially the same, using the variable types and capitalization/underscore appropriate for the language. You can also use the selectWindowHandle() syntax to grab popup windows.

Did you find this tip useful? Need some help adapting this to your needs? Let us know in the comments! Until next time, happy testing!



Discuss: Selenium Tips: Working with Multiple Windows
0 Comments

Free Trial

Get access to a free 14-day trial version, or contact Sales for more information.