Search code examples
javajunitcucumberscreenshotcucumber-java

Cucumber Java screenshots


Is there a way to take screenshots in between steps in Java Cucumber ?

I have the following scenario :

@Scenario_1
Given I log into url
And I see the home page is displayed in English //Take screenshot
And I click on 'Edit Profile'
And I see the language set to 'English' 
When I change the language to Chinese   //Take screenshot
And I navigate to home page
Then everything is displayed in Chinese //Take screenshot

I want to take screenshots for certain steps of the scenario.

I am currently taking a screenshot in the 'After' method.

@After()
public void execute_after_every_scenario(Scenario s) throws InterruptedException
{
    Thread.sleep(2000);

    final byte[] screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
    s.embed(screenshot, "image/png");

    driver.quit();
}

As expected, this is capturing the image for the last step only.

How can I capture the images for the other 2 steps and embed the image the same way as in the 'After' method ?

I tried to create a new method to take screenshots and call that method when needed. But can any other method , other than the one specified in 'After' , take scenario as an argument ?

take_screenshot(Scenario_1, driver);

public void take_screenshot(Scenario s,WebDriver driver)
{
    final byte[] screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
    s.embed(screenshot, "image/png");
}

How can I go about this ?


Solution

  • Create a screenshot step. Maybe something like this:

    public class YourStepDefinitions {
    
        private Scenario myScenario;
    
        @Before()
        public void embedScreenshotStep(Scenario scenario) {
    
            myScenario = scenario;
    
        }
    
        @Then ("^I take a screenshot$")
        public void i_take_a_screenshot() throws Throwable {
    
            try {
                myScenario.write("Current Page URL is " + driver.getCurrentUrl());
                byte[] screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.BYTES);
                myScenario.embed(screenshot, "image/png");  // Stick it in the report
            } catch (WebDriverException somePlatformsDontSupportScreenshots) {
                log.error(somePlatformsDontSupportScreenshots.getMessage());
            } catch (ClassCastException cce) {
                cce.printStackTrace();
            }
        }
    }