为了账号安全,请及时绑定邮箱和手机立即绑定

测试失败时无法从 testnglistner ontestfailure 方法截取屏幕截图

测试失败时无法从 testnglistner ontestfailure 方法截取屏幕截图

慕沐林林 2022-11-30 11:26:02
请在下方找到 的完整代码testNGlistner。好心检查。包pom;import java.io.File;import java.io.IOException;import org.apache.commons.io.FileUtils;import org.openqa.selenium.OutputType;import org.openqa.selenium.TakesScreenshot;import org.openqa.selenium.WebDriver;import org.testng.ITestContext;import org.testng.ITestListener;import org.testng.ITestResult;import com.aventstack.extentreports.ExtentReports;import com.aventstack.extentreports.ExtentTest;import com.aventstack.extentreports.MediaEntityBuilder;import com.aventstack.extentreports.Status;import com.aventstack.extentreports.markuputils.ExtentColor;import com.aventstack.extentreports.markuputils.MarkupHelper;import com.aventstack.extentreports.reporter.ExtentHtmlReporter;import com.aventstack.extentreports.reporter.configuration.ChartLocation;import com.aventstack.extentreports.reporter.configuration.Theme;import generic.BaseTest;public class testNgListners extends BaseTest implements ITestListener {    ExtentHtmlReporter htmlReporter;    ExtentReports extent;    ExtentTest logger;    @Override    public void onTestStart(ITestResult result) {    }    @Override    public void onTestSuccess(ITestResult result) {        logger = extent.createTest(result.getName());        logger.log(Status.PASS, MarkupHelper.createLabel(result.getName(), ExtentColor.GREEN));    }    @Override    public void onTestFailure(ITestResult result) {        System.out.println("hii");        logger = extent.createTest(result.getName());        logger.log(Status.FAIL, MarkupHelper.createLabel(result.getName(), ExtentColor.RED));        if (result.getStatus() == ITestResult.FAILURE) {            TakesScreenshot take = (TakesScreenshot) driver;            File srcFile = take.getScreenshotAs(OutputType.FILE);            }        }    }  
查看完整描述

1 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

您将 TestNG 侦听器和 Testclass 相关注释混合在一起,这就是导致NullPointerException

我猜你有一个也在扩展BaseTest. 为了示例,我们将该类称为RegressionTest.

TestNG 现在创建两个实例:

  • RegressionTest1个实例

  • testNgListners1 个班级实例。

但要注意的是,testNgListners创建实例时,根本不会调用@BeforeMethod@AfterMethod注释,因为这些注释在侦听器的上下文中没有任何相关性。

要解决此问题,您需要执行以下操作:

  • 重构testNgListners使其不扩展BaseTest

  • 现在BaseTest从中移动浏览器实例化和清理逻辑。

  • 您应该通过 TestNG 侦听器管理浏览器实例化,因为只要出现故障,您的 testng 也将使用驱动程序对象来截取屏幕截图。

下面是修改后的监听器的样子:

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.util.Properties;

import java.util.concurrent.TimeUnit;

import org.apache.commons.io.FileUtils;

import org.openqa.selenium.OutputType;

import org.openqa.selenium.PageLoadStrategy;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.chrome.ChromeOptions;

import org.openqa.selenium.remote.RemoteWebDriver;

import org.testng.ITestListener;

import org.testng.ITestResult;

import org.testng.Reporter;


public class BrowserManagementListener implements ITestListener {

  private static final String BROWSER = "browser";


  private File file =

      new File("\\\\192.168.70.39\\IT Share\\Automation\\ERP Automation\\credential.properties");

  private Properties prop = new Properties();


  public static RemoteWebDriver getDriver() {

    ITestResult result = Reporter.getCurrentTestResult();

    if (result == null) {

      throw new IllegalStateException("could not detect a valid test result");

    }

    Object object = result.getAttribute(BROWSER);

    if (object == null) {

      throw new IllegalStateException("could not find a browser");

    }

    return (RemoteWebDriver)object;

  }


  @Override

  public void onTestStart(ITestResult result) {

    // This line retrieves the value of

    // <parameter name="browser" value="chrome"/> from your testng suite xml

    String browser = result.getTestContext().getCurrentXmlTest().getParameter("browser");

    if ("chrome".equalsIgnoreCase(browser)) {

      FileInputStream fileInput = null;

      try {

        fileInput = new FileInputStream(file);

      } catch (FileNotFoundException e) {

        e.printStackTrace();

      }

      try {

        prop.load(fileInput);

      } catch (Exception e) {

        e.printStackTrace();

      }

    }

    ChromeOptions options = new ChromeOptions();

    options.setPageLoadStrategy(PageLoadStrategy.NONE);

    RemoteWebDriver driver = new ChromeDriver();

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    driver.manage().window().maximize();

    result.setAttribute(BROWSER, driver);

  }


  @Override

  public void onTestSuccess(ITestResult result) {

    cleanUpBrowser(result);

  }


  @Override

  public void onTestFailure(ITestResult result) {

    Object object = result.getAttribute(BROWSER);

    if (object == null) {

      return;

    }


    RemoteWebDriver driver = (RemoteWebDriver) object;


    File srcFile = driver.getScreenshotAs(OutputType.FILE);


    File destFile = new File("test-output/" + result.getName() + ".png");

    try {

      FileUtils.copyFile(srcFile, destFile);

      System.out.println("Screenshot is been taken for failed test case: " + result.getName());

      System.err.println("Screenshot below" + destFile.getAbsolutePath());

    } catch (IOException e) {

      e.printStackTrace();

    } finally {

      cleanUpBrowser(result);

    }

  }


  private void cleanUpBrowser(ITestResult result) {

    Object driver = result.getAttribute(BROWSER);

    if (driver != null) {

      ((RemoteWebDriver) driver).quit();

      result.setAttribute(BROWSER, null);

    }

  }

}

这是测试类的样子


import org.testng.annotations.Listeners;

import org.testng.annotations.Test;


@Listeners(BrowserManagementListener.class)

public class SampleTestClass {


  @Test

  public void testMethod() {

    BrowserManagementListener.getDriver().get("http://www.google.com");

    throw new RuntimeException("Simulating an error");

  }

}


查看完整回答
反对 回复 2022-11-30
  • 1 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信