Как включить скриншот селена в pytest bdd для пройденных тестов?
Я пишу тесты в 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 Аналогичным образом, я добавлю несколько скриншотов селен в свой тестовый код. Я хочу знать, сможем ли мы создать отчет, содержащий все скриншоты селеном.
Ниже мой тестовый файл
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 ответа
Вы должны передать веб-драйвер из теста в систему отчетов 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))
Вот как я решил мой:
Итак, вот как вы получаете доступ к веб-драйверу из ловушки генерации отчетов:
@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.common.exceptions.WebDriverException: Message: chrome not reachable
(Session info: chrome=61.0.3153.0)
(Driver info: chromedriver=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f),platform=Windows NT 10.0.17134 x86_64)
Но это можно легко исправить, проверив наличие драйвера - это происходит потому, что драйвер закрывается до создания отчета.