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();
}

}

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 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());
}
}

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 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.

Followers