一文详解Playwright截图和视频录制功能的常用场景与企业项目实战
作者:Java后端的Ai之路
一句话结论:Playwright 的截图适合“固定证据”,视频适合“还原动作”,Trace 适合“定位根因”。企业项目不要把所有用例都录成视频,而应该采用“失败截图 + 首次重试视频 + 首次重试 Trace + HTML 报告”的分层策略。

本文基于 Playwright 官方文档、官方发布说明以及 Selenium、Cypress 官方资料整理,检索时间为 2026 年 9 月 8 日。示例优先使用 Python,涉及 Playwright Test 专属配置时会明确使用 TypeScript。
一、先说痛点:自动化测试失败了,为什么还要人工“猜”

在企业项目里,最让测试、开发和运维头疼的不是“测试失败”,而是失败后没有足够证据。
例如,支付回归任务凌晨在 CI 中失败。日志只显示 Timeout 30000ms exceeded,开发第二天在本地重跑却通过了。此时团队通常会遇到四个问题:页面当时显示了什么,用户实际点击了哪个元素,接口返回了什么,失败发生在第一次执行还是重试阶段。
如果只保存一段文本日志,团队往往只能靠猜。截图能够回答“当时页面长什么样”,视频能够回答“用户做了哪些动作”,Trace 则能够进一步展示动作前后 DOM 快照、网络请求、控制台和源代码位置。[1] [4]
1.1 痛点一:失败画面没有留下来
弹窗遮挡、样式错位、按钮变灰、接口错误提示等问题,单靠日志很难表达。截图适合保留失败瞬间的视觉状态,也适合做视觉回归基线。
1.2 痛点二:偶发问题无法复盘
竞态条件、慢接口、动画未结束、浏览器差异等问题,通常不是每次都出现。视频能够把点击、输入、跳转和等待过程串起来,比一张静态图更容易复盘。
1.3 痛点三:录了视频仍然不知道根因
视频只能说明“发生了什么”,不一定能说明“为什么发生”。例如按钮看起来存在,但定位 器实际匹配了多个节点;接口返回 500,但页面仍然显示旧数据。Trace Viewer 可以沿时间轴查看动作、DOM 快照、网络请求、控制台、错误和附件,因此它通常更适合 CI 失败诊断。[4]
1.4 解决方案:把测试工件分成三层
| 工件 | 主要回答的问题 | 适合场景 | 成本 |
|---|---|---|---|
| 截图 | 失败瞬间的页面状态是什么 | 失败留证、视觉回归、业务截图 | 低 |
| 视频 | 测试按照什么动作走到了失败点 | 偶发失败、交互复盘、演示 | 中 |
| Trace | 哪一步动作、哪个请求或哪个 DOM 状态导致失败 | CI 调试、跨浏览器问题、复杂链路 | 中高 |
企业项目的关键不是“能不能录”,而是在证据价值、运行性能、存储成本和敏感数据之间取得平衡。
二、Playwright 是什么,为什么截图和录制功能值得使用
Playwright 是一个面向现代 Web 应用的浏览器自动化与端到端测试框架。它通过统一 API 驱动 Chromium、Firefox 和 WebKit,并提供定位 器、自动等待、断言、网络控制、截图、视频和 Trace 等能力。[2] [3]
这里可以把一次测试理解成一场“带摄像机的验收”:
- Page 是浏览器中的一个页面。
- BrowserContext 是一个隔离的浏览器会话,类似一个独立的隐身窗口。
- Screenshot 是某个时刻的照片。
- Video 是整个会话的录像。
- Trace 是带时间轴、DOM、网络和日志的黑匣子。
Playwright 的价值并不只是“截图 API 更简单”。它把证据采集和测试运行生命周期结合起来:定位 器支持自动等待,Web-first assertions 会等待页面达到预期状态,失败时可以配合截图、视频和 Trace 形成可追溯的报告。[3]
2.1 它解决的核心问题
第一,它减少了手工等待导致的脆弱性。官方最佳实践建议优先使用面向用户的定位方式,例如角色、名称、标签和显式测试标识,而不是依赖容易变化的 CSS 层级或 XPath。[3]
第二,它能够覆盖多个浏览器项目。企业前端需要关注 Chromium、Firefox 和 WebKit 的差异,Playwright 可以在配置中声明多个项目并行执行。[3]
第三,它把“失败现场”变成可分发的工件。HTML 报告、截图、视频和 Trace 可以上传到 CI 的工件存储,开发人员不必先在本地复现问题。
三、它是怎么演进过来的
Playwright 最初由 Microsoft 团队推动,目标是为现代浏览器自动化提供更直接、更可靠的控制能力。它的发展大致可以分为四个阶段:
| 阶段 | 重点变化 | 对截图和录制的影响 |
|---|---|---|
| 早期阶段 | 统一驱动 Chromium、Firefox、WebKit | 从单浏览器脚本走向跨浏览器测试 |
| 测试运行器成熟 | 测试隔离、项目配置、并行、重试和报告 | 可以按测试生命周期自动收集工件 |
| 调试能力增强 | Trace Viewer、DOM 快照、网络和控制台信息 | 从“保存图片”升级为“保存诊断现场” |
| 持续演进阶段 | 更细粒度的 Trace 快照、测试锁、报告字段和新浏览器版本 | 更适合企业级并发、跨项目和复杂 CI 场景 |
官方发布说明显示,Playwright 会持续跟进支持的浏览器版本,并不断扩展 Trace、报告和测试运行器能力。[2] 因此,企业使用时不要只看某一篇旧教程,而应该把当前版本的官方文档和发布说明作为配置依据。
四、环境安装:先跑通第一个截图
4.1 安装 Python 包和浏览器
python -m venv .venv source .venv/bin/activate python -m pip install --upgrade pip pip install playwright pytest playwright install chromium
如果企业 CI 同时验证 Firefox 和 WebKit,可以安装全部浏览器:
playwright install
4.2 第一个可运行截图示例
from pathlib import Path
from playwright.sync_api import sync_playwright
OUTPUT_DIR = Path("artifacts")
OUTPUT_DIR.mkdir(exist_ok=True)
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page(viewport={"width": 1440, "height": 900})
page.goto("https://playwright.dev/", wait_until="networkidle")
page.screenshot(
path=str(OUTPUT_DIR / "playwright-home.png"),
full_page=True,
)
browser.close()
官方截图 API 支持普通截图、全页截图、元素截图、裁剪区域、图片格式和缓冲区输出。[1] 初学者建议先掌握 page.screenshot(),再学习 locator.screenshot() 和视觉断言。
五、截图功能详解:四个最常用场景

