Skip to main content

Selenium Tutorial: Capture screenshot on selenium test failure using TestNG and Fest

There is a method in DefaultSelenium class called CaptureScreenshot()which can be used to capture screen shot in general. But this is not effective when screen shot is to be taken only during failures.
To achieve capturing screen shot on failure FEST can be used (http://fest.easytesting.org/)

Regardless of how the FEST-Swing takes a screenshot, it needs to know which tests should be considered "GUI tests." In order to do so, one needs to add the annotation @GUITest. This annotation can be placed at class or method level, and it is inherited by subclasses of annotated classes. Hence in case of selenium it should be added on the class which is extended by other test classes
Once downloaded Fest, add these jar files in library of Intellij -

fest-swing-1.2.jar
fest-swing-testng-1.2.jar
fest-util-1.1.2.jar
fest-reflect-1.2.jar
Same should be added in the library folder of project and property of ANT so that ANT could access these. Now import the GUI test in SelTestCase class and make add @GUITest annotation at the SelTestCase class as following -

import org.fest.swing.annotation.GUITest;
@GUITest
public class SelTestCase extends SeleneseTestCase {

************  Set Up Code ***************
}

Since all test classes would inherit SelTestCase class hence all classes would be able to capture screen in case of failures. Add the following lister in Build.xml file of ANT. listeners="org.fest.swing.testng.ScreenshotOnFailureListener" Hence whole TestNG task of ANT looks as
following -
(I had to keep the image as angle brackets of xml don't let this text appear on blog) Make sure that png files which are created while taking the screen shot are DELETED before running new set of test. I do this by specifying the delete task in clean target as following - NOTICE THAT IF THESE SCREEN SHOT FILES ARE NOT DELETED BEFORE EACH TEST RUN THEN FEST WILL THROW EXCEPTION AND EVEN HINDER THE GENERATION OF NORMAL TEST REPORT.
I have observed that for a failure in a method screen shot is taken only once. This looks fine for hard assertion but may not be sufficient for soft assertion as there should be multiple errors captured in case of soft assertion. BUT I still recommend it as it is better to have one screen shot in case of failures than none.

Comments

  1. Having issues with capturing screenshot during test failures. I tried using fest. Followed steps mentioned here http://seleniumsoftwaretesting.blogspot.com/2008/09/capture-screenshot-on-test-failure.html#!/2008/09/capture-screenshot-on-test-failure.html But when i try to compile the class files its giving error that package org.fest.swing.annotation does not exist [javac] import org.fest.swing.annotation.GUITest; [javac] ^ Please help me in this. I have included the mentioned jar files in the build path .

    ReplyDelete
  2. Hi Anil,

    Do you have following import statement in you class -

    import org.fest.swing.annotation.GUITest;

    Also you need to add following jars to your class path as mentioned in blog post -

    fest-swing-1.2.jar
    fest-swing-testng-1.2.jar
    fest-util-1.1.2.jar
    fest-reflect-1.2.jar

    ReplyDelete
  3. I have imported that package. Added all these 4 jars. Add listerner to testng.xml file.
    But calling the above testng.xml file is throwing exception
    Exception in thread "main" java.lang.NoClassDefFoundError: org/fest/swing/image/
    ImageException
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
    at java.lang.Class.getConstructor0(Class.java:2699)
    at java.lang.Class.newInstance0(Class.java:326)
    at java.lang.Class.newInstance(Class.java:308)
    at org.testng.internal.ClassHelper.newInstance(ClassHelper.java:48)
    at org.testng.TestNG.initializeConfiguration(TestNG.java:881)
    at org.testng.TestNG.run(TestNG.java:980)
    at org.testng.TestNG.privateMain(TestNG.java:1316)
    at org.testng.TestNG.main(TestNG.java:1280)
    Caused by: java.lang.ClassNotFoundException: org.fest.swing.image.ImageException

    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 10 more.

    ReplyDelete
  4. How do you execute test?
    Are you sure you have all jars physically available in "lib" folder? I remember having gotten this feature working while executing tests from ant and not TetsNG

    ReplyDelete

Post a Comment

No spam only genuine comments :)

Popular posts from this blog

Using chrome console to test xPath and css selectors

Note: If you are new to java and selenium then start with selenium java training videos .       Since the advent of selenium there have been many plugin to test xPath / css selectors but you don’t need any of them if you have chrome browser. Using Chrome console you can test both xPath and css selectors. Launch website to be tested in chrome browser and hit F-12 and you would see chrome console opened in lower pane of application - Hit escape key and console would open another pane to write element locators - And now you can start writing xPath or css selectors in chrome console and test them - The syntax for writing css id - $$(“ ”) And hit the enter key. If your expression is right then html snippet of the application element corresponding to the css selector would be displayed - If you mouse over the html snippet in chrome console then it would highlight the corresponding element in application - If you want to clean console of previously wri

Verify email confirmation using Selenium

Note: If you are new to java and selenium then start with selenium java training videos .     Email confirmation seems to be integral part of any registration process. I came across an application which lets you provide your email address. You can follow the sign up link in you mail and then complete the registration process. Lets consider we provide GMail address for it. Now if were to use only Selenium then we would have to follow following steps - Launch GMail using Selenium; Some how search for new mail in the list of available mails; Some how click on it; Parse the mail message; Get the registration link; Follow up with registration process What do you think of an approach in which you can

Test Java class with JMeter

It is quite easy to test API or Website using JMeter  but you may come across situation when you have to load test java class directly.  This post described how a java class can be load tested.  We will write a java program and use JMeter Java Sampler to load test it - Set up a maven selenium project. If you are new to java and maven then you may like to check my java tutorials Add following dependencies to your maven project (find out latest versions by searching https://search.maven.org/) -  < dependency >     < groupId > org.apache.jmeter </ groupId >     < artifactId > ApacheJMeter_core </ artifactId >     < version > 3.1 </ version > </ dependency > < dependency >     < groupId > org.apache.jmeter </ groupId >     < artifactId > ApacheJMeter_java </ artifactId >     < version > 3.0 </ version > </ dependency >   Let's write a java program to add numbers -  public class AddNumbers