javaseleniumcucumberintegration-testing

How to capture a screenshot after each step in tests with JAVA and Cucumber?


What would be the best way to capture screenshots after each step when running integration tests?

Tests are written in Java using Selenium(3.0.1) and Cucumber(1.2.4).

Code for taking a screenshot after a test is below, but I need a screenshot after each method annotated with @Given, @When, @Then.

@After
public void after(Scenario scenario){
    final byte[] screenshot = driver.getScreenshotAs(OutputType.BYTES);
    scenario.embed(screenshot, "image/png");
}

Thank you for any hints.


Solution

  • Solved this using Aspects. Was pretty tricky, note the annotation:

    @After("call(public * cucumber.runtime.StepDefinitionMatch.runStep(..)) && within(cucumber.runtime.Runtime)")
    

    Below is the full code, written by Viviana Cattenazzi.

    pom.xml

     <dependencies>
             <dependency>
                 <groupId>org.aspectj</groupId>
                 <artifactId>aspectjweaver</artifactId>
                 <version>1.8.9</version>
             </dependency>
             <dependency>
                 <groupId>org.aspectj</groupId>
                 <artifactId>aspectjrt</artifactId>
                 <version>1.8.9</version>
             </dependency>
             <dependency>
                 <groupId>org.aspectj</groupId>
                 <artifactId>aspectjtools</artifactId>
                 <version>1.8.9</version>
             </dependency>
             <dependency>
                 <groupId>info.cukes</groupId>
                 <artifactId>cucumber-core</artifactId>
                 <version>1.2.4</version>
             </dependency>
         </dependencies>
    
    ......
    
             <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>aspectj-maven-plugin</artifactId>
                 <version>1.10</version>
                 <configuration>
                     <weaveDependencies>
                         <weaveDependency>
                             <groupId>info.cukes</groupId>
                             <artifactId>cucumber-core</artifactId>
                         </weaveDependency>
                     </weaveDependencies>
                     <showWeaveInfo>true</showWeaveInfo>
                     <source>1.8</source>
                     <target>1.8</target>
                     <complianceLevel>1.8</complianceLevel>
                 </configuration>
                 <executions>
                     <execution>
                         <phase>process-test-classes</phase>
                         <goals>
                             <goal>compile</goal>
                             <goal>test-compile</goal>
                         </goals>
                     </execution>
                 </executions>
             </plugin>
    

    .......

    StepsInterceptor.java

    @Aspect
     public class StepsInterceptor {
    
    
         @After("call(public * cucumber.runtime.StepDefinitionMatch.runStep(..)) && within(cucumber.runtime.Runtime)")
         public void beforeRunningStep(JoinPoint thisJoinPoint) throws Exception {
    
             try {
                 StepDefinitionMatch stepDefinitionMatch = (StepDefinitionMatch) thisJoinPoint.getTarget();
                 Step step = (Step) retrievePrivateField(stepDefinitionMatch, "step");
                 String stepName = step.getKeyword().trim();
    
                 if ("Given".equals(stepName) || "When".equals(stepName)) {
                     Object theRealStepDef = extractJavaStepDefinition(stepDefinitionMatch);
                    // take screen shot here
                 }
             } catch (ClassCastException exc) { ....
    }
    }
    }