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 -
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.
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.
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 .
ReplyDeleteHi Anil,
ReplyDeleteDo 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
I have imported that package. Added all these 4 jars. Add listerner to testng.xml file.
ReplyDeleteBut 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.
How do you execute test?
ReplyDeleteAre 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