Skip to content

Screenshots not rendered in TestNG Allure report #875

Closed

Description

@Krzysztof-Bednarczyk

Describe the bug
I'm using selenium + cucumber with TestNG for automation testing. I'm trying to generate a report with attached screenshots in case of a test fail.
I'm using a TestListener.class to listen to failed tests. In my onTestFailure method I create the screenshot and add the attachment to the report.
The attachments are visible in the allure-results folder. Unfortunately the screenshots are not rendered in the test report.

To Reproduce
Steps to reproduce the behavior:

  1. Create TestNG tests
  2. Create TestNG TestListener.class
  3. Add onTestFailure method

    @Override
    public void onTestFailure(ITestResult result){
        try {
            takeScreenshot();
            System.out.println("Screenshot done");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private void takeScreenshot() throws IOException {
        File screenshotAs = ((TakesScreenshot) DriverManager.getDriver()).getScreenshotAs(OutputType.FILE);
        Allure.addAttachment("Screenshot", FileUtils.openInputStream(screenshotAs));
    }
}
  1. Execute tests and create attachments.
  2. Generate test report with failing tests.
  3. Serve report allure serve target/allure-results

Expected behavior
Screenshots should be rendered in the test report.

Screenshots
https://photos.app.goo.gl/PdHr81xEF4ifUBWe8

Desktop (please complete the following information):

  • OS: macOS monterey 12.6.1
  • Browser: chrome ver. 109.0.5414.119, firefox ver. 109.0

Additional context
I'm using the following dependencies

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.mygroupid</groupId>
    <artifactId>da-tool-ui-automation</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <selenium.version>4.6.0</selenium.version>
        <webdrivermanager.version>5.3.1</webdrivermanager.version>
        <cucumber.version>7.10.1</cucumber.version>
        <testng.version>7.7.0</testng.version>
        <junit-platform.version>1.9.1</junit-platform.version>
        <assertj.version>3.23.1</assertj.version>
        <owner.version>1.0.12</owner.version>
        <allure.version>2.20.1</allure.version>
        <aspectj.version>1.9.19</aspectj.version>
        <maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version>
        <maven-surefire-plugin.version>3.0.0-M7</maven-surefire-plugin.version>
    </properties>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>${selenium.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager -->
        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>${webdrivermanager.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-java -->
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>${cucumber.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-testng -->
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-testng</artifactId>
            <version>${cucumber.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.testng/testng -->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>${testng.version}</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.assertj/assertj-core -->
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>${assertj.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.aeonbits.owner</groupId>
            <artifactId>owner</artifactId>
            <version>${owner.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.qameta.allure/allure-testng -->
        <dependency>
            <groupId>io.qameta.allure</groupId>
            <artifactId>allure-testng</artifactId>
            <version>${allure.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.qameta.allure/allure-cucumber7-jvm -->
        <dependency>
            <groupId>io.qameta.allure</groupId>
            <artifactId>allure-cucumber7-jvm</artifactId>
            <version>${allure.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.cucumber/gherkin -->
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>gherkin</artifactId>
            <version>26.0.3</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven-compiler-plugin.version}</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.source}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${maven-surefire-plugin.version}</version>
                <configuration>
                    <argLine>
                        -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
                        -Dcucumber.options="--plugin io.qameta.allure.cucumber7-jvm.AllureCucumber7Jvm"
                    </argLine>
                    <systemPropertyVariables>
                        <allure.results.directory>${project.build.directory}/allure-results</allure.results.directory>
                    </systemPropertyVariables>
                    <suiteXmlFiles>
                        src/test/resources/suites/local.xml
                    </suiteXmlFiles>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjweaver</artifactId>
                        <version>${aspectj.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>

Runner class

package org.ebay.datool.runner;

import io.cucumber.testng.AbstractTestNGCucumberTests;
import io.cucumber.testng.CucumberOptions;
import org.ebay.datool.driver.BrowserFactory;
import org.ebay.datool.driver.DriverManager;
import org.ebay.datool.listener.TestListener;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.*;

@CucumberOptions(
        tags = "@login or @dropdown",
        features = "classpath:cucumber/features",
        glue = "org/ebay/datool/steps",
        plugin = {"pretty", "io.qameta.allure.cucumber7jvm.AllureCucumber7Jvm",
                "json:target/cucumber-reports/cucumber.json",
                "html:target/cucumber-reports/cucumberreport.html"}
)
@Listeners({TestListener.class})
public class RunCucumberTest extends AbstractTestNGCucumberTests {

    @BeforeMethod(alwaysRun = true)
    @Parameters("browser")
    public void setUp(@Optional("chrome") String browser) {
        WebDriver driver = BrowserFactory.valueOf(browser.toUpperCase()).createDriver();
        DriverManager.setDriver(driver);
    }

    @AfterMethod(alwaysRun = true)
    public void tearDown(){
        DriverManager.quit();
    }
}

TestListener

package org.ebay.datool.listener;

import io.qameta.allure.Allure;
import org.apache.commons.io.FileUtils;
import org.ebay.datool.driver.DriverManager;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.testng.ITestListener;
import org.testng.ITestResult;

import java.io.File;
import java.io.IOException;

public class TestListener implements ITestListener {

    @Override
    public void onTestFailure(ITestResult result){
        try {
            takeScreenshot();
            System.out.println("Screenshot done");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private void takeScreenshot() throws IOException {
        File screenshotAs = ((TakesScreenshot) DriverManager.getDriver()).getScreenshotAs(OutputType.FILE);
        Allure.addAttachment("Screenshot", FileUtils.openInputStream(screenshotAs));
    }
}

The screenshot are being generated when I use Cucumbers @after method

    @After
    public void scenarioCheck(Scenario scenario) throws IOException {
        System.out.println("Checking screenshot");
        if(scenario.isFailed()){
            File screenshotAs = ((TakesScreenshot) DriverManager.getDriver()).getScreenshotAs(OutputType.FILE);
            Allure.addAttachment("Screenshot", FileUtils.openInputStream(screenshotAs));
        }
    }

Activity

  1. Krzysztof-Bednarczyk commented on Jan 30, 2023

    @Krzysztof-Bednarczyk
    Author

    Tried also to create attachments using the annotation

    @Attachment(value = "Failed test screenshot", type = "image/png")
    public static byte[] takeScreenshotToAttachOnAllureReport() {
            return ((TakesScreenshot) DriverManager.getDriver()).getScreenshotAs(BYTES);
        }
    

    Issue is reproducable in other testing framework.

  2. baev commented on Aug 17, 2023

    @baev
    Member
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions