pytest 的 html 报告者不会 take/show 在基于 pytest-playwright 的测试的测试报告中截图
pytest's html reporter doesn't take/show screenshot in the test reports for pytest-playwright based tests
我尝试 运行 我的第一个剧作家测试使用 pytest-playwright
并且测试 运行 很好但是当我尝试使用 pytest html reporter
向我展示报告失败测试的屏幕截图它不起作用
pytest 版本 == 7.0.1
pytest-playwright 版本 == 0.2.3
预计会失败的测试:
def test_pw():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("http://www.html")
browser.close()
运行 命令:pytest --html report_pw1.html
任何人都可以建议我在这里缺少什么吗?
我阅读了 pytest html 的 docs,它说对于失败的测试,默认情况下应该自动包含屏幕截图,但它并没有发生,所以
您必须在根级别创建 conftest.py 文件。我从 pytest-html 官方文档中改编了这段代码:
# conftest.py
import pytest
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
pytest_html = item.config.pluginmanager.getplugin("html")
outcome = yield
screen_file = ''
report = outcome.get_result()
extra = getattr(report, "extra", [])
if report.when == "call":
if report.failed and "page" in item.funcargs:
page = item.funcargs["page"]
screenshot_dir = Path("screenshots")
screenshot_dir.mkdir(exist_ok=True)
screen_file = str(screenshot_dir / f"{slugify(item.nodeid)}.png")
page.screenshot(path=screen_file)
xfail = hasattr(report, "wasxfail")
if (report.skipped and xfail) or (report.failed and not xfail):
# add the screenshots to the html report
extra.append(pytest_html.extras.png(screen_file))
report.extra = extra
您必须安装 pytest-playwright:
pip install pytest-playwright
然后您的测试可以访问 page fixture(它可用于 item.funcargs 在 conftest.py 文件):
def test_example_is_failing(page):
page.goto("https://example.com")
assert page.inner_text('h1') == 'Any text to make it fail'
我相信如果我们在文档中进行更多挖掘,应该会有更好的方法。我使用了这些链接:
Pytest-html 额外内容文档:
https://pytest-html.readthedocs.io/en/latest/user_guide.html#extra-content
剧作家pytest插件:
如果您指的是插件 pytest-html-reporter (not pytest-html),那么以下捕获屏幕截图的实现可能会有所帮助
注意:需要使用 pytest fixture
在 conftest.py 中的方法名称 setup
中完成驱动程序初始化
from pytest_html_reporter import attach
import pytest
@pytest.mark.usefixtures("setup")
class BaseClass:
pass
class TestClass(BaseClass):
def test_pass(self):
assert True
def test_fail(self):
assert False
def teardown_method(self):
'''to capture screenshot on test method failure'''
attach(data=self.driver.get_screenshot_as_png())
我尝试 运行 我的第一个剧作家测试使用 pytest-playwright
并且测试 运行 很好但是当我尝试使用 pytest html reporter
向我展示报告失败测试的屏幕截图它不起作用
pytest 版本 == 7.0.1
pytest-playwright 版本 == 0.2.3
预计会失败的测试:
def test_pw():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("http://www.html")
browser.close()
运行 命令:pytest --html report_pw1.html
任何人都可以建议我在这里缺少什么吗? 我阅读了 pytest html 的 docs,它说对于失败的测试,默认情况下应该自动包含屏幕截图,但它并没有发生,所以
您必须在根级别创建 conftest.py 文件。我从 pytest-html 官方文档中改编了这段代码:
# conftest.py
import pytest
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
pytest_html = item.config.pluginmanager.getplugin("html")
outcome = yield
screen_file = ''
report = outcome.get_result()
extra = getattr(report, "extra", [])
if report.when == "call":
if report.failed and "page" in item.funcargs:
page = item.funcargs["page"]
screenshot_dir = Path("screenshots")
screenshot_dir.mkdir(exist_ok=True)
screen_file = str(screenshot_dir / f"{slugify(item.nodeid)}.png")
page.screenshot(path=screen_file)
xfail = hasattr(report, "wasxfail")
if (report.skipped and xfail) or (report.failed and not xfail):
# add the screenshots to the html report
extra.append(pytest_html.extras.png(screen_file))
report.extra = extra
您必须安装 pytest-playwright:
pip install pytest-playwright
然后您的测试可以访问 page fixture(它可用于 item.funcargs 在 conftest.py 文件):
def test_example_is_failing(page):
page.goto("https://example.com")
assert page.inner_text('h1') == 'Any text to make it fail'
我相信如果我们在文档中进行更多挖掘,应该会有更好的方法。我使用了这些链接:
Pytest-html 额外内容文档:
https://pytest-html.readthedocs.io/en/latest/user_guide.html#extra-content
剧作家pytest插件:
如果您指的是插件 pytest-html-reporter (not pytest-html),那么以下捕获屏幕截图的实现可能会有所帮助
注意:需要使用 pytest fixture
在 conftest.py 中的方法名称setup
中完成驱动程序初始化
from pytest_html_reporter import attach
import pytest
@pytest.mark.usefixtures("setup")
class BaseClass:
pass
class TestClass(BaseClass):
def test_pass(self):
assert True
def test_fail(self):
assert False
def teardown_method(self):
'''to capture screenshot on test method failure'''
attach(data=self.driver.get_screenshot_as_png())