为何pytest-html报告无法显示Fixture错误时的截图?是否不支持ERROR案例?
pytest-fixture执行失败时截图无法在pytest-html报告中显示的问题
我定义了一个带autouse=True的@pytest.fixture,用于执行每个测试用例的前置必要步骤。当该fixture执行失败(例如超时)时,pytest-html生成的HTML报告会将状态标记为ERROR,但不会捕获截图。
我给这个fixture编写了一个装饰器screenshot_on_fixture_failure,用于捕获异常时生成截图并添加到extras中,截图功能本身正常,但截图并未显示在报告中。想问是否是因为pytest-html不支持为ERROR案例添加截图?
Fixture代码
@pytest.fixture(autouse=True) @screenshot_on_fixture_failure def open_videochat_page(vi_rewrite_gui, request, extras): global ident_id vi_rewrite_gui.mobile_number = '+656181985165' vi_rewrite_gui.open_userdata_page(shortname).fill_userdata_successfully() vi_rewrite_gui.click_consent_btn() vi_rewrite_gui.click_continue_btn() vi_rewrite_gui.wait_for_channel_chooser() vi_rewrite_gui.wait_for_page_to_load() ident_id = vi_rewrite_gui.get_ident_id() vi_rewrite_gui.select_web_channel().fill_web_channel_successfully().click_ready_continue() vi_rewrite_gui.wait_for_cqc_success()
装饰器代码
def screenshot_on_fixture_failure(fixture_func): @wraps(fixture_func) def wrapper(*args, **kwargs): try: # 执行原fixture函数 return fixture_func(*args, **kwargs) except Exception as e: extras = kwargs.get('extras') request = kwargs.get('request') driver_instance = kwargs.get('vi_rewrite_gui') screenshot_name = f"{request.node.name} - {datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.png" image = driver_instance.take_screenshot_base64() extras.append(pytest_html.extras.image(image, name=screenshot_name)) print(f"Fixture错误已截图: {screenshot_name}") print(f"Fixture错误信息: {str(e)}") # 重新抛出异常使测试标记为失败 raise e return wrapper
问题原因及解决办法
不是pytest-html不支持为ERROR案例添加截图,问题出在操作extras的方式上:当fixture执行失败时,直接往传入的extras列表追加内容无法被pytest-html正确捕获,此时测试用例的上下文绑定逻辑还未完成。
正确的做法是通过request.node的extra属性添加截图,修改后的装饰器代码如下:
from datetime import datetime from functools import wraps import pytest_html def screenshot_on_fixture_failure(fixture_func): @wraps(fixture_func) def wrapper(*args, **kwargs): try: return fixture_func(*args, **kwargs) except Exception as e: request = kwargs.get('request') driver_instance = kwargs.get('vi_rewrite_gui') screenshot_name = f"{request.node.name} - {datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.png" image = driver_instance.take_screenshot_base64() # 直接操作request.node的extra属性 request.node.extra.append(pytest_html.extras.image(image, name=screenshot_name)) print(f"Fixture错误已截图: {screenshot_name}") print(f"Fixture错误信息: {str(e)}") raise e return wrapper
这样修改后,当fixture抛出异常时,截图会被正确添加到测试节点的额外内容中,pytest-html生成报告时就能显示这张截图了。
内容的提问来源于stack exchange,提问作者Vladimir Popescu
相关产品推荐
相关产品推荐

