多浏览器(Edge/Chrome/Firefox)单运行生成Extent PDF报告报错求助
问题
需求:一次运行中完成Edge、Chrome、Firefox三款浏览器的测试执行后,生成单个Extent PDF测试报告。
问题:单浏览器运行时PDF报告可正常生成,但多浏览器运行结束时出现如下错误:
SEVERE: An exception occurred tech.grasshopper.pdf.exception.PdfReportException: java.io.IOException: The TrueType font null does not contain a 'cmap' table at tech.grasshopper.pdf.PDFCucumberReport.createReport(PDFCucumberReport.java:129) at tech.grasshopper.pdf.extent.ExtentPDFCucumberReporter.flush(ExtentPDFCucumberReporter.java:88) at tech.grasshopper.pdf.extent.ExtentPDFCucumberReporter.access$100(ExtentPDFCucumberReporter.java:19) at tech.grasshopper.pdf.extent.ExtentPDFCucumberReporter$1.onNext(ExtentPDFCucumberReporter.java:62) at tech.grasshopper.pdf.extent.ExtentPDFCucumberReporter$1.onNext(ExtentPDFCucumberReporter.java:55) at io.reactivex.rxjava3.subjects.PublishSubject$PublishDisposable.onNext(PublishSubject.java:310) at io.reactivex.rxjava3.subjects.PublishSubject.onNext(PublishSubject.java:226) at com.aventstack.extentreports.ReactiveSubject.onFlush(ReactiveSubject.java:83) at com.aventstack.extentreports.AbstractProcessor.onFlush(AbstractProcessor.java:85) at com.aventstack.extentreports.ExtentReports.flush(ExtentReports.java:279) at com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter.finishReport(ExtentCucumberAdapter.java:300) at com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter.access$600(ExtentCucumberAdapter.java:62) at com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter$8.receive(ExtentCucumberAdapter.java:136) at com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter$8.receive(ExtentCucumberAdapter.java:133) at io.cucumber.core.eventbus.AbstractEventPublisher.send(AbstractEventPublisher.java:51) at io.cucumber.core.eventbus.AbstractEventBus.send(AbstractEventBus.java:12) at io.cucumber.core.runtime.SynchronizedEventBus.send(SynchronizedEventBus.java:47) at io.cucumber.core.runtime.CucumberExecutionContext.emitTestRunFinished(CucumberExecutionContext.java:131) at io.cucumber.core.runtime.CucumberExecutionContext.finishTestRun(CucumberExecutionContext.java:118) at io.cucumber.testng.TestNGCucumberRunner.finish(TestNGCucumberRunner.java:145) at io.cucumber.testng.AbstractTestNGCucumberTests.tearDownClass(AbstractTestNGCucumberTests.java:57) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133) at org.testng.internal.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:62) at org.testng.internal.ConfigInvoker.invokeConfigurationMethod(ConfigInvoker.java:385) at org.testng.internal.ConfigInvoker.invokeConfigurations(ConfigInvoker.java:321) at org.testng.internal.TestMethodWorker.invokeAfterClassMethods(TestMethodWorker.java:217) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:130) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.io.IOException: The TrueType font null does not contain a 'cmap' table at org.apache.fontbox.ttf.TrueTypeFont.getUnicodeCmapImpl(TrueTypeFont.java:562) at org.apache.fontbox.ttf.TrueTypeFont.getUnicodeCmapLookup(TrueTypeFont.java:542) at org.apache.fontbox.ttf.TrueTypeFont.getUnicodeCmapLookup(TrueTypeFont.java:528) at org.apache.fontbox.ttf.TTFSubsetter.<init>(TTFSubsetter.java:90) at org.apache.pdfbox.pdmodel.font.TrueTypeEmbedder.subset(TrueTypeEmbedder.java:347) at org.apache.pdfbox.pdmodel.font.PDType0Font.subset(PDType0Font.java:263) at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1369) at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1344) at tech.grasshopper.pdf.PDFCucumberReport.createReport(PDFCucumberReport.java:125) ... 33 more
当前extent.properties配置如下:
extent.reporter.pdf.start=true extent.reporter.pdf.out=/Test-report/pdf-reports/Web_Report.pdf
解决方案
针对多浏览器运行时的字体错误及生成合并PDF报告的需求,可按以下步骤修改:
指定有效字体文件
错误核心是PDF生成时未找到有效TrueType字体,需在extent.properties中添加字体路径配置,指定本地系统存在的字体文件,示例:extent.reporter.pdf.font.path=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttfWindows系统可使用类似
C:/Windows/Fonts/arial.ttf的路径,确保字体文件存在且有读取权限。升级适配版本
多浏览器并行场景下,旧版本的Extent PDF适配器可能存在资源冲突问题,升级tech.grasshopper:extentreports-pdf-cucumber7-adapter(对应你的Cucumber版本)到最新稳定版,避免版本兼容导致的报告写入异常。统一报告实例管理
若使用TestNG,确保测试类中ExtentReports实例为静态单例,所有浏览器的测试结果都写入同一个实例;同时检查tearDownClass方法,确保报告flush操作仅执行一次,避免多线程重复触发写入。验证输出路径权限
确认extent.reporter.pdf.out指定的路径有读写权限,多线程运行时避免因文件锁导致写入失败,优先通过单例实例直接写入同一个报告文件,而非生成多个临时文件再合并。
内容的提问来源于stack exchange,提问作者Automation Engr

