1/5/19

How to Generate Extent Report Version 4 in TestNG Framework


Selenium provides inbuilt reports using frameworks such as JUnit and TestNG.

Although the built-in reports provide information on the steps that are executed as part of the test case, they need more customization to be shared with all the major project stakeholders.

Extent Reports is a customizable HTML report developed by Anshoo Arora which can be integrated into Selenium WebDriver using JUnit and TestNG frameworks.

This post will give you a complete step-by-step guide on how to generate Extent Reports in Selenium WebDrive with example codes.



Migrating from Version 3

If you are migrating from version 3, please note that the core usage remains the same. See the list of breaking changes

API: ChartLocation

Affected type: ChartLocation
ChartLocation is no longer available, and can be removed from your setup code
Suggested fix: removal of ChartLocation

ExtentEmailReporter::EmailTemplate
Affected type: EmailTemplate
EmailTemplate has moved from package com.aventstack.extentreports.reporter to com.aventstack.extentreports.reporter.configuration
Suggested fix: Re-import package imports to fix

Mentioned below are the sequence of steps to use Extent Reports 4 in Selenium Webdriver in TestNG

Step #1:
Extent Reports can be directly used in selenium WebDriver by importing the JAR file – extentreports-4.0.6.jar which can be downloaded here.

Or

Here is the link:http://extentreports.com/community-downloads/v4/extentreports-4.0.1.zip
Once the ZIP file is downloaded, extract the contents of the ZIP file into a folder.

Step #2:
Add the jar files present in the ZIP file to the project build path using the option Build Path --> Configure Build Path.

Sample code for Extent Reports

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.ITestResult;
import org.testng.annotations.*;
import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.Status;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
import com.aventstack.extentreports.reporter.configuration.Theme;

public class NopCommerceTest {
public WebDriver driver;
public ExtentHtmlReporter htmlReporter;
public ExtentReports extent;
public ExtentTest test;

@BeforeTest
public void setExtent() {
// specify location of the report
htmlReporter = new ExtentHtmlReporter(System.getProperty("user.dir") + "/test-output/myReport.html");

htmlReporter.config().setDocumentTitle("Automation Report"); // Tile of report
htmlReporter.config().setReportName("Functional Testing"); // Name of the report
htmlReporter.config().setTheme(Theme.DARK);

extent = new ExtentReports();
extent.attachReporter(htmlReporter);

// Passing General information
extent.setSystemInfo("Host name", "localhost");
extent.setSystemInfo("Environemnt", "QA");
extent.setSystemInfo("user", "pavan");
}

@AfterTest
public void endReport() {
extent.flush();
}

@BeforeMethod
public void setup() {
System.setProperty("webdriver.chrome.driver", "C://Drivers/chromedriver_win32/chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("http://demo.nopcommerce.com/");
}

//Test1
@Test
public void noCommerceTitleTest() {
test = extent.createTest("noCommerceTitleTest");
String title = driver.getTitle();
System.out.println(title);
Assert.assertEquals(title, "eCommerce demo store");
}

//Test2
@Test
public void noCommerceLogoTest() {
test = extent.createTest("noCommerceLogoTest");
boolean b = driver.findElement(By.xpath("//img[@alt='nopCommerce demo store']")).isDisplayed();
Assert.assertTrue(b);
}

//Test3
@Test
public void noCommerceLoginTest() {
test = extent.createTest("noCommerceLoginTest");

test.createNode("Login with Valid input");
Assert.assertTrue(true);

test.createNode("Login with In-valid input");
Assert.assertTrue(true);
}

@AfterMethod
public void tearDown(ITestResult result) throws IOException {
if (result.getStatus() == ITestResult.FAILURE) {
test.log(Status.FAIL, "TEST CASE FAILED IS " + result.getName()); // to add name in extent report
test.log(Status.FAIL, "TEST CASE FAILED IS " + result.getThrowable()); // to add error/exception in extent report
String screenshotPath = NopCommerceTest.getScreenshot(driver, result.getName());
test.addScreenCaptureFromPath(screenshotPath);// adding screen shot
} else if (result.getStatus() == ITestResult.SKIP) {
test.log(Status.SKIP, "Test Case SKIPPED IS " + result.getName());
}
else if (result.getStatus() == ITestResult.SUCCESS) {
test.log(Status.PASS, "Test Case PASSED IS " + result.getName());
}
driver.quit();
}

public static String getScreenshot(WebDriver driver, String screenshotName) throws IOException {
String dateName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date());
TakesScreenshot ts = (TakesScreenshot) driver;
File source = ts.getScreenshotAs(OutputType.FILE);

// after execution, you could see a folder "FailedTestsScreenshots" under src folder
String destination = System.getProperty("user.dir") + "/Screenshots/" + screenshotName + dateName + ".png";
File finalDestination = new File(destination);
FileUtils.copyFile(source, finalDestination);
return destination;
}
}

