</>

Technology

Cucumber

Difficulty

Intermediate

Interview Question

How do you take a screenshot for a failed scenario in Cucumber?

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();
    }
}

Follow AutomateQA

Related Topics