5.1 场景一:失败时自动截图
在测试中,截图应当紧贴“可诊断节点”采集。不要在每一行代码后都截图,否则报告会膨胀,真正重要的证据反而难以查找。
from pathlib import Path
from playwright.sync_api import Page
def save_failure_screenshot(page: Page, case_name: str) -> Path:
output = Path("artifacts") / f"{case_name}-failure.png"
output.parent.mkdir(exist_ok=True)
page.screenshot(path=str(output), full_page=True)
return output
真实项目中可以在 pytest fixture、失败钩子或测试框架报告层统一处理。统一处理的好处是命名、目录和保留策略一致。
5.2 场景二:全页截图,用于长页面验收
全页截图适合产品详情页、协议页、运营落地页和后台配置页。它会截取整个可滚动页面,而不是只截取当前视口。[1]
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page(viewport={"width": 1440, "height": 900})
page.goto("https://example.com", wait_until="domcontentloaded")
page.screenshot(path="artifacts/long-page.png", full_page=True)
browser.close()
需要注意,动态页面可能在滚动过程中加载图片或触发懒加载。企业项目应先等待关键内容完成,再截图,不要把“截图完成”误当成“页面业务完成”。
5.3 场景三:元素截图,用于局部证据
当页面很长、但问题只发生在订单卡片或错误提示框时,元素截图比全页截图更便于查看和归档。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com", wait_until="domcontentloaded")
card = page.get_by_role("article").first
card.screenshot(path="artifacts/order-card.png")
browser.close()
元素截图依赖定 位器。定位 器优先选择用户能理解的角色、名称和标签;如果业务组件没有稳定语义,可以让开发补充 data-testid,而不是把深层 CSS 选择器写进几十个测试文件。[3]
5.4 场景四:截图进入内存,用于上传或像素比对
截图不一定要先写文件。可以先得到二进制内容,再交给对象存储、视觉比对服务或报告附件。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com", wait_until="domcontentloaded")
image_bytes = page.screenshot(type="png")
print(f"screenshot bytes: {len(image_bytes)}")
browser.close()
5.5 截图常见错误
| 错误做法 | 为什么有问题 | 更好的做法 |
|---|---|---|
| 每一步都截图 | 工件数量过多,报告难读 | 在关键断言和失败路径截图 |
先 sleep(5) 再截图 | 固定等待不等于业务状态完成 | 使用定位 器和 Web-first assertion |
| 依赖随机文件名 | CI 多并发时难以关联测试 | 使用测试名、浏览器、重试序号命名 |
| 截图包含完整账号和订单信息 | 可能造成敏感数据泄露 | 脱敏、测试账号隔离、限制访问和保留期 |
六、录制功能详解:视频不是 Trace 的替代品

