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

时间:2018-01-04 16:45:14

标签: python selenium pytest gherkin pytest-html

我正在使用selenium在pytest bdd中编写测试。我使用pytest-html生成报告。出于调试目的或只是为了获得正确的日志记录,我希望在html报告中使用selenium屏幕截图和其他日志。但我在传递的报告中无法获得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

2 个答案:

答案 0 :(得分:1)

你必须将webdriver从test传递到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))

答案 1 :(得分:0)

这是我如何解决我的问题:

好的,这是从报告生成挂钩访问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