You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Extent Report无法生成及测试时多开Chrome窗口问题求助

问题排查:Extent Report未生成 + 重复打开Chrome窗口

我尝试通过Listener、ExtentReportGen、Base类及主测试类生成Extent Report,但报告未成功生成,不清楚问题所在。同时运行登录测试类时会打开两个Chrome窗口,恳请协助排查。以下是相关代码:

登录测试主代码(LoginTest.java)

import java.io.IOException;

import org.testng.annotations.Test;

import extentListners.Listeners;
import pages.loginPage;

public class LoginTest extends Listeners{
    
    @Test
    public void LogInTest() throws IOException {
    driver = initialiseDriver();
    loginPage log = new loginPage(driver);

    log.user("pooja@katchintech.com");
    log.pass("Cust@123");
    log.loginbt();
    log.logoutbt();
    driver.quit();
    }
}

Listeners类(Listeners.java)

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.Status;

import resources.BaseClass;

public class Listeners extends BaseClass implements ITestListener{
    ExtentReports extent = ExtentReportGen.ExtentReportGenerator();
    
    public static ExtentTest test;
    
    @Override
    public void onTestStart(ITestResult result) {
        System.out.println("Test case :"+result.getName());
        test = extent.createTest(result.getName());
    }

    public void onTestSuccess(ITestResult result) {
        System.out.println("Test case passed :"+result.getName());
        test.log(Status.PASS, "Test case passed");
    }

    @Override
    public void onTestFailure(ITestResult result) {
        System.out.println("Test case failed :"+result.getName());

        test.fail(result.getThrowable());
    }

    @Override
    public void onTestSkipped(ITestResult result) {

    }

    @Override
    public void onTestFailedButWithinSuccessPercentage(ITestResult result) {

    }

    @Override
    public void onTestFailedWithTimeout(ITestResult result) {

    }

    @Override
    public void onStart(ITestContext context) {
        System.out.println("Execution started :"+context.getName());
    }

    @Override
    public void onFinish(ITestContext context) {
        System.out.println("Execution finished :"+context.getName());
        extent.flush();
    }
}

BaseClass类(BaseClass.java)

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.BeforeTest;

import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.reporter.ExtentSparkReporter;

import io.github.bonigarcia.wdm.WebDriverManager;

public class BaseClass {
    public WebDriver driver;
    public ExtentReports extent = new ExtentReports();
    public ExtentSparkReporter spark;
    public ExtentTest test;
    
    @BeforeTest
    public WebDriver initialiseDriver() throws IOException {
        Properties prop = new Properties();
        FileInputStream fis = new FileInputStream("C:\\Users\\thora\\eclipse-workspace\\Biskane_NEW\\src\\main\\java\\resources\\data.properties");
        prop.load(fis);
        String browsername = prop.getProperty("browser");
        
        switch(browsername){ 
        case "chrome":
            WebDriverManager.chromedriver().setup();
            driver = new ChromeDriver();
            driver.get("https://qa.biskane.com/login");
            driver.manage().window().maximize();
            break;
        case "firefox":
            WebDriverManager.firefoxdriver().setup();
            driver = new FirefoxDriver();
            driver.get("https://qa.biskane.com/login");
            driver.manage().window().maximize();
            break;
        case "edge":
            WebDriverManager.edgedriver().setup();
            driver = new EdgeDriver();
            driver.get("https://qa.biskane.com/login");
            driver.manage().window().maximize();
            break;
        default:
            System.out.println("browser: " + browsername + " is invalid, launching FireFox browser as browser of choice..");
            WebDriverManager.firefoxdriver().setup();
            driver = new FirefoxDriver();
            driver.get("https://qa.biskane.com/login");
            driver.manage().window().maximize();
            break;
        }
        return driver;
    }
}

ExtentReportGen类(ExtentReportGen.java)

import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
import com.aventstack.extentreports.reporter.configuration.Theme;

public class ExtentReportGen {

    static ExtentReports extent ;
    
    public static ExtentReports ExtentReportGenerator() {
        String path = System.getProperty("user.dir")+"//ExtentReports//Biskanereport.html";

        ExtentHtmlReporter reporter = new ExtentHtmlReporter(path);


        reporter.config().setReportName("BiskaneTestReport");

        reporter.config().setTheme(Theme.STANDARD);

        extent = new ExtentReports();

        extent.attachReporter(reporter);

        extent.setSystemInfo("OS", "Windows");

        extent.setSystemInfo("Organization name", "Appzlogic");

        extent.setSystemInfo("Executed by", "...");


        return extent;
    }

}

问题分析与修复方案

1. 重复打开Chrome窗口的修复

原因

BaseClass的initialiseDriver()方法加了@BeforeTest注解,TestNG会自动执行该方法初始化驱动;同时你在测试方法LogInTest()中又手动调用了一次initialiseDriver(),导致两次创建Chrome实例,打开两个窗口。

修复

移除BaseClass中initialiseDriver()方法上的@BeforeTest注解,保留手动调用的逻辑:

// 去掉@BeforeTest注解
public WebDriver initialiseDriver() throws IOException {
    // 原有代码不变
}

2. Extent Report未生成的修复

核心问题

  1. BaseClass中多余的ExtentReports实例与Listeners中的实例冲突;
  2. 报告路径拼接不兼容部分系统,且未确保目录存在;
  3. Listeners未在TestNG配置中注册,导致生命周期方法未执行,无法触发extent.flush()生成报告。

分步修复

步骤1:清理BaseClass的Extent相关代码

删除BaseClass中与Extent Report无关的成员变量,让Listeners统一管理报告实例:

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

import io.github.bonigarcia.wdm.WebDriverManager;

public class BaseClass {
    public WebDriver driver;
    
    public WebDriver initialiseDriver() throws IOException {
        // 原有代码不变
    }
}

步骤2:优化ExtentReportGen的路径处理

使用File.separator保证路径跨平台兼容,同时自动创建报告目录:

import java.io.File;
import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
import com.aventstack.extentreports.reporter.configuration.Theme;

public class ExtentReportGen {

    static ExtentReports extent ;
    
    public static ExtentReports ExtentReportGenerator() {
        // 用File.separator替代硬编码的//,兼容不同系统
        String reportDirPath = System.getProperty("user.dir") + File.separator + "ExtentReports";
        File reportDir = new File(reportDirPath);
        // 自动创建目录,避免路径不存在导致报告生成失败
        if (!reportDir.exists()) {
            reportDir.mkdirs();
        }
        String path = reportDirPath + File.separator + "Biskanereport.html";

        ExtentHtmlReporter reporter = new ExtentHtmlReporter(path);

        reporter.config().setReportName("BiskaneTestReport");
        reporter.config().setTheme(Theme.STANDARD);

        extent = new ExtentReports();
        extent.attachReporter(reporter);
        extent.setSystemInfo("OS", "Windows");
        extent.setSystemInfo("Organization name", "Appzlogic");
        extent.setSystemInfo("Executed by", "...");

        return extent;
    }
}

步骤3:注册Listeners到TestNG配置

创建或修改testng.xml,添加Listeners配置,确保Listener的生命周期方法能被TestNG触发:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Suite">
  <listeners>
    <listener class-name="extentListners.Listeners"/>
  </listeners>
  <test name="Test">
    <classes>
      <class name="LoginTest"/>
    </classes>
  </test>
</suite>

内容的提问来源于stack exchange,提问作者Swati Nagawade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:48:11