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-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())