我正在使用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
答案 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