6.1 Python 手动录制
Python Library 模式通过 record_video_dir 开启录制。关键规则是:视频在 BrowserContext 关闭后才会最终保存。[5]
from pathlib import Path
from playwright.sync_api import sync_playwright
video_dir = Path("artifacts/videos")
video_dir.mkdir(parents=True, exist_ok=True)
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context(
viewport={"width": 1280, "height": 720},
record_video_dir=str(video_dir),
record_video_size={"width": 1280, "height": 720},
)
page = context.new_page()
page.goto("https://example.com", wait_until="networkidle")
page.get_by_role("heading").first.wait_for()
video = page.video
context.close()
if video is not None:
print(f"video path: {video.path()}")
browser.close()
注意,page.video.path() 也要在页面或 Context 关闭之后读取。若忘记关闭 Context,CI 进程可能结束了,视频却没有完整落盘。
6.2 视频尺寸与文件大小
官方文档说明,视频默认会按视口缩放到不超过 800×800 的范围。如果需要固定视频尺寸,应同时设置 viewport 和 record_video_size。[5]
企业项目可以采用以下策略:
- 本地调试时按需开启视频,避免磁盘快速增长。
- CI 只在首次重试时录制视频。
- 只保留失败或重试测试的视频。
- 按项目、分支、提交号、浏览器和测试名组织目录。
- 对视频设置对象存储生命周期策略,避免永久保留。
6.3 Playwright Test 中的按需录制
Playwright Test 的视频配置使用 TypeScript。官方支持 off、on、retain-on-failure 和 on-first-retry 等模式。[2]
import { defineConfig } from '@playwright/test';
export default defineConfig({
retries: 1,
use: {
video: 'on-first-retry',
},
});
如果希望失败测试保留视频、成功测试自动清理,可以使用:
import { defineConfig } from '@playwright/test';
export default defineConfig({
use: {
video: 'retain-on-failure',
},
});
6.4 视频适合什么,不适合什么
视频适合复盘交互顺序、观察动画或页面跳转、展示用户操作流程,也适合产品和测试团队快速理解问题。
视频不适合替代网络日志、DOM 快照和接口响应。面对“为什么元素不可点击”“为什么接口返回异常”“为什么定 位器匹配了多个元素”等问题,Trace 通常比视频更高效。
七、Trace Viewer:企业 CI 调试的主力工具

Trace Viewer 可以查看每个动作的时间线、动作前后快照、定位 器、源代码、调用日志、错误、控制台、网络请求、元数据和附件。[4]
7.1 CI 推荐配置
import { defineConfig } from '@playwright/test';
export default defineConfig({
retries: 1,
use: {
screenshot: 'only-on-failure',
video: 'on-first-retry',
trace: 'on-first-retry',
},
});
这套配置的含义是:平时不制造大量工件,失败时至少有截图;第一次重试时记录视频和 Trace;如果第一次执行偶发失败,重试现场会成为诊断证据。
7.2 查看 Trace
npx playwright show-trace test-results/example-test/trace.zip
也可以使用官方 Trace Viewer 网页打开 Trace 文件。官方说明,网页版本在浏览器本地处理 Trace,不会把 Trace 内容上传到外部服务。[4] 企业使用时仍然要遵循公司数据分级和浏览器安全策略,不要把生产真实数据直接放进公共环境。
7.3 为什么不建议默认trace: 'on'
Trace 会记录大量调试信息,官方建议不要在每个测试上默认开启,因为它会带来明显的性能和存储成本。[3] [4] 更合理的策略是:本地排查时临时开启,CI 使用 on-first-retry 或 retain-on-failure。
八、企业项目落地方案:从目录到治理

