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

How can you save resources when instantiaing driver?

I asked on my previous post about what was wrong in instantiating driver on set up method? And here is the solution video on my YouTube channel (After 5 years of gap I finally added new video tutorial :)) The solution described on video tutorial uses following set up - public class BaseClassOnDemandDriverSetup { private WebDriver driver ; @BeforeMethod public void setupTest () { // Any other set up goes here } @AfterMethod public void teardown () { if ( driver != null ) { driver .quit() ; } } public WebDriver getDriver () { if ( driver == null ) { WebDriverManager. chromedriver ().setup() ; driver = new ChromeDriver() ; } return driver ; } }

Security Testing and Selenium

I have come across many articles which talk of carrying out security testing with selenium however I found it very cumbersome to set up such tests. This is what this tutorial is going to make easy for you. It cover. My next Security Testing and Selenium YouTube video covers following - Importance of having security testing on CI What is dynamic application security testing Recommended tools from https://owasp.org/www-community/Vulnerability_Scanning_Tools What is https://owasp.org/ ?   Using https://www.zaproxy.org/    Project setup  <dependency> <groupId> org.zaproxy </groupId> <artifactId> zap-clientapi </artifactId> <version> 1.9.0 </version> </dependency> <dependency> <groupId> org.zaproxy </groupId> <artifactId> zap </artifactId> <version> 2.10.0 </version> </dependency> Start ZAP daemom (headless) mode  ./zap.sh -daemon -host 127.0.0.1 -port 8080 -config api.addrs.a

Using chrome console to test xPath and css selectors

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 written element selectors then just hit ctrl+L keys and chrome console would be empty again. Pro