You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:54:30