Skip to main content

Running Java Automation Testing Scripts On Selenium Grid using TestNG Framework


LambdaTest Selenium Automation Grid is a cloud-based, scalable Selenium testing platform which enables you to run your automation scripts on 2000+ different browsers and operating systems. You can now run your automation test cases using Java with Selenium on a scalable Selenium infrastructure that is running real browsers and real operating systems.

This post will help you in getting started with configuring and running your Java automation testing scripts on LambdaTest Selenium cloud platform. In this post we would be exploring:

  • How to run test script on LambdaTest grid using Java with Selenium
  • How to specify which browsers to perform Java automation testing on
  • How to run test cases in parallel using Java with Selenium to reduce build times
  • How to test locally hosted pages using Java automation testing
  • How to leverage LambdaTest’s Advanced capabilities

Prerequisites For Running Java With Selenium#


All the code samples in this documentation can be found in the Java LambdaTest Repository on Image GitHub. You can either download or clone the repository to quickly run your tests.

Before you can start performing Java automation testing with Selenium:

  • You would need Java development environment i.e. JDK 1.6 or higher. We recommend using the latest version.
  • You would need latest Selenium Client and it’s WebDriver bindings. You can download latest Selenium client from here https://docs.seleniumhq.org/download/. Latest versions of Selenium Client and WebDriver are ideal for running your automation script on LambdaTest Selenium cloud grid.
  • You would need LambdaTest Tunnel binary file for testing your locally or privately hosted projects.

The first step in using LambdaTest platform is to understand LambdaTest’s Selenium Grid capabilities. Our Selenium Grid uses remote webdriver instead of normal Selenium client browser drivers so if you are migrating from locally run Selenium, you would have to invoke LambdaTest Selenium remote WebDriver. Next, you need to specify in your code, which browser, browser versions, operating systems, and resolution you wish to run your test on, along with defining LambdaTest specific capabilities. You can check out LambdaTest Capabilities Generator tool to understand more about how you can define running browser environments and leverage advanced LambdaTest capabilities.

Getting Started With Java & Selenium#


Let’s start with a simple Selenium Remote Webdriver test first. The Java script below tests a simple to-do application with basic functionalities like mark items as done, add items in a list, calculate total pending items etc. You can also find this at GitHub repository.

Java Todo : Sample App for Java automation testing#

