0

0

pytest 如何让失败用例自动保存截图/日志(pytest-selenium示例)

冷漠man

冷漠man

发布时间:2026-01-25 12:38:03

|

639人浏览过

|

来源于php中文网

原创

pytest-selenium失败时需通过fixture中addfinalizer在teardown阶段检查request.node.rep_call.failed并调用driver.save_screenshot()实现自动截图,路径建议含时间戳和用例名;官方已移除screenshot_on_failure参数,须手动实现。

pytest 如何让失败用例自动保存截图/日志(pytest-selenium示例)

pytest-selenium 失败时怎么自动截图

默认情况下 pytest-selenium 不会自动截图,必须显式调用 driver.save_screenshot()。要实现「失败自动截图」,得靠 pytest 的钩子函数,在用例结束且状态为失败时触发保存逻辑。

关键点是使用 pytest_runtest_makereport 钩子获取测试结果,并在 teardown 阶段(或 exception 时)调用截图。但注意:此时 driver 实例可能已被 quit() —— 所以截图动作必须放在 driver 关闭前,通常绑定到 request.addfinalizer 或 fixture 的 teardown 中。

  • 推荐把 driver 初始化写在 fixture 里,用 scope="function" 确保每个用例独立
  • 在 fixture 的 teardown 部分检查是否失败(通过 request.node.rep_call.failed),再截图
  • 截图路径建议带时间戳和用例名,避免覆盖:f"screenshots/{request.node.name}_{int(time.time())}.png"

如何在 fixture 中安全访问测试结果

pytest 的 request.node 在测试执行完后才填充 rep_call 属性,所以不能在 fixture setup 阶段读,而要在 finalizer 里延迟读取。常见错误是直接在 fixture 返回 driver 前就尝试读 rep_call,此时它还是 None

正确做法是用 request.addfinalizer() 注册一个清理函数,该函数在测试函数执行完毕后运行,此时 request.node.rep_call 已就绪:

@pytest.fixture
def driver(request):
    driver = webdriver.Chrome()
    def fin():
        if request.node.rep_call and request.node.rep_call.failed:
            timestamp = int(time.time())
            name = request.node.name.replace("[", "_").replace("]", "_")
            driver.save_screenshot(f"screenshots/{name}_{timestamp}.png")
        driver.quit()
    request.addfinalizer(fin)
    return driver

注意:rep_call 只对 call 阶段(即测试函数本身)有效;setup/teardown 失败会写入 rep_setuprep_teardown,需分别判断。

pytest-selenium 自带的 screenshot_on_failure 参数有用吗

没用。pytest-selenium 早期版本曾提供 --screenshot-on-failure 命令行参数,但自 2.0+ 起已移除,文档也未保留。当前 PyPI 上最新版(如 4.x)完全不支持该参数,传了也不会生效,还会被 pytest 忽略或报错 unrecognized arguments

Gaga
Gaga

曹越团队开发的AI视频生成工具

下载
  • 不要依赖 --screenshot-on-failurescreenshot_on_failure=True 这类配置
  • 官方推荐方式就是手动 hook + fixture 控制,灵活性更高
  • 如果项目用了 pytest-base-urlpytest-html,可配合生成带截图链接的报告,但截图动作仍需自己写

日志怎么同步保存(非截图)

浏览器控制台日志(console logs)、网络请求(performance logs)、Selenium 日志都不能靠截图捕获,得主动拉取。失败时最实用的是 driver.get_log("browser"),但要注意:logging_prefs 必须在 driver 初始化时开启,否则返回空列表。

示例(在 fixture 初始化 driver 时):

options = webdriver.ChromeOptions()
options.set_capability("goog:loggingPrefs", {"browser": "ALL"})
driver = webdriver.Chrome(options=options)

然后在 finalizer 的失败分支中追加:

if request.node.rep_call.failed:
    logs = driver.get_log("browser")
    with open(f"logs/{name}_{timestamp}.log", "w") as f:
        for entry in logs:
            f.write(f"[{entry['level']}] {entry['timestamp']}: {entry['message']}\n")

容易忽略的是:不同浏览器日志类型不同("browser" 是 Chrome/Firefox 支持的,Edge 需用 "performance""driver"),而且 get_log() 在某些 Selenium 版本中对 headless 模式支持不稳定。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

822

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

741

2023.11.06

html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

619

2023.06.14

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

661

2023.06.21

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

474

2023.07.31

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

245

2023.08.01

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2903

2023.08.11

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

508

2023.08.11

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

44

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

AngularJS教程
AngularJS教程

共24课时 | 2.9万人学习

CSS教程
CSS教程

共754课时 | 23.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号