1

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

这是我正在尝试的事情。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 屏幕截图。我想知道我们是否可以生成包含所有硒屏幕截图的报告。

以下是我的测试文件

测试文件.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
4

2 回答 2

1

您必须将 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))
于 2018-01-09T07:44:40.283 回答
1

这是我解决我的方法:

好的,这是您从报告生成挂钩访问 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
于 2018-11-23T10:53:42.763 回答