8.1 推荐目录结构
project/
├── tests/
│ ├── login_test.py
│ ├── payment_test.py
│ └── fixtures.py
├── artifacts/
│ ├── screenshots/
│ ├── videos/
│ └── traces/
├── reports/
├── pytest.ini
└── requirements.txt
实际 CI 中可以把 artifacts/ 映射到流水线工件目录,并为每次运行增加提交号和流水线编号。
8.2 用环境变量控制是否录制
import os
from pathlib import Path
from playwright.sync_api import sync_playwright
record_video = os.getenv("PW_RECORD_VIDEO", "0") == "1"
video_dir = Path(os.getenv("PW_VIDEO_DIR", "artifacts/videos"))
video_dir.mkdir(parents=True, exist_ok=True)
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context_options = {"viewport": {"width": 1280, "height": 720}}
if record_video:
context_options.update({
"record_video_dir": str(video_dir),
"record_video_size": {"width": 1280, "height": 720},
})
context = browser.new_context(**context_options)
page = context.new_page()
page.goto("https://example.com", wait_until="domcontentloaded")
page.screenshot(path="artifacts/screenshots/home.png")
context.close()
browser.close()
本地需要录像时执行:
PW_RECORD_VIDEO=1 pytest -q
普通回归则不打开视频:
pytest -q
8.3 CI 工件命名规范
推荐使用以下字段组成文件名:
{project}-{browser}-{test_name}-{retry}-{status}.{ext}
例如:
web-chromium-payment-refund-0-failed.png web-chromium-payment-refund-1-retry.webm web-chromium-payment-refund-1-retry-trace.zip
命名规范的目的不是“好看”,而是让开发人员可以不打开报告,直接从文件名定位到浏览器、用例、重试次数和状态。
8.4 数据安全和合规边界
截图、视频和 Trace 可能包含用户姓名、手机号、订单号、Token、Cookie、接口响应和内部域名。企业落地至少需要落实以下措施:
| 风险 | 控制措施 |
|---|---|
| 测试账号泄露 | 使用专用测试账号,禁止使用真实用户账号 |
| Token 或 Cookie 泄露 | 脱敏日志,禁止在页面中展示密钥,限制工件访问权限 |
| 个人信息进入截图 | 使用固定虚拟数据,必要时在测试前注入脱敏数据 |
| 工件长期堆积 | 设置保留期、大小上限和自动清理策略 |
| 跨境或外部上传 | 先确认公司数据分级和供应商协议,再决定存储位置 |
九、和 Selenium、Cypress 的对比:不要只看“谁更快”