import java.net.MalformedURLException;import java.net.URL;import org.openqa.selenium.By;import org.openqa.selenium.JavascriptExecutor;import org.openqa.selenium.remote.DesiredCapabilities;import org.openqa.selenium.remote.RemoteWebDriver;public class JavaTodo {    String username = "undefined";    String accesskey = "undefined";    static RemoteWebDriver driver = null;    String gridURL = "@hub.lambdatest.com/wd/hub";    boolean status = false;    public static void main(String[] args) {        new JavaTodo().test();    }    public void test() {        // To Setup driver        setUp();        try {              //Change it to production page            driver.get("https://lambdatest.github.io/sample-todo-app/");                           //Let's mark done first two items in the list.              driver.findElement(By.name("li1")).click();            driver.findElement(By.name("li2")).click();                          // Let's add an item in the list.              driver.findElement(By.id("sampletodotext")).sendKeys("Yey, Let's add it to list");            driver.findElement(By.id("addbutton")).click();                           // Let's check that the item we added is added in the list.            String enteredText = driver.findElementByXPath("/html/body/div/div/div/ul/li[6]/span").getText();            if (enteredText.equals("Yey, Let's add it to list")) {                status = true;            }        } catch (Exception e) {            System.out.println(e.getMessage());        } finally {            tearDown();        }    }    private void setUp() {        DesiredCapabilities capabilities = new DesiredCapabilities();        capabilities.setCapability("browserName", "chrome");        capabilities.setCapability("version", "70.0");        capabilities.setCapability("platform", "win10"); // If this cap isn't specified, it will just get any available one.        capabilities.setCapability("build", "LambdaTestSampleApp");        capabilities.setCapability("name", "LambdaTestJavaSample");        try {            driver = new RemoteWebDriver(new URL("https://" + username + ":" + accesskey + gridURL), capabilities);        } catch (MalformedURLException e) {            System.out.println("Invalid grid URL");        } catch (Exception e) {            System.out.println(e.getMessage());        }    }    private void tearDown() {        if (driver != null) {            ((JavascriptExecutor) driver).executeScript("lambda-status=" + status);            driver.quit(); //really important statement for preventing your test execution from a timeout.        }    }}

The Selenium Webdriver test would open a URL, mark the first two items in the list as done, add an item in the list, and return the total number of pending items. Your results would be displayed on the test console (or command-line interface if you are using terminal/cmd) and on LambdaTest dashboard. LambdaTest Dashboard will help you view all your text logs, screenshots and video recording for your entire Selenium tests.

Execute Automation Testing using Java with Selenium#


You would need to execute the below command in your terminal/cmd.

cd to/file/locationcompile the test file: javac -classpath ".:/path/to/selenium/jarfile:" JavaTodo.javaRun the test:  java -classpath ".:/path/to/selenium/jarfile:" JavaTodo

Example:

cd /home/admin1/eclipseworkspace/Demojavac -classpath ".:/home/admin1/eclipseworkspace/Demo/src/selenium-server-standalone-3.14.0.jar:" JavaTodo.javajava -classpath ".:/home/admin1/eclipseworkspace/Demo/src/selenium-server-standalone-3.14.0.jar:" JavaTodo

Understanding & Configuring Java Desired Capabilities#


As we said earlier, the first step is to configure your test scripts to connect with LambdaTest Selenium automation gird. In the above mentioned Java code, the first thing you would notice is the invoking of remote WebDriver instead of the native browser WebDrivers. So for example if you are planning to run on Firefox browser in your local machine, you would be using Firefox browser driver like this:

Local Driver

FirefoxDriver driver = new FirefoxDriver();

However, to run on LambdaTest Selenium grid, you would have to change it remote WebDriver and at the same time pass capabilities related to browser, browser versions etc. In simple terms, it would look something like this:

Remote Web Driver

WebDriver driver = new RemoteWebDriver(new URL("https://" + username + ":" + accesskey + gridURL), capabilities);

In this code, we are passing browser, browser version, and operating system information, along with LambdaTest Selenium grid capabilities via capabilities object. The capabilities object in the above code is defined as:

DesiredCapabilities capabilities = new DesiredCapabilities();        capabilities.setCapability("browserName", "chrome");        capabilities.setCapability("version", "70.0");        capabilities.setCapability("platform", "win10"); // If this cap isn't specified, it will just get the any available one        capabilities.setCapability("build", "LambdaTestSampleApp");        capabilities.setCapability("name", "LambdaTestJavaSample");

The most important capabilities to understand here are ‘browserName’, ‘version’, and ‘platform’. They define which browser environment you wish to run the test on. Rest of the capabilities are important in test management and debugging. We have an inbuilt Capabilities Generator tool as well that you use to generate capabilities code for your test suite.

Advanced LambdaTest Capabilities#


In addition to default Selenium Grid capabilities, LambdaTest also has platform specific capabilities like video recording of test runs, console logs of each test run, network logs of each test run, custom profiles for specific browsers, etc. Do checkout our documentation on LambdaTest Advanced capabilities as well.

Testing Locally Hosted or Privately Hosted Projects#


You can test your locally hosted or privately hosted projects with LambdaTest Selenium grid cloud using LambdaTest Tunnel app. All you would have to do is set up an SSH tunnel using LambdaTest Tunnel app, and pass toggle tunnel = True via desired capabilities. LambdaTest Tunnel establishes a secure SSH protocol based tunnel that allows you in testing your locally hosted or privately hosted pages, even before they are made live.

Refer our LambdaTest Tunnel documentation for more information.

Here’s how you can establish LambdaTest Tunnel.

Download latest LambdaTest Tunnel binary file and extract it.

Download:

Open command prompt and navigate to the binary folder

Run the following command

LT -user {user’s login email} -key {user’s access key}

So if your user name is [email protected] and key is 123456, the command would be

LT -user [email protected] -key 123456

Once you are able to connect LambdaTest Tunnel successfully, you would just have to pass on tunnel capabilities Add the below code snippet into your desired capability.

Tunnel Capability

 DesiredCapabilities capabilities = new DesiredCapabilities();         capabilities.setCapability("tunnel", true);

Mark Tests As Pass or Fail#


By default, LambdaTest platform do not know whether the test that has been executed passes the tests or fails the test. For that, the users have to define pass or fail conditions as assertions in their test execution code and pass on the result to LambdaTest platform via our APIs. This will help you manage your pass and fail results of your test suite at LambdaTest platform.

//LambdaTest Annotation((JavascriptExecutor) driver).executeScript("lambda-status=passed");

Execution of Parallel Testing using Java with Selenium#


One of the most important features of LambdaTest Selenium grid is the ability to run your test cases in parallel. What that means is that if you have more than one concurrent session, you can run your test cases on more than one machine at a time, which greatly cuts down your test times. To put it in perspective, if you have 100 test cases each with an average run time of 1 minute, without parallel testing it would take 100 minutes to execute. However, with 2 concurrent sessions, you can run 2 test cases in parallel at a time and can cut down the build’s test time to 50 minutes. With four concurrent sessions, it would cut down to 25 minutes. With eight, well you got the picture (smile)

This reduced test times now open up possibilities of increasing your test coverage over more browsers and more operating systems.

Test automation frameworks like TestNG and JUnit are really useful in running parallel tests. For instance, in our above example, you may notice that we are running our test in a single environment. If you want to cover multiple environments you would have to change the hard code every time. Or you would have to use arrays, or multi-threading or something similar.

With TestNG however, it’s very easy. You can define which browsers you want to run on in parameters of your test suite file testng.xml and while running test code just use parameter annotations @org.testng.annotations.Parameters(value={“browser”, “version”, “platform”})

Checkout the same code below to understand it better. You can also find it at our GitHub repository.

TestNG Todo : Sample App#

import org.openqa.selenium.By;import org.openqa.selenium.Platform;import org.openqa.selenium.WebDriver;import org.openqa.selenium.remote.DesiredCapabilities;import org.openqa.selenium.remote.RemoteWebDriver;import org.testng.Assert;import org.testng.annotations.AfterClass;import org.testng.annotations.BeforeClass;import org.testng.annotations.Test;import java.net.MalformedURLException;import java.net.URL;  public class TestNGTodo {     public String username = "undefined";    public String accesskey = "undefined";    public static RemoteWebDriver driver = null;    public String gridURL = "@hub.lambdatest.com/wd/hub";    boolean status = false;      @BeforeClass    @org.testng.annotations.Parameters(value={"browser","version","platform"})    public void setUp() throws Exception {       DesiredCapabilities capabilities = new DesiredCapabilities();        capabilities.setCapability("browserName", "chrome");        capabilities.setCapability("version", "70.0");        capabilities.setCapability("platform", "win10"); // If this cap isn't specified, it will just get the any available one        capabilities.setCapability("build", "LambdaTestSampleApp");        capabilities.setCapability("name", "LambdaTestJavaSample");        try {            driver = new RemoteWebDriver(new URL("https://" + username + ":" + accesskey + gridURL), capabilities);        } catch (MalformedURLException e) {            System.out.println("Invalid grid URL");        } catch (Exception e) {            System.out.println(e.getMessage());        }    }      @Test    public void testSimple() throws Exception {       try {              //Change it to production page            driver.get("https://lambdatest.github.io/sample-todo-app/");                           //Let's mark done first two items in the list.              driver.findElement(By.name("li1")).click();            driver.findElement(By.name("li2")).click();                          // Let's add an item in the list.              driver.findElement(By.id("sampletodotext")).sendKeys("Yey, Let's add it to list");            driver.findElement(By.id("addbutton")).click();                           // Let's check that the item we added is added in the list.            String enteredText = driver.findElementByXPath("/html/body/div/div/div/ul/li[6]/span").getText();            if (enteredText.equals("Yey, Let's add it to list")) {                status = true;            }        } catch (Exception e) {            System.out.println(e.getMessage());        }    }      @AfterClass    public void tearDown() throws Exception {       if (driver != null) {            ((JavascriptExecutor) driver).executeScript("lambda-status=" + status);            driver.quit();        }    }}
Here’s the associate testng.xml suite file for performing Java automation testing.

TestNG.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"><suite thread-count="3" name="LambaTestSuite" parallel="tests">   <test name="WIN8TEST">  <parameter name="browser" value="firefox"/>  <parameter name="version" value="62.0"/>  <parameter name="platform" value="WIN8"/>    <classes>      <class name="lambdatest.TestNGTodo "/>    </classes>  </test> <!-- Test -->   <test name="WIN10TEST">  <parameter name="browser" value="chrome"/>  <parameter name="version" value="70.0"/>  <parameter name="platform" value="WIN10"/>    <classes>      <class name="lambdatest.TestNGTodo "/>    </classes>  </test> <!-- Test -->  <test name="MACTEST">  <parameter name="browser" value="safari"/>  <parameter name="version" value="11.0"/>  <parameter name="platform" value="macos 10.13"/>    <classes>      <class name="lambdatest.TestNGTodo"/>    </classes>  </test> <!-- Test --> </suite>

If you notice, with simple annotations and parameters, you can now run your test suite on multiple browsers every time, without changing the browsers parameters in code files every time.

Queuing#


To prevent abuse of the platform we have added limitation on the number of tests you can queue at our platform and have added a limitation on total time a queued item will remain in queue before it’s is timeout. Number of test session that you can add to the queue is defined by your concurrency plan. This formula will help you understand how many you can plan your test case queues.

Maximum Queue Capacity for Java Automation Testing

Maximum number of test cases that can be queued = n + 150

Here, n = number of concurrent sessions.

That means, that if you are on a 10 concurrent session plan, you can add 10+150 i.e. 160 java automation tests in queue at LambdaTest platform.

Here you can get more information about LambdaTest Queuing Policy.

Queuing Timeout

There is also a limit on how long a test case can stay in the queue. If your test case stays in the queue for more than 15 minutes, the test case would be timed out and would not be executed.

Last updated on