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

Verify email confirmation using Selenium WebDriver

Note: If you are new to java and selenium then start with selenium java training videos .   How to Verify Email Confirmation Using Selenium 4 and JavaMail (2026 Guide) Email confirmation is a critical part of most registration flows — account activation, password reset, multi-factor authentication, and onboarding. Every automation engineer eventually faces the same challenge: How do you verify an email confirmation link inside a Selenium test without making it slow and flaky? The wrong instinct is to automate Gmail's UI with Selenium. It's fragile, slow, and breaks constantly. The right approach: Use Selenium for browser automation Use JavaMail (IMAP) to read the email directly Extract the confirmation link Continue the test in Selenium Why Not Automate Gmail UI With Selenium? Automating the Gmail UI means logging in, searching, clicking a message, and parsing content from a third-party interface that changes frequently. This leads to: Flaky...

Using xPath to reach parent of an element

Note: If you are new to java and selenium then start with selenium java training videos .   I generally prefer CSS selectors over XPath when writing Selenium locators. CSS selectors are concise, readable, and usually provide everything I need. However, there are situations where XPath is a better fit—particularly when I need to navigate through an element's hierarchy, such as moving from an element to its parent, grandparent, or sibling. This post shows one such real-world example. The Problem I came across a situation where I needed to click a link based on the value of an input field. The HTML structure contained multiple similar groups of elements. The input field and the link I wanted to click were not directly related, but they shared a common parent structure. In the following example above, the input element is highlighted, and I need to click the corresponding anchor ( <a> ) element . The challenge is that there may be multiple similar structures on the page. I th...

Real Time JMeter Result Using Backend Listener

Since JMeter 2.13 Backend Listener has been available to create real time graph of JMeter Test. Following tutorial explain the entire process in detail. At the end of this tutorial you would be able to create JMeter Live Test Result dashboard similar to following - This tutorial borrows information from many sources and my own experiments with JMeter live reporting dashboard. I have added source of information wherever applicable But before we can build such a snazzy JMeter Live Reporting dashboard we need to understand two more components - influxDB (a time series database) and Grafana Dashboard This is a big tutorial, so take deep breath :-) and follow on. Once you complete set up specified in this tutorial then you can watch JMeter Training Video Tutorial to watch this in action. What is Time Series Database? A time series is a sequence of data points , typically consisting of successive measurements made over a time interval . Examples of time ...