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

多浏览器(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.ttf
    

    Windows系统可使用类似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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:17:05