如何在 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
我正在用 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