Pytest失败时自动截图需在pytest_runtest_makereport钩子中判断report.when=="call"且report.failed为真,再调用Selenium的driver.save_screenshot()保存含用例名和时间戳的结构化路径截图,避免setup/teardown误截或并发覆盖。

Pytest失败时怎么自动触发截图
Pytest本身不处理截图,必须靠测试框架(如Selenium)或钩子函数介入。关键不是“截图”,而是“在pytest_runtest_makereport钩子中捕获失败状态后调用截图逻辑”。否则容易漏掉异常未抛出但断言失败的场景。
常见错误是只监听except块——但Pytest的断言失败(AssertionError)不会走except,而是由内部机制处理,必须用钩子捕获报告状态。
- 在
conftest.py里定义pytest_runtest_makereport函数 - 检查
report.when == "call"且report.status == "failed" - 此时
request.node可访问当前测试实例,从中提取已初始化的浏览器对象(比如叫driver) - 调用
driver.save_screenshot(),路径建议含测试名+时间戳,避免覆盖
Selenium WebDriver截图保存路径怎么组织才不混乱
直接写死路径如"./screenshot.png"会导致多用例并发时互相覆盖,而用time.time()又难追溯归属。推荐用测试节点ID生成结构化路径。
示例:f"screenshots/{request.node.name}_{int(time.time())}.png",再配合os.makedirs(os.path.dirname(path), exist_ok=True)确保目录存在。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 路径前缀统一用
screenshots/,别用./screenshots或绝对路径,否则CI环境可能无权限 - 文件名里必须包含
request.node.name,这是Pytest内部唯一稳定标识测试用例的字段 - 避免在
setup_method里提前创建driver并截图——此时测试还没执行,无法判断是否失败
为什么截图代码放在fixture teardown里总不生效
因为teardown(即yield后的部分)在测试结束后无条件执行,不管成功失败;而截图只应在失败时做,否则会污染结果、拖慢速度。更严重的是:如果测试崩溃导致driver已销毁,teardown里再调用driver.save_screenshot()会抛WebDriverException,反而掩盖原错误。
- 不要在
@pytest.fixture的yield后写截图逻辑 - 不要依赖
finally块做失败判断——它无法区分是断言失败还是系统异常 - 真正可靠的时机只有
pytest_runtest_makereport钩子中when=="call"且status=="failed"
Headless模式下截图为空白或白屏怎么办
Chrome/Firefox在headless模式下默认窗口尺寸极小(如800×600),某些前端组件(尤其带媒体查询的)可能未渲染,导致截图空白。这不是代码问题,是渲染上下文缺失。
- 启动driver时显式设置
--window-size=1920,1080(Chrome)或--width=1920 --height=1080(Firefox) - 对React/Vue项目,截图前加
driver.execute_script("return document.readyState") == "complete"等待页面就绪 - 避免截图过早——比如刚
get()完立刻截,应等关键元素出现:WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, "main")))
截图不是万能调试手段,它只反映那一刻的DOM快照;如果页面异步加载内容,得结合driver.page_source和日志交叉验证。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










