Как включить скриншот селена в 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)

Но это можно легко исправить, проверив наличие драйвера - это происходит потому, что драйвер закрывается до создания отчета.

Другие вопросы по тегам