How to Record Selenium Test Execution Video using Monte Screen Recorder API



Normally we take screenshots and attach them to Reports(HTML Reports or extent reports)
to help you in debugging tests and identifying the cause of test failures.

However, in certain cases, a video showing exact screen states, screen transitions and input as generated by your tests might come in even more handy. Such a video could also help presenting / demonstrating your work to your peers and other stakeholders.

Monte Screen Recorder, a Java library that can assist you in creating videos of your Selenium tests.

In this post, I will show you how to create videos for your test cases.

Installation and configuration of the Monte Screen Recorder is easy.

Simply download the .jar file from here and add it as a dependency to your project.

Reference Link: http://www.randelshofer.ch/monte/

You can download JAR file from Here



Utility Class:

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.monte.media.Format;
import org.monte.media.FormatKeys.MediaType;
import org.monte.media.Registry;
import org.monte.media.math.Rational;
import org.monte.screenrecorder.ScreenRecorder;

import static org.monte.media.AudioFormatKeys.*;
import static org.monte.media.VideoFormatKeys.*;

public class ScreenRecorderUtil extends ScreenRecorder {
public static ScreenRecorder screenRecorder;
public String name;
public ScreenRecorderUtil(GraphicsConfiguration cfg, Rectangle captureArea, Format fileFormat,
Format screenFormat, Format mouseFormat, Format audioFormat, File movieFolder, String name)
throws IOException, AWTException {
super(cfg, captureArea, fileFormat, screenFormat, mouseFormat, audioFormat, movieFolder);
this.name = name;
}

@Override
protected File createMovieFile(Format fileFormat) throws IOException {

if (!movieFolder.exists()) {
movieFolder.mkdirs();
} else if (!movieFolder.isDirectory()) {
throw new IOException("\"" + movieFolder + "\" is not a directory.");
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss");
return new File(movieFolder,
name + "-" + dateFormat.format(new Date()) + "." + Registry.getInstance().getExtension(fileFormat));
}

public static void startRecord(String methodName) throws Exception {
File file = new File("./test-recordings/");
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int width = screenSize.width;
int height = screenSize.height;

Rectangle captureSize = new Rectangle(0, 0, width, height);

GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().
getDefaultScreenDevice()
.getDefaultConfiguration();
screenRecorder = new ScreenRecorderUtil(gc, captureSize,
new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_AVI),
new Format(MediaTypeKey, MediaType.VIDEO, EncodingKey, ENCODING_AVI_TECHSMITH_SCREEN_CAPTURE,
CompressorNameKey, ENCODING_AVI_TECHSMITH_SCREEN_CAPTURE, DepthKey, 24, FrameRateKey,
Rational.valueOf(15), QualityKey, 1.0f, KeyFrameIntervalKey, 15 * 60),
new Format(MediaTypeKey, MediaType.VIDEO, EncodingKey, "black", FrameRateKey, Rational.valueOf(30)),
null, file, methodName);
screenRecorder.start();
}

public static void stopRecord() throws Exception {
screenRecorder.stop();
}
}

Selenium Web Driver Test Case:


import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class TestCase {
WebDriver driver;

@BeforeClass
void setup() {
System.setProperty("webdriver.chrome.driver", "C:/Drivers/chromedriver_win32/chromedriver.exe");
driver = new ChromeDriver();

driver.get("http://demo.nopcommerce.com");

driver.manage().window().maximize();
}

@Test
void verifyLinks() throws Exception {
ScreenRecorderUtil.startRecord("CheckingLinks");
driver.findElement(By.xpath("/html/body/div[6]/div[2]/ul[1]/li[5]/a")).click(); // Books

// Computers
driver.findElement(By.xpath("/html/body/div[6]/div[3]/div[2]/div[1]/div[1]/div[2]/ul/li[1]/a")).click();
System.out.println(driver.getTitle());

// Electronics
driver.findElement(By.xpath("/html/body/div[6]/div[3]/div[2]/div[1]/div[1]/div[2]/ul/li[2]/a")).click();
System.out.println(driver.getTitle());

// Apparel
driver.findElement(By.xpath("/html/body/div[6]/div[3]/div[2]/div[1]/div[1]/div[2]/ul/li[3]/a")).click();
System.out.println(driver.getTitle());

// Digital Downloads
driver.findElement(By.xpath("/html/body/div[6]/div[3]/div[2]/div[1]/div[1]/div[2]/ul/li[4]/a")).click();
System.out.println(driver.getTitle());

// Jewelary
driver.findElement(By.xpath("/html/body/div[6]/div[3]/div[2]/div[1]/div[1]/div[2]/ul/li[6]/a")).click();
System.out.println(driver.getTitle());

// Giftcards
driver.findElement(By.xpath("/html/body/div[6]/div[3]/div[2]/div[1]/div[1]/div[2]/ul/li[7]/a")).click();
System.out.println(driver.getTitle());

ScreenRecorderUtil.stopRecord();
}

@AfterClass
void tearDown()
{
driver.close();
}

}



