之前的做法是通过在basepage中封装一个失败截图保存到allure报告中的方法,如下

然后使用时,通过try...except 手动判断是否发生了断言异常,发生了则调用该方法

conftest文件中的内容
import os
import pytest
import allure
from selenium import webdriver
# 设置全局变量的原因是因为,pytest_runtest_makereport方法中要用到,而我们创建的driver是在方法里面,因此设置全局变量,两方都可解决
driver = None 
# 设置全局的原因是,想只开一次浏览器,完成所有用例的执行;如果不想设置全局,则if driver is None这行代码要去掉,否则存在问题
@pytest.fixture(scope=‘session‘)
def browser():
    global driver
    # 只打开一次浏览器,完成所有用例的操作
    if driver is None:
        driver = webdriver.Chrome()
    yield driver
    driver.quit()
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
    print(‘------------------------------------‘)
    # 获取钩子方法的调用结果
    outcome = yield
    rep = outcome.get_result()
    # 仅仅获取用例call 执行结果是失败的情况, 不包含 setup/teardown
    if rep.when == "call" and rep.failed:
        # 添加allure报告截图
        # 如果当前webdriverr版本中有该方法,则使用
        if hasattr(driver, "get_screenshot_as_png"):
            with allure.step(‘添加失败截图...‘):
                allure.attach(driver.get_screenshot_as_png(), "失败截图", allure.attachment_type.PNG)
用例中的内容
import pytest
from selenium import webdriver
lis = [‘百度4下‘,‘百度一下‘,‘百度N下‘]
@pytest.mark.parametrize(‘data‘, lis)
def test_screen(browser,data):
    driver = browser
    driver.get("http://www.baidu.com")
    text_value = driver.find_element("id", "su").get_attribute(‘value‘)
    assert text_value == data
效果如下

pytest_runtest_makereport实现断言失败自动截图并集成到allure报告
原文:https://www.cnblogs.com/zhongzhouyun/p/15217093.html