Pytest HTML 不显示图像
Pytest HTML Not Displaying Image
我正在尝试使用 pytest-html 和 selenium 生成自包含的 html 报告。我一直在尝试将屏幕截图嵌入到报告中,但没有显示出来。
我的conftest.py看起来像这样
@pytest.fixture()
def chrome_driver_init(request, path_to_chrome):
driver = webdriver.Chrome(options=opts, executable_path=path_to_chrome)
request.cls.driver = driver
page_object_init(request, driver)
driver.get(URL)
driver.maximize_window()
yield driver
driver.quit()
# Hook that takes a screenshot of the web browser for failed tests and adds it to the HTML report
@pytest.hookimpl(hookwrapper=True)
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":
feature_request = item.funcargs['request']
driver = feature_request.getfixturevalue('chrome_driver_init')
nodeid = item.nodeid
xfail = hasattr(report, "wasxfail")
if (report.skipped and xfail) or (report.failed and not xfail):
file_name = f'{nodeid}_{datetime.today().strftime("%Y-%m-%d_%H_%M")}.png'.replace("/", "_").replace("::", "_").replace(".py", "")
driver.save_screenshot("./reports/screenshots/"+file_name)
extra.append(pytest_html.extras.image("/screenshots/"+file_name))
report.extra = extra
我确信问题出在图像的路径上,我已经尝试了很多 str 组合,os.path 和 pathlib 但没有任何效果。屏幕截图保存在预期位置,我可以像打开任何其他图像一样打开它。它只是没有显示在报告上。
<div class="image"><img src="data:image/png;base64,screenshots\scr_tests_test_example_TestExample_test_fail_example_2022-01-18_16_26.png"/></div>
编辑:进一步澄清。我曾尝试在 extra.append
中使用绝对路径,但它一直在 HTML 文件中给我一个 Cant Resolve File
错误。我的绝对路径是(删除了一些个人详细信息)C:\Users\c.Me\OneDrive - Me\Documents\GitHub\project\build\reports\screenshots\filename.png
我已经尝试过使用 '/' 和 '\'
还有我的文件结构
project
├───build
│ ├───reports
│ ├───screenshots
│ ├───filename.png
| ├───report.html
| ├───run.py # I am running the test suite from here
├───scr
| ├───settings.py
│ ├───tests
│ ├───confest.py
run.py
if __name__ == "__main__":
os.system(f"pytest --no-header -v ../scr/tests/ --html=./reports/Test_Report_{today}.html --self-contained-html")
先知,请保佑我这一天
要获得 Cannot Resolve Directory
错误,我的代码如下
file_name = f'{nodeid}_{datetime.today().strftime("%Y-%m-%d_%H_%M")}.png'.replace("/", "_").replace("::", "_").replace(".py", "")
img_path = os.path.join(REPORT_PATH, 'screenshots', file_name)
driver.save_screenshot(img_path)
extra.append(pytest_html.extras.image(img_path))
变量 REPORT_PATH
从 settings.py 导入(见上面的目录树)并由
创建
PROJ_PATH = Path(__file__).parent.parent
REPORT_PATH = PROJ_PATH.joinpath("build\reports")
同样有趣的是,如果我这样做 img_path.replace("\", "/")
,错误会变为 Cannot Resolve File
我不完全确定它如何与 PyTest 一起工作,但是我们在 Java Extent Manager 中也有类似的问题。
那里你必须传递图像文件的绝对路径,而不是相对路径。
如我所见,here 当前工作目录可以实现如下:
import pathlib
pathlib.Path().resolve()
因此,如果我理解正确,您应该将代码从
extra.append(pytest_html.extras.image("/screenshots/"+file_name))
至
working_root = pathlib.Path().resolve()
extra.append(pytest_html.extras.image(working_root + "/screenshots/"+file_name))
UPD
我认为您在这里缺少 reports
子文件夹。
而不是
working_root = pathlib.Path().resolve()
extra.append(pytest_html.extras.image(working_root + "/screenshots/"+file_name))
尝试使用
working_root = pathlib.Path().resolve()
extra.append(pytest_html.extras.image(working_root + "/reports/screenshots/"+file_name))
在这段痛苦的旅程中,我学到了很多。主要是我知道我是个白痴。问题是我想做一个独立的 HTML。 Pytest-html 在将图像添加到自包含报告时无法按预期工作。在你可以之前,你必须先将图像转换成它的文本 base64 版本。所以我所有欠下的答案都是一行代码。
@pytest.hookimpl(hookwrapper=True)
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":
feature_request = item.funcargs['request']
driver = feature_request.getfixturevalue('chrome_driver_init')
nodeid = item.nodeid
xfail = hasattr(report, "wasxfail")
if (report.skipped and xfail) or (report.failed and not xfail):
file_name = f'{nodeid}_{datetime.today().strftime("%Y-%m-%d_%H_%M")}.png'.replace("/", "_").replace("::", "_").replace(".py", "")
img_path = os.path.join(REPORT_PATH, "screenshots", file_name)
driver.save_screenshot(img_path)
screenshot = driver.get_screenshot_as_base64() # the hero
extra.append(pytest_html.extras.image(screenshot, ''))
report.extra = extra
感谢先知对这次朝圣之旅的指导。现在我必须休息了。
我正在尝试使用 pytest-html 和 selenium 生成自包含的 html 报告。我一直在尝试将屏幕截图嵌入到报告中,但没有显示出来。
我的conftest.py看起来像这样
@pytest.fixture()
def chrome_driver_init(request, path_to_chrome):
driver = webdriver.Chrome(options=opts, executable_path=path_to_chrome)
request.cls.driver = driver
page_object_init(request, driver)
driver.get(URL)
driver.maximize_window()
yield driver
driver.quit()
# Hook that takes a screenshot of the web browser for failed tests and adds it to the HTML report
@pytest.hookimpl(hookwrapper=True)
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":
feature_request = item.funcargs['request']
driver = feature_request.getfixturevalue('chrome_driver_init')
nodeid = item.nodeid
xfail = hasattr(report, "wasxfail")
if (report.skipped and xfail) or (report.failed and not xfail):
file_name = f'{nodeid}_{datetime.today().strftime("%Y-%m-%d_%H_%M")}.png'.replace("/", "_").replace("::", "_").replace(".py", "")
driver.save_screenshot("./reports/screenshots/"+file_name)
extra.append(pytest_html.extras.image("/screenshots/"+file_name))
report.extra = extra
我确信问题出在图像的路径上,我已经尝试了很多 str 组合,os.path 和 pathlib 但没有任何效果。屏幕截图保存在预期位置,我可以像打开任何其他图像一样打开它。它只是没有显示在报告上。
<div class="image"><img src="data:image/png;base64,screenshots\scr_tests_test_example_TestExample_test_fail_example_2022-01-18_16_26.png"/></div>
编辑:进一步澄清。我曾尝试在 extra.append
中使用绝对路径,但它一直在 HTML 文件中给我一个 Cant Resolve File
错误。我的绝对路径是(删除了一些个人详细信息)C:\Users\c.Me\OneDrive - Me\Documents\GitHub\project\build\reports\screenshots\filename.png
我已经尝试过使用 '/' 和 '\'
还有我的文件结构
project
├───build
│ ├───reports
│ ├───screenshots
│ ├───filename.png
| ├───report.html
| ├───run.py # I am running the test suite from here
├───scr
| ├───settings.py
│ ├───tests
│ ├───confest.py
run.py
if __name__ == "__main__":
os.system(f"pytest --no-header -v ../scr/tests/ --html=./reports/Test_Report_{today}.html --self-contained-html")
先知,请保佑我这一天
要获得 Cannot Resolve Directory
错误,我的代码如下
file_name = f'{nodeid}_{datetime.today().strftime("%Y-%m-%d_%H_%M")}.png'.replace("/", "_").replace("::", "_").replace(".py", "")
img_path = os.path.join(REPORT_PATH, 'screenshots', file_name)
driver.save_screenshot(img_path)
extra.append(pytest_html.extras.image(img_path))
变量 REPORT_PATH
从 settings.py 导入(见上面的目录树)并由
PROJ_PATH = Path(__file__).parent.parent
REPORT_PATH = PROJ_PATH.joinpath("build\reports")
同样有趣的是,如果我这样做 img_path.replace("\", "/")
,错误会变为 Cannot Resolve File
我不完全确定它如何与 PyTest 一起工作,但是我们在 Java Extent Manager 中也有类似的问题。
那里你必须传递图像文件的绝对路径,而不是相对路径。
如我所见,here 当前工作目录可以实现如下:
import pathlib
pathlib.Path().resolve()
因此,如果我理解正确,您应该将代码从
extra.append(pytest_html.extras.image("/screenshots/"+file_name))
至
working_root = pathlib.Path().resolve()
extra.append(pytest_html.extras.image(working_root + "/screenshots/"+file_name))
UPD
我认为您在这里缺少 reports
子文件夹。
而不是
working_root = pathlib.Path().resolve()
extra.append(pytest_html.extras.image(working_root + "/screenshots/"+file_name))
尝试使用
working_root = pathlib.Path().resolve()
extra.append(pytest_html.extras.image(working_root + "/reports/screenshots/"+file_name))
在这段痛苦的旅程中,我学到了很多。主要是我知道我是个白痴。问题是我想做一个独立的 HTML。 Pytest-html 在将图像添加到自包含报告时无法按预期工作。在你可以之前,你必须先将图像转换成它的文本 base64 版本。所以我所有欠下的答案都是一行代码。
@pytest.hookimpl(hookwrapper=True)
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":
feature_request = item.funcargs['request']
driver = feature_request.getfixturevalue('chrome_driver_init')
nodeid = item.nodeid
xfail = hasattr(report, "wasxfail")
if (report.skipped and xfail) or (report.failed and not xfail):
file_name = f'{nodeid}_{datetime.today().strftime("%Y-%m-%d_%H_%M")}.png'.replace("/", "_").replace("::", "_").replace(".py", "")
img_path = os.path.join(REPORT_PATH, "screenshots", file_name)
driver.save_screenshot(img_path)
screenshot = driver.get_screenshot_as_base64() # the hero
extra.append(pytest_html.extras.image(screenshot, ''))
report.extra = extra
感谢先知对这次朝圣之旅的指导。现在我必须休息了。