如何在 pytest bdd 中包含 selenium 屏幕截图以通过测试?

How to include selenium screenshot in pytest bdd for passed tests?

我正在用 selenium 在 pytest bdd 中编写测试。我正在使用 pytest-html 生成报告。出于调试目的或只是为了进行适当的日志记录,我想要 selenium 屏幕截图和 html 报告中的其余日志。但是我无法在通过的报告中使用 selenium 屏幕截图。

这是我正在尝试的事情。 在 conftest.py

中有一个 pytest-html 钩子包装器

conftest.py

@pytest.mark.hookwrapper
def pytest_runtest_makereport(item, call):
    pytest_html = item.config.pluginmanager.getplugin('html')
    outcome = yield
    report = outcome.get_result()
    print("printing report")
    extra = getattr(report, 'extra', [])
    if report.when == 'call':
        mylogs = ""
        with open('/tmp/test.log', 'r') as logfile:
            for line in logfile:
                mylogs = mylogs + line + "<br>"
        extra.append(pytest_html.extras.html('<html><body>{}</body></html>'.format(mylogs)))
        report.extra = extra

此代码正在我的 report.html 中添加日志 同样,我将在我的测试代码中添加一些 selenium 屏幕截图。 我想知道我们是否可以生成包含所有 selenium 屏幕截图的报告。

以下是我的测试文件

test_file.py

def test_case():
    logger.info("I will now open browser")
    driver = webdriver.Chrome()
    driver.get('http://www.google.com')
    driver.save_screenshot('googlehome.png')
    time.sleep(3)
    driver.quit()

我希望 googlehome.png 和所有其他 png 文件成为 html 报告的一部分。如果我们可以生成像 html 报告这样的机器人框架,我会很棒。

在 pytest 中有什么方法可以做到这一点吗?

以下是我用来生成报告的命令

py.test -s --html=report.html --self-contained-html  -v

您必须将 webdriver 从测试传递到 pytest 报告系统。 在我的例子中,我使用 webdriver 作为 fixtuer。这还有很多其他优点 - 例如,您可以测试任何一组浏览器并从一个地方控制它。

@pytest.fixture(scope='session', params=['chrome'], ids=lambda x: 'Browser: {}'.format(x))
def web_driver(request):
    browsers = {'chrome': webdriver.Chrome}
    return browsers[]()


def test_case(web_driver):
    logger.info("I will now open browser")
    web_driver.get('http://www.google.com')


@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    outcome = yield
    rep = outcome.get_result()
    if rep.when == 'call' and not rep.failed:
        try:
            if 'web_driver' in item.fixturenames:
                web_driver = item.funcargs['web_driver']
            else:
                return  # This test does not use web_driver and we do need screenshot for it
        # web_driver.save_screenshot and other magic to add screenshot to your report
    except Exception as e:
        print('Exception while screen-shot creation: {}'.format(e))

这是我解决问题的方法:

好的,下面是从报告生成挂钩访问 webdriver 的方法:

@pytest.mark.hookwrapper
def pytest_runtest_makereport(item, call):

timestamp = datetime.now().strftime('%H-%M-%S')

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.getfuncargvalue('browser')
    driver.save_screenshot('D:/report/scr'+timestamp+'.png')

    extra.append(pytest_html.extras.image('D:/report/scr'+timestamp+'.png'))

    # always add url to report
    extra.append(pytest_html.extras.url('http://www.example.com/'))
    xfail = hasattr(report, 'wasxfail')
    if (report.skipped and xfail) or (report.failed and not xfail):
        # only add additional html on failure
        extra.append(pytest_html.extras.image('D:/report/scr.png'))
        extra.append(pytest_html.extras.html('<div>Additional HTML</div>'))
    report.extra = extra