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未生成的修复
核心问题
BaseClass中多余的ExtentReports实例与Listeners中的实例冲突;- 报告路径拼接不兼容部分系统,且未确保目录存在;
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
相关产品推荐
相关产品推荐

