How to Take Screenshots on Test Failures Using CaptureHelpers in automationframeworkselenium
The automationframeworkselenium framework automatically captures screenshots on test failures by enabling the SCREENSHOT_FAILED_TCS flag in config.properties, which triggers the TestListener to invoke CaptureHelpers.captureScreenshot() and embed the image into both Extent and Allure reports.
The anhtester/automationframeworkselenium project provides a robust mechanism for capturing visual evidence when tests fail. By leveraging the CaptureHelpers utility class combined with TestNG listeners, the framework automates screenshot generation without requiring manual intervention in every test method.
Architecture of the Screenshot System
CaptureHelpers Utility
Located in src/main/java/com/anhtester/helpers/CaptureHelpers.java, this class handles the low-level screenshot operations. It interfaces with Selenium's TakesScreenshot interface, manages directory creation using SystemHelpers.getCurrentDir(), and generates timestamped PNG files with the pattern <testName>_<dd-MM-yyyy HH-mm-ss>.png.
TestListener for Extent Reports
The src/test/java/com/anhtester/listeners/TestListener.java implements TestNG's ITestListener interface. Its onTestFailure(ITestResult iTestResult) method checks the screenshot configuration flag and orchestrates the capture process, subsequently attaching the image to Extent reports via ExtentReportManager.addScreenShot(Status.FAIL, testName).
AllureListener for Allure Reports
Independently, src/test/java/com/anhtester/listeners/AllureListener.java attaches screenshots to Allure reports when tests fail. This operates separate from the Extent reporting flow, ensuring visual evidence appears regardless of which reporting tool you use.
Configuring Screenshot Capture on Failure
The framework uses src/test/resources/config/config.properties to control behavior:
SCREENSHOT_FAILED_TCS = yes
The FrameworkConstants.java file reads this value at startup:
public static final String SCREENSHOT_FAILED_TCS = PropertiesHelpers.getValue("SCREENSHOT_FAILED_TCS");
When set to yes, the listeners trigger automatic capture; any other value disables the feature.
How the Screenshot Mechanism Works
When a test fails, the following sequence executes:
-
TestListener triggers: The
onTestFailure(ITestResult iTestResult)method inTestListener.javareceives the failure event. -
Configuration check: The listener verifies
SCREENSHOT_FAILED_TCS.equals("yes")before proceeding. -
Screenshot capture: It calls
CaptureHelpers.captureScreenshot(DriverManager.getDriver(), getTestName(iTestResult)), which:- Resolves the export path using
SystemHelpers.getCurrentDir() + FrameworkConstants.EXPORT_CAPTURE_PATH - Creates the directory if missing using
file.mkdir() - Captures via
((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE) - Saves the file with a timestamped name
- Resolves the export path using
-
Extent Report attachment: The listener adds the image using
ExtentReportManager.addScreenShot(Status.FAIL, getTestName(iTestResult)). -
Allure attachment: Simultaneously,
AllureListenerattaches the screenshot to the Allure result files.
Implementation Examples
Manual Screenshot Capture
To capture screenshots outside the automatic failure flow:
import com.anhtester.helpers.CaptureHelpers;
import com.anhtester.driver.DriverManager;
public void customVerification() {
// Perform test steps
if (validationFailed) {
CaptureHelpers.captureScreenshot(DriverManager.getDriver(), "CustomVerification_Failed");
}
}
Verifying Screenshot Files
You can verify the saved files using standard Java file operations:
import com.anhtester.helpers.SystemHelpers;
import com.anhtester.constants.FrameworkConstants;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
@Test
public void verifyScreenshotExists() {
String testName = "validationTest";
CaptureHelpers.captureScreenshot(DriverManager.getDriver(), testName);
String timestamp = new SimpleDateFormat("dd-MM-yyyy HH-mm-ss").format(new Date());
Path screenshotPath = Paths.get(
SystemHelpers.getCurrentDir(),
FrameworkConstants.EXPORT_CAPTURE_PATH,
testName + "_" + timestamp + ".png"
);
assertTrue(Files.exists(screenshotPath), "Screenshot should exist");
}
Customizing the Listener
Extend the default behavior by modifying TestListener.java:
@Override
public void onTestFailure(ITestResult iTestResult) {
if (SCREENSHOT_FAILED_TCS.equals(YES)) {
String prefixedName = "FAIL_" + getTestName(iTestResult);
CaptureHelpers.captureScreenshot(DriverManager.getDriver(), prefixedName);
ExtentReportManager.addScreenShot(Status.FAIL, prefixedName);
}
}
Summary
- Set
SCREENSHOT_FAILED_TCS = yesinsrc/test/resources/config/config.propertiesto enable automatic capture - The
TestListenerclass automatically invokesCaptureHelpers.captureScreenshot()when tests fail - Screenshots are saved to the path defined in
FrameworkConstants.EXPORT_CAPTURE_PATH(default:./reports/screenshots) - Images are automatically embedded into both Extent and Allure reports
- Use
CaptureHelpers.captureScreenshot()manually for custom capture scenarios outside test failures
Frequently Asked Questions
How do I enable screenshots only for failed tests?
Set the SCREENSHOT_FAILED_TCS property to yes in config.properties. The TestListener checks this flag in its onTestFailure() method before calling CaptureHelpers.captureScreenshot(), ensuring screenshots are taken only when assertions fail.
Where are the screenshots saved?
Screenshots are saved to the directory specified by FrameworkConstants.EXPORT_CAPTURE_PATH, which defaults to ./reports/screenshots. The CaptureHelpers class creates this directory automatically if it doesn't exist and names files using the pattern <testName>_<dd-MM-yyyy HH-mm-ss>.png.
Can I use CaptureHelpers outside of the TestListener?
Yes. You can import com.anhtester.helpers.CaptureHelpers and call captureScreenshot(DriverManager.getDriver(), "customName") from any test method or utility class. This writes the file to the same configured export path without requiring the TestNG listener trigger.
How do I view screenshots in Allure reports?
The AllureListener automatically attaches screenshots when tests fail. The attachment appears in the Allure UI under the failed test case with a label containing the test name. No additional configuration is required beyond enabling the screenshot flag in config.properties.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →