- Don't have an automated test framework set up? Take a look at a basic one I have for IntelliJ and Eclipse.
For this example, I will be setting up Selenium Grid a Windows 10 box, what I use at home. Feel free to set it up on whatever Mac or Linux/ Unix operating system you have. We aren't going to be doing a deep dive on any of the moving parts. That will come later. This article is focusing on the setup.
Directions can be found on SeleniumHQ's Grid 2 GitHub site: https://github.com/SeleniumHQ/selenium/wiki/Grid2
0. Pre-requisites:
0.1. Knowing how to start your Operating System's Command Line Interface:- PC: If using Windows 10, in the "Search Windows" textbox next to the Start menu, type in: cmd
- Mac: Start the "Terminal".
- PC & Mac: Type in: java -version
1. Setup a Directory for Selenium Server
1.1. Start your Operating System's Command Line Interface:
- PC: Shortcut to Command Prompt: If using Windows 10, in the "Search Windows" textbox next to the Start menu, type in: cmd
- Mac: Start the "Terminal".
1.2. Go to the root directory in the Command Line:
- PC: Type in: cd \
- Mac: Type in: cd /
1.3. Create a folder called "drivers" at the root directory. For this example, this will be the home of Selenium Server.
- PC & Mac: Type in: mkdir drivers
2. Download Selenium Standalone Server
Set up the Selenium Server to run as a Hub.2.1. Get the latest copy of the Selenium Standalone Server, and place it in a folder that is easily accessible.
- Go to the SeleniumHQ Download Page at http://docs.seleniumhq.org/download/
- The link to the current version to download selenium-server-standalone is listed in the Selenium Standalone Server paragraph. At the time of this blog the download version is: 2.53.1
- Right click on the link and select "Save link as..."
- Save this executable Jar File somewhere easy to remember for now. I created for this example a directory called "drivers" on my C: drive and placed selenium-server-standalone-2.53.1.jar there.
2.2 Verify that the file has been created.
- PC: The command "dir" shows the directory listing. Type in: dir \drivers
- Mac: The command "ls" shows the list of files in directory. Type in: ls /drivers
Make sure that the file listed is: selenium-server-standalone-2.53.1.jar
3. Start the Selenium Server
3.1. Go to the directory where Selenium Server is located:
- PC: Type in: cd \drivers
- Mac: Type in: cd /drivers
3.2. Start the Selenium Server:
java -jar selenium-server-standalone-2.53.1.jar -role hub
- Success: Message: Selenium Grid hub is up and running
- Failure: Error messages, plus a huge stack trace and a help file.
Did you get a message such as Java.net.BindException: Address is already in use? That's what happened to me. I may have accidentally double-clicked multiple instances of Selenium Server when writing this documention.
By default, the Selenium Server runs on port 4444. You can shut down a Selenium Server that failed by running:
Or, you can just choose another port to use. Take a note of what you are using, such as port 4445:
java -jar selenium-server-standalone-2.53.1.jar -role hub -port 4445
3.3. Verify that the Selenium Server has started:
- Open up your favorite browser and go to: http://localhost:4444/
- Check that you see:
"Find help on the official selenium wiki : more help here
"default monitoring page : console"
- Select the link to the console.
Congratulations! It's a Selenium Hub! |
4. Setup a Selenium Node
4.1 Start Selenium Node
- Open a new Command Line Interface, go to the drivers directory, and enter:
java -jar selenium-server-standalone-2.53.1.jar -role node -hub http://localhost:4444/grid/register
You will see a message that the node is ready for use!
Let's verify that:
My Windows 10 Machine |
These are all the browsers on the machine you are using at the moment. Since I'm using as an Operating System Windows 10, that is what is listed.
Disregard the "Remote Control (legacy)" browsers those are for an earlier version, Selenium RC.
We can spin up three types of browsers for our automated test framework. Hover your cursor over them to see the browser names. We will need them later.
Hook Up Selenium Grid with Your Automation Framework
What? Don't have an automated test framework ready to go? Not sure of what one is? Follow one of these links to walk you through setting up a new Gradle Java product, the Java Gradle plugin, setting up dependencies, creating browser tests in Firefox and Chrome, and how to match values using Hamcrest:Let's write a very quick-and-dirty WebDriver test to get us going:
@Test public void test_FirefoxNavigatesToLoginPage() throws Exception { driver = new FirefoxDriver(); driver.get("http://the-internet.herokuapp.com/login"); assertThat(driver.getTitle(), is(equalTo("The Internet"))); }
The test:
- Goes to Dave Haeffner's test site, http://the-internet.herokuapp.com/login
- Opens up a new Firefox browser on your local machine
- Asserts that the title is "The Internet".
If we make the driver we are using an instance of RemoteWebDriver instead of just WebDriver, we get a lot more flexibility. You can open up browsers on other environments than on your local machine. If you are on a Mac, you can set up and use browser nodes on a PC or a Linux machine in your automated tests. All you would need to do is pass along the location of your Selenium Hub (in this case, "http://192.168.1.5:5555/wd/hub").
You can also set up, once you have the browser nodes, the corresponding Desired Capabilities, setting up the:
- Browsers: Chrome, Firefox, MS Edge, Android, etc.
- Browser name, what you want to call the browser configuration you are setting up.
- Platform, whether generic Windows, Win8, Win10, generic Mac, Mountain Lion, El Capitan, etc.
Remember, unless you are using Sauce Labs preset nodes, you need to have a machine with the pre-existing capabilities.
See https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities for a complete list.
Let's do the same test again, but this time, call a RemoteWebDriver in a setup method and handle the desired capabilities there.
public class LoginPageTest { private RemoteWebDriver driver; @Before public void setUp() throws Exception { DesiredCapabilities capabilities = DesiredCapabilities.firefox(); capabilities.setBrowserName("firefox"); capabilities.setPlatform(Platform.WIN10); driver = new RemoteWebDriver(new URL("http://192.168.1.5:5555/wd/hub"), capabilities); } @Test public void test_FirefoxGridNavigatesToLoginPage() throws Exception { driver.get("http://the-internet.herokuapp.com/login"); assertThat(driver.getTitle(), is(equalTo("The Internet"))); } @After public void closeBrowsers() throws Exception { driver.quit(); } }... And the test passed!
Coming up in the next few weeks, now that we have the basics, we'll build on that:
- We covered the basics of Docker, and the basics of Selenium Grid. Next up: We combine the two!
- We add Selenium Grid to the automated testing framework w/ Gradle we started building in IntelliJ and Eclipse, refactoring the DesiredCapabilities into its own library.
- We add multi-threading to the automated test framework, so we can run tests in parallel.
Happy Testing, and have a Happy Fourth of July!
-T.J. Maher
Sr. QA Engineer,
Fitbit-Boston
// QA Engineer since Aug. 1996
// Automation developer for [ 1.5 ] years and still counting!
// Check out Adventures in Automation out on Facebook!
No comments:
Post a Comment