Selecting Popup Windows in Selenium

This example shows how to start a Selenium Server and run a Selenium client in Java. The example opens up a popup window by clicking on the link in index.html. It then selects the popup window by first using the "name=popupWindowName" option for selectWindow. It then grabs the original window (using "name=null"). And, finally, it grabs the popup again by using the global javascript variable option in selectWindow ("var=popupWindowVar").

In order to run this test, you will need the following three jar files on your classpath.

  • junit-4.8.2.jar
  • selenium-java-2.17.0.jar
  • selenium-server-standalone-2.17.0.jar

Unit Test

package org.example;

import static org.junit.Assert.assertEquals;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.server.RemoteControlConfiguration;
import org.openqa.selenium.server.SeleniumServer;

import com.thoughtworks.selenium.DefaultSelenium;

public class SeleniumIntegrationTest {
	private static SeleniumServer server = null;
	private DefaultSelenium selenium = null;

	@BeforeClass
	public static void oneTimeSetUp() throws Exception {
		// Create a configuration to override defaults.
		RemoteControlConfiguration rcc = new RemoteControlConfiguration();
		rcc.setTimeoutInSeconds(60);
		rcc.setPort(4444);
		rcc.setSingleWindow(true); // Support Popups
		rcc.setTrustAllSSLCertificates(true); // Trust SSL

		// Start the Selenium Server.
		server = new SeleniumServer(false, rcc);
		server.start();
	}

	@AfterClass
	public static void oneTimeTearDown() throws Exception  {
		server.stop();
	}

	@Before
	public void setUp() throws Exception {
//		// Create a Selenium thread.
//		// Open in Chrome
//		selenium = new DefaultSelenium("localhost", 4444,
//				"*googlechrome",
//				"http://localhost:8080/GrailsDefault/");
//		// Open in Safari
//		selenium = new DefaultSelenium("localhost", 4444,
//				"*safari C:\\Program Files (x86)\\Safari\\Safari.exe",
//				"http://localhost:8080/GrailsDefault/");
//		// Open in IE
//		selenium = new DefaultSelenium("localhost", 4444,
//				"*iexplore",
//				"http://localhost:8080/GrailsDefault/");
		// Open in Firefox
		selenium = new DefaultSelenium("localhost", 4444,
				"*firefox3",
				"http://localhost:8080/GrailsDefault/");

		// Start the server
		selenium.start();
	}

	@After
	public void tearDown() {
		// Stop the Selenium thread.
		selenium.stop();
	}

	@Test
	public void popupWindowExample() {
		// Open the base window.
		selenium.open("index.html");
		assertEquals(selenium.getTitle(), "Popup Window Example");

		// Click button to popup new window.
		selenium.click("id=popupButton");
		// Select the popup window.
		// popupWindowID is the ID given in the window.open javascript.
		selenium.waitForPopUp("popupWindowID", "30000");
		selenium.selectWindow("name=popupWindowID");
		assertEquals(selenium.getTitle(), "Popped Up Window");

		// Click a link to google on the popup.
		selenium.click("link=This link goes to google");
		selenium.waitForPageToLoad("30000");
		assertEquals(selenium.getTitle(), "Google");

		// Select the original window.
		selenium.selectWindow("null");
		assertEquals(selenium.getTitle(), "Popup Window Example");

		// Select the window by a javascript variable.
		selenium.selectWindow("var=popupWindowVar");
		assertEquals(selenium.getTitle(), "Google");
	}

}

index.html

<html>
<head>
<title>Popup Window Example</title>

<script>
function popupNewWindow() {
	window.popupWindowVar = window.open("popup.html", "popupWindowID");
}
function popupNewWindow2() {
	window.popupWindowVar2 = window.open("popup.html", "popupWindowID2");
}
</script>

</head>

<body>
	<div id="header">
		<button id="popupButton" onclick="popupNewWindow()">Popup Window</button>
		<button id="popupButton2" onclick="popupNewWindow2()">Popup Window 2</button>
	</div>
</body>
</html>

popup.html

<html>
<head>
<title>Popped Up Window</title>
</head>

<body>
	<div id="header">
		This is a popup window.
	</div>
	<div id="links">
		<a href="http://www.google.com">This link goes to google</a>.
	</div>
</body>
</html>

I found a bug in the variation of selectWindow that tries to grab the window from a JavaScript variable (i.e "var=foo"). It works in Chrome and IE. However, I could not get it working with Firefox 9.0.1 with Windows 7. The error is below. I've opened up a defect. The bug is listed here: http://code.google.com/p/selenium/issues/detail?id=3270.

com.thoughtworks.selenium.SeleniumException: ERROR: Window does not exist. If this looks like a Selenium bug, make sure to read http://seleniumhq.org/docs/04_selenese_commands.html#alerts-popups-and-multiple-windows for potential workarounds.
        at com.thoughtworks.selenium.HttpCommandProcessor.throwAssertionFailureExceptionOrError(HttpCommandProcessor.java:112)
        at com.thoughtworks.selenium.HttpCommandProcessor.doCommand(HttpCommandProcessor.java:106)
        at com.thoughtworks.selenium.DefaultSelenium.selectWindow(DefaultSelenium.java:370)
        at org.example.SeleniumIntegrationTest.popupWindowExample(SeleniumIntegrationTest.java:99)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)