Answer
Screenshot for Failed Scenarios in Cucumber
Method 1: Using @After Hook with Scenario (Recommended)
Java
package hooks;
import io.cucumber.java.After;
import io.cucumber.java.Scenario;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
public class Hooks {
WebDriver driver = DriverManager.getDriver(); // get from ThreadLocal
@After
public void closeBrowser(Scenario scenario) {
if (scenario.isFailed()) {
// Capture screenshot as byte array
byte[] screenshot = ((TakesScreenshot) driver)
.getScreenshotAs(OutputType.BYTES);
// Attach to Cucumber HTML report
scenario.attach(screenshot, "image/png", "Failure Screenshot");
}
if (driver != null) {
driver.quit();
}
}
}
Method 2: Save to File + Attach
Java
@After
public void closeBrowser(Scenario scenario) {
if (scenario.isFailed()) {
// Save to file
File src = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
String path = "screenshots/" + scenario.getName().replaceAll(" ", "_") + ".png";
FileUtils.copyFile(src, new File(path));
// Also embed in report
byte[] bytes = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
scenario.attach(bytes, "image/png", scenario.getName());
}
driver.quit();
}
Legacy Method (Cucumber 4 and below)
Java
@After
public void closeBrowser(Scenario scenario) {
if (scenario.isFailed()) {
// write code for screenshot
byte[] screenshot = ((TakesScreenshot) driver)
.getScreenshotAs(OutputType.BYTES);
scenario.embed(screenshot, "image/png"); // deprecated in v5+
}
}
Where Screenshots Appear
When using scenario.attach():
- ✓Screenshot is embedded in the Cucumber HTML report
- ✓Click on failed scenario → screenshot visible inline
- ✓JSON report includes base64-encoded image
Full Hooks.java Structure
Java
public class Hooks {
@Before
public void setUp(Scenario scenario) {
// Initialize driver before scenario
System.out.println("Starting: " + scenario.getName());
DriverManager.initDriver("chrome");
}
@After
public void tearDown(Scenario scenario) {
if (scenario.isFailed()) {
byte[] screenshot = ((TakesScreenshot) DriverManager.getDriver())
.getScreenshotAs(OutputType.BYTES);
scenario.attach(screenshot, "image/png", "Failure Screenshot");
}
DriverManager.quitDriver();
}
}