1/2/19

How to automate QRCode using ZXing API in Selenium



In this article I will explain how to automate QR code in Selenium Webdriver.

What is Bar Code?
QR Code is a machine-readable optical label that contains information about the item to which it is attached.

A QR Code consists of black squares arranged in a square grid on white background.

Selenium has limitation to automate QR code but by using third party API we can automate QR codes.

So, ZXing is one the third party API will be used to automate QR Codes.

Pre-requisites:

We need to download Zxing API from below links:

https://mvnrepository.com/artifact/com.google.zxing/javase/3.3.3
https://mvnrepository.com/artifact/com.google.zxing/core/3.3.3

You can also generate your own Bar Codes using below link:
https://barcode.tec-it.com

Now, I'm going to automate Bar code which is available on below application. https://testautomationpractice.blogspot.com/



Code Snippet:

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;

public class ReadingQRCode {
public static void main(String[] args) throws IOException, NotFoundException {
System.setProperty("webdriver.chrome.driver", "C:/Drivers/chromedriver_win32/chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.get("https://testautomationpractice.blogspot.com/");
String qrCodeURL=driver.findElement(By.xpath("//*[@id=\"HTML4\"]/div[1]/img")).getAttribute("src");
System.out.println(qrCodeURL);
          URL url=new URL(qrCodeURL);
BufferedImage bufferedimage=ImageIO.read(url);
LuminanceSource luminanceSource=new BufferedImageLuminanceSource(bufferedimage);
BinaryBitmap binaryBitmap=new BinaryBitmap(new HybridBinarizer(luminanceSource));
Result result =new MultiFormatReader().decode(binaryBitmap);
System.out.println(result.getText());
}
}

How to automate BarCode using ZXing API in Selenium



In this article I will explain how to automate Bar code in Selenium Webdriver.


What is Bar Code?
Bar Code is a machine-readable optical label that contains information about the item to which it is attached.

A Bar code is the small image of lines (bars) and spaces that is affixed to retail store items, identification cards, and postal mail to identify a particular product number, person, or location.

Selenium has limitation to automate Bar code but by using third party API we can automate Bar codes.

So, ZXing is one the third party API will be used to automate Bar Codes.

Pre-requisites:

We need to download Zxing API from below links:

https://mvnrepository.com/artifact/com.google.zxing/javase/3.3.3
https://mvnrepository.com/artifact/com.google.zxing/core/3.3.3

You can also generate your own Bar Codes using below link:
https://barcode.tec-it.com

Now, I'm going to automate Bar code which is available on below application. https://testautomationpractice.blogspot.com/


Code Snippet:

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;

public class ReadingBarCode {
public static void main(String[] args) throws IOException, NotFoundException {
System.setProperty("webdriver.chrome.driver", "C:/Drivers/chromedriver_win32/chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.get("https://testautomationpractice.blogspot.com/");
String barCodeURL=driver.findElement(By.xpath("//*[@id=\"HTML12\"]/div[1]/img")).getAttribute("src");
//String barCodeURL=driver.findElement(By.xpath("//*[@id=\"HTML12\"]/div[1]/img[2]")).getAttribute("src");

System.out.println(barCodeURL);
URL url=new URL(barCodeURL);
BufferedImage bufferedimage=ImageIO.read(url);
LuminanceSource luminanceSource=new BufferedImageLuminanceSource(bufferedimage);
BinaryBitmap binaryBitmap=new BinaryBitmap(new HybridBinarizer(luminanceSource));
Result result =new MultiFormatReader().decode(binaryBitmap);
System.out.println(result.getText());
}
}



1/1/19

How to compare Images in Selenium with Java using Ashot API


In this article I'm going to explain how to capture the screen shot of specific elements (Especially images) and compare image with our expected image.

This is very important scenario when You are automating test cases. Unfortunately Selenium does not provide any Classes t achive this, But still we can do this using third party API AShot.

12/31/18

How to encode the password for selenium using java


when you automate any application we do not want to share the password to outside the world. So, we will use Base64 class of the Java to encode and decode strings or passwords to use securely. In this article I will show you a practical selenium program to achieve the same thing how to encode the password and use the same to log into the application.


12/28/18

Headless Browser Testing in Selenium Web Driver



A headless browser is a browser simulation program that does not have a user interface (UI less).
Headless browser programs operate like any other browser, but do not display any UI. Selenium executes its' tests in the background.

There are several headless browsers available in the market, the following are the most popular ones:
  • Chrome
  • Firefox
  • HTMLUnit driver
  • PhantomJS

12/27/18

How to Check Drop down options are sorted or not in selenium with Java



In this post, I'm going to explain how to check Drop down options are sorted or not in selenium webdriver with java.
  • Open the browser and navigate to the webpage
  • Find the dropdown using the findElement method in selenium
  • Create a object to Select class and pass the dropdown element as the parameter to constructor
WebElement element = driver.findElement(By.xpath("//*[@id=\"animals\"]"));
Select se = new Select(element);
  • Using getOptions() method from Select class you can get all the options from the dropdown in the form of WebElement.
  • Using the loop we can retrive the values from the List of WebElement
  • Add all the values into a list called originalList that we have already created
ArrayList originalList = new ArrayList();

for (WebElement e : se.getOptions()) {
originalList.add(e.getText());
}
  • The values we retrieved could be sorted or not sorted values [ we are not sure, we have to verify this]
  • Now lets create a temporary list alled tempList and get the values from originalList
  • Now sort the Either tempList or originalList and compare them, We can sort the list using the Collections.sort(list) method
ArrayList tempList = originalList;
Collections.sort(tempList); 
  • We can compare the list using conditional statement
Complete program for not working sorting

import java.util.ArrayList;
import java.util.Collections;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;

public class VerifyDropDownSortedOptions {

public static void main(String[] args) {

System.setProperty("webdriver.chrome.driver", "C://Drivers/chromedriver_win32/chromedriver.exe");
WebDriver driver = new ChromeDriver();

driver.get("https://testautomationpractice.blogspot.com/");

WebElement element = driver.findElement(By.xpath("//*[@id=\"animals\"]"));
Select se = new Select(element);

ArrayList originalList = new ArrayList();

for (WebElement e : se.getOptions()) {
originalList.add(e.getText());
}
System.out.println("originalList:" + originalList);

ArrayList tempList = originalList;
Collections.sort(tempList); // When you change one list, it changes the other list as well.

System.out.println("originalList:" + originalList);
System.out.println("tempList:" + tempList);

/*So the test gets pass all the time because the sequence in the originalList
and tempList is going to be same.
If you are following above process then your test never fails, because When
you change one list, it changes the other list as well.*/

if (originalList == tempList) {
System.out.println("Dropdown sorted");
} else {
System.out.println("Dropdown NOT sorted");
}
driver.close();
}
}

So the test gets pass all the time because the sequence in the originalList and tempList is going to be same.

If you are following above process then your test never fails, because When you change one list, it changes the other list as well.

How to check the options in drop down are sorted order or not

Step1: Create a List tempList variable
Step2: While iterating the option in the dropdown, add values to tempList (along with originalList)
Step3: Now sort the tempList, sorting of tempList will not affect the originalList because we have created two different objects
Step4: Compare the two Lists

import java.util.ArrayList;
import java.util.Collections;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;

public class VerifyDropDownSortedOptions {

public static void main(String[] args) {

System.setProperty("webdriver.chrome.driver", "C://Drivers/chromedriver_win32/chromedriver.exe");
WebDriver driver = new ChromeDriver();

driver.get("https://testautomationpractice.blogspot.com/");

driver.manage().window().maximize();

WebElement element = driver.findElement(By.id("animals"));

Select se = new Select(element);

ArrayList originalList = new ArrayList();
ArrayList tempList = new ArrayList();

for (WebElement e : se.getOptions()) {
originalList.add(e.getText());
tempList.add(e.getText());
}

System.out.println("this is originalList before Sorting" + originalList);
System.out.println("this is tempList before Sorting" + tempList);

Collections.sort(tempList);

System.out.println("this is originalList after Sorting" + originalList);
System.out.println("this is tempList after Sorting" + tempList);

if (originalList == tempList) {
System.out.println("Dropdown sorted");
} else {
System.out.println("Dropdown Not sorted");

}
driver.close();
}

}



12/22/18

Webservices API Testing





What is an API?

API is means Application Programming Interface.
It enables communication and data exchange between two separate software systems. 
A software system implementing an API contains functions/sub-routines which can be executed by another software system.

What is API testing?

API Testing is entirely different from GUI Testing and mainly concentrates on the business logic layer of the software architecture. This testing won't concentrate on the look and feel of an application.
Instead of using standard user inputs(keyboard) and outputs, in API Testing, you use software to send calls to the API, get output, and note down the system's response.
API Testing requires an application to interact with API. In order to test an API, you will need to 
Use Testing Tool to drive the API 
Write your own code to test the API






What is Web Service?

Web Service available over the web which Enables communication between applications over the web,
Provides a standard protocol/format for communication 

Why we use it?

Platform independent communication - using web services two different applications (implementation) can talk to each other and exchange data/information

Difference between API & Web service

Web Service is an API wrapped in HTTP.
All Web Services are API but APIs are not Web Services.
Web Service might not perform all the operations that an API would perform.
A Web Service needs a network while an API doesn't need a network for its operation.

What is WSDL?

WSDL stands for Web Services Description Language, an XML-based language that describes Web services and how to access and locate them.

What is UDDI?

UDDI stands for Universal Description, Discovery and Integration. It is an open, Internet-based specification that offers directory service for storing information about web services.

Types of Web Services

There are mainly two types of web services.

  • SOAP web services. (Simple Object Access Protocol) 
  • RESTful web services. (Representational State Transfer)


SOAP (Simple Object Access Protocol) – SOAP is a protocol which was designed before REST and came into the picture. The main idea behind designing SOAP was to ensure that programs built on different platforms and programming languages could exchange data in an easy manner.

REST – This was designed specifically for working with components such as media components, files, or even objects on a particular hardware device. Any web service that is defined on the principles of REST can be called a RestFul web service. A Restful service would use the normal HTTP verbs of GET, POST, PUT and DELETE for working with the required components.

HTTP V/S HTTPS

What Is HTTP?
HTTP stands for Hypertext Transfer Protocol. At it’s most basic, it allows for the communication between different systems. It’s most commonly used to transfer data from a web server to a browser in order to allow users to view web pages. It’s the protocol that was used for basically all early websites.

What Is HTTPS?
HTTPS stands for Hypertext Transfer Protocol Secure. The problem with the regular HTTP protocol is that the information that flows from server to browser is not encrypted, which means it can be easily stolen. HTTPS protocols remedy this by using an SSL (secure sockets layer) certificate, which helps create a secure encrypted connection between the server and the browser, thereby protecting potentially sensitive information from being stolen as its transferred between the server and the browser.

















8/29/18

Software Testing Interview Questions and Answers



Q1.How do you define Bug and Defect?
  • Defect – This is what if software misses any function or feature which are there in requirement list, then this is known as a defect.
  • Bug – A bug is a flaw or a failure in a system that causes it to yield an unexpected or incorrect result.

Selenium Interview Questions and Answers



Q1. What is the difference between verification and validation?
  • Verification:  Are we building the application or not – to verify this approach is called as “Verification”.
  • Validation: Are we building the right application or not – to verify this approach is called as “Validation”.
 Q2. What are all the Testing types we can able to perform using with Automation Testing tool?
  • Functional Testing: Functional testing is performed using the functional specification provided by the client and verifies the system against the functional requirements.
Ex: All keyboard keys are working properly or not.
  • Regression Testing:  New functionality changes should not affect the existing functionality.

8/16/18

8/14/18

API testing using POSTMAN

API testing using POSTMAN

The API Testing is performed for the application, which has a collection of API that must be tested. API calls verify functionality and expose failure of application.
API testing is strongly connected with Back-end/Database testing, you may have brief knowledge of SQL queries. (That would be an advantage )

6/29/18

How to Run Test Cases using Selenium Grid



Selenium Grid is a tool that distributes the tests across multiple physical or virtual machines so that we can execute scripts in parallel (simultaneously). It dramatically accelerates the testing process across browsers and across platforms by giving us quick and accurate feedback.

Selenium Grid allows us to execute multiple instances of WebDriver or Selenium Remote Control tests in parallel which uses the same code base, hence the code need NOT be present on the system they execute. The selenium-server-standalone package includes Hub, WebDriver, and Selenium RC to execute the scripts in grid.

6/14/18