如何在pytest+Selenium中捕获Fixture失败(测试错误)时的截图
解决Fixture失败时的截图问题
你的问题出在当前钩子只监听了测试用例执行的call阶段,而Fixture的失败通常发生在setup(前置准备)或teardown(清理)阶段,且此时测试报告的状态会标记为error,所以原逻辑没触发截图。
修改后的钩子代码可以覆盖所有阶段,并捕获failed和error状态的情况:
import time def pytest_runtest_makereport(item, call): outcome = yield report = outcome.get_result() # 覆盖setup、call、teardown三个阶段 if report.when in ("setup", "call", "teardown"): # 捕获失败(包括用例失败的failed和Fixture失败的error) if report.failed or hasattr(report, 'error'): # 确保driver实例存在再执行截图 if 'DRIVER' in item.funcglobals or hasattr(item.module, 'DRIVER'): DRIVER = item.funcglobals.get('DRIVER', getattr(item.module, 'DRIVER')) time.sleep(1) # 自定义截图文件名,包含测试名称和阶段便于区分 screenshot_file = f"{item.name}_{report.when}_screenshot.png" DRIVER.save_screenshot(screenshot_file)
关键修改说明:
- 移除仅针对
call阶段的限制,改为监听setup、call、teardown全阶段 - 新增对
error状态的判断,覆盖Fixture失败的场景 - 增加driver实例存在性校验,避免因Fixture早于driver初始化失败时出现报错
- 优化截图文件命名规则,加入测试名称和执行阶段,方便定位问题场景
如果你的DRIVER是通过Fixture注入的,通过item.funcglobals获取能确保拿到当前测试上下文的实例,避免全局变量引发的冲突。
内容的提问来源于stack exchange,提问作者dastan12
相关产品推荐
相关产品推荐