| 对比维度 | Playwright | Selenium | Cypress |
|---|---|---|---|
| 核心定位 | 现代 Web E2E 与浏览器自动化 | W3C WebDriver 标准生态 | 前端开发者友好的 Web 测试平台 |
| 浏览器覆盖 | Chromium、Firefox、WebKit | 浏览器和语言生态非常广,依赖 WebDriver 实现 | 以现代 Web 测试体验为重点,具体支持以官方文档为准 |
| 截图 | 页面、全页、元素、Buffer、视觉断言 | 支持浏览器截图,API 取决于语言绑定和驱动 | cy.screenshot(),失败时可自动截图 |
| 视频 | 可按测试配置录制,支持失败保留和首次重试录制 | 通常需要额外方案或云厂商能力 | 可按 spec 录制,支持压缩和 Cypress Cloud |
| 调试证据 | Trace Viewer 集成 DOM、网络、控制台和动作时间线 | 生态成熟,但通常需要组合日志、截图、录像和云平台 | 本地体验强,Cypress Cloud 提供 Test Replay 等能力 |
| 多标签页和多上下文 | 原生能力强,适合复杂业务流程 | 标准化程度高,但复杂场景通常需要更多工程封装 | 运行模型与浏览器内执行方式有自己的约束 |
| 语言支持 | JavaScript/TypeScript、Python、Java、.NET | Java、Python、C#、Ruby、JavaScript 等 | 主要面向 JavaScript/TypeScript |
| 迁移成本 | 新项目上手快,旧项目需建立新测试规范 | 既有 Selenium 资产丰富时迁移收益未必立即显现 | 前端团队本地调试体验好,但需接受其运行模型 |
| 更适合 | 新建现代 Web 自动化、跨浏览器、复杂调试 | 大型既有生态、标准化 WebDriver、遗留系统 | 前端团队、快速反馈、需要 Cypress Cloud 的组织 |
Selenium 官方将 WebDriver 定义为通过原生方式驱动浏览器的标准化接口,并强调 W3C WebDriver 和 WebDriver BiDi 的生态价值。[6] Cypress 官方文档则强调手动截图、失败自动截图、按 spec 录制视频以及云端 Test Replay。[7]
**选型建议:**新建现代 Web E2E 项目,优先评估 Playwright;如果企业已经积累大量 Selenium 测试和 WebDriver 基础设施,应先计算迁移成本;如果团队高度偏前端、重视本地交互调试并计划使用 Cypress Cloud,则 Cypress 也有明显吸引力。
十、常用场景清单:什么时候该截图,什么时候该录制
| 场景 | 建议工件 | 原因 |
|---|---|---|
| 登录失败 | 失败截图 + Trace | 既要看错误提示,也要看定位和网络 |
| 支付链路偶发失败 | 失败截图 + 首次重试视频 + Trace | 需要复盘动作顺序和接口状态 |
| 长页面验收 | 全页截图 | 适合产品验收和发布前留档 |
| UI 样式回归 | 视觉截图断言 | 直接比较当前图和基线图 |
| 动画、拖拽、弹窗问题 | 视频 + Trace | 静态截图很难表达过程 |
| 跨浏览器兼容性 | 各浏览器失败截图 + Trace | 对比浏览器差异和 DOM 状态 |
| 下载、上传流程 | 失败截图 + 日志 | 重点是状态和文件事件,不一定需要视频 |
| CI 偶发超时 | 首次重试 Trace | 时间轴和网络面板更适合定位 |
| 产品演示和培训 | 视频 | 视频更适合解释完整操作流程 |
十一、面试官高频问题与标准回答
问题 1:Playwright 的截图和视频有什么区别?
**回答:**截图是某个时间点的静态证据,适合确认页面状态和做视觉比对;视频是测试过程的动态记录,适合复盘交互顺序。两者都不能完全替代 Trace,因为 Trace 还能查看动作、DOM 快照、网络、控制台和源代码位置。
问题 2:为什么视频文件在脚本结束前找不到?
**回答:**Playwright 的视频通常在 Page 或 BrowserContext 关闭后才最终保存。手动创建 Context 时必须显式 context.close(),并在关闭后读取视频路径。[5]
问题 3:企业 CI 是否应该每条用例都录视频?
**回答:**通常不应该。全量录制会增加运行时间、磁盘和上传成本,也会扩大敏感数据暴露面。更合理的是失败保留视频或首次重试录制视频,平时优先保留失败截图和 HTML 报告。
问题 4:为什么官方建议 CI 用 Trace 而不是视频?
**回答:**Trace 不仅有画面,还能按动作查看 DOM 快照、定位 器、网络请求、控制台、错误和源代码位置,因此定位根因的效率更高。[3] [4]
问题 5:sleep()能不能解决截图时机问题?
**回答:**不推荐。固定等待无法保证业务状态完成,时间短了会误判,时间长了会拖慢测试。应使用定位 器的自动等待和 Web-first assertions,例如等待按钮可见、文本出现或请求完成。[3]
问题 6:全页截图为什么可能不稳定?
**回答:**页面可能包含动态时间、随机推荐、动画、懒加载图片、字体加载和滚动触发逻辑。视觉回归前应固定测试数据、关闭动画、等待关键资源,并统一浏览器、视口、时区和字体环境。
问题 7:定位 器和截图有什么关系?
**回答:**元素截图依赖稳定定位 器。定位 器越贴近用户可见语义,测试越不容易因为 DOM 重构而失效。应优先使用 get_by_role、get_by_label、get_by_text 或稳定的测试标识,而不是复杂 CSS 和 XPath。[3]
问题 8:Playwright 和 Selenium 怎么选?
**回答:**新项目要重点评估跨浏览器、并发、Trace 和团队语言栈,Playwright 通常更适合现代 Web E2E。已有大量 Selenium 资产的企业,应先看迁移收益和标准化要求;Selenium 的 WebDriver 标准和生态仍然具有长期价值。[6]
十二、从零到企业可用的落地路线
建议按以下顺序推进,而不是一开始就堆叠全部能力:
- 先完成稳定的定 位器和断言规范。
- 为关键失败路径增加截图。
- 在 CI 中启用失败截图和 HTML 报告。
- 为首次重试启用视频和 Trace。
- 建立工件命名、归档、保留期和权限规范。
- 对高价值页面引入视觉回归,而不是对所有页面盲目截图比对。
- 统计失败类型,持续减少 flaky test,而不是依赖无限重试掩盖问题。
十三、总结
Playwright 的截图和录制功能,真正的价值不在于“生成一张图片或一个视频”,而在于把自动化测试从一句失败日志升级为一套可审计、可复盘、可定位的证据链。
对于个人学习,建议掌握三个最小示例:页面截图、元素截图、Context 视频录制。对于企业项目,建议采用四件套:失败截图、首次重试视频、首次重试 Trace、HTML 报告。对于长期质量建设,还要把定位 器规范、测试数据隔离、工件治理和失败率统计一起纳入工程体系。
如果只记住一个实践原则,请记住:截图负责证明状态,视频负责还原动作,Trace 负责解释原因。
以上就是一文详解Playwright截图和视频录制功能的常用场景与企业项目实战的详细内容,更多关于Playwright截图和视频录制的资料请关注脚本之家其它相关文章!
