首页 > 解决方案 > 如何使用 pytest-html 在 HTML 中嵌入 base64 图像?

问题描述

我正在使用 python-appium 客户端并在测试完成后生成 HTML 报告。我想在 HTML 报告中添加失败测试的嵌入图像。嵌入图像的原因是我也可以从远程机器访问它。这是我尝试过的代码,在另一个系统上不起作用,但在本地它可以工作:

@pytest.mark.hookwrapper
def pytest_runtest_makereport(item):
pytest_html = item.config.pluginmanager.getplugin('html')
outcome = yield
report = outcome.get_result()
extra = getattr(report, 'extra', [])

if report.when == 'call' or report.when == 'setup':
    xfail = hasattr(report, 'wasxfail')
    if (report.skipped and xfail) or (report.failed and not xfail):
        screenshot = driver.get_screenshot_as_base64()
        extra.append(pytest_html.extras.image(screenshot, ''))
    report.extra = extra

在我看来,编码图像没有正确生成,因为这是我在输出 HTML 文件中可以看到的:

<td class="extra" colspan="4">
        <div class="image"><a href="assets/75870bcbdda50df90d4691fa21d5958b.png"><img src="assets/75870bcbdda50df90d4691fa21d5958b.png"/></a></div>

我希望“src”不以“.png”结尾,它应该是一长串字符。我不知道如何解决这个问题。

标签: pytestpython-appiumpytest-html

解决方案


你的代码是正确的。但是,标准的行为pytest-html是即使您将图像作为base64字符串传递,它仍然会在assets目录中存储一个文件。如果要将资产嵌入报告文件中,则需要传递--self-contained-html选项:

$ pytest --html=report.html --self-contained-html

或将选项存储在pytest.ini

 # pytest.ini (or tox.ini or setup.cfg)
 [pytest]
 addopts = --self-contained-html

为了完整起见,这里是pytest-html自述文件中的相关点:

创建一个独立的报告

为了遵守内容安全策略 (CSP),默认情况下,CSS 和图像等几个资产是分开存储的。您也可以创建一个独立的报告,这样在分享您的结果时会更加方便。这可以通过以下方式完成:

$ pytest --html=report.html --self-contained-html

作为文件或链接添加的图像将作为外部资源链接,这意味着独立报告 HTML 文件可能无法按预期显示这些图像。

将文件或链接添加到独立报告时,插件会发出警告。


推荐阅读