Playwright 专题
本专题共 60 篇。内容依据 microsoft/playwright 仓库的公开内容整理。凡仓库里没有写明的地方,文中一律照实写 「仓库里没有找到相关说明」,不做推断。
Playwright 定位器入门:七个 getBy 方法该先用哪个
从 Playwright 仓库 docs/src/locators.md 出发,逐个讲清 getByRole、getByLabel、getByPlaceholder、getByText、getByAltText、getByTitle、getByTestId 各自的适用条件与文档给出的取舍原则,每个都附仓库里的原始示例,并交代严格模式、Shadow DOM 例外、filter 相对性这些边界。
上手与日常用法
录制生成代码能省到哪一步、哪些必须自己改;UI Mode 把改一行跑一次的循环缩短;Trace Viewer 怎么看出用例挂在哪一步;Python 绑定和 JS 版不一样的那几处;以及把重复的准备工作抽成自定义 fixture。
用 Playwright codegen 录制生成测试代码:哪些必须自己改
Playwright 的 codegen 能把你在浏览器里的点击录成测试代码,但生成的定位器有一套打分规则,落到 nth 和 CSS 兜底上时必须手改。本文按仓库文档与源码讲清录制命令的常用选项、定位器为什么要改、以及录制登录态的 --save-storage / --load-storage 做法与它的边界。
Playwright UI Mode 怎么用:把改一行跑一次的循环缩短
写端到端用例最耗时间的不是写,是改一行、跑一次、盯终端。这篇按 Playwright 仓库里的文档与源码,讲清 UI Mode 的启动参数(--ui / --ui-host / --ui-port)、watch 模式盯的到底是哪些文件、按 @tag 与 project 过滤怎么落到命令行上、pick locator 的用法,以及源码里几处会咬人的边界。
Playwright Trace Viewer 上手:一个 trace 文件怎么看出用例挂在哪一步
CI 上失败的用例本地复现不了,日志只剩一行超时。这篇按 Playwright 仓库文档梳理 trace 的开启方式与取值语义、打开 trace 的两条路径,以及界面上时间轴、左侧导航与右侧各个标签页分别对应 trace 里的哪部分数据,并交代文档写明的限制与验证方法。
Playwright Python 版入门:和 JS 版不一样的那几处
网上的 Playwright 教程绝大多数是 JS 版的,照着抄到 Python 里会卡在几个地方:装的包不一样、没有 playwright.config、同步和异步是两套 import、异步测试还要另装一个包。这篇按仓库里 Python 专属文档的写法,把安装、fixture、CLI 参数和 Windows 侧的坑一次讲清楚。
自定义 fixture:把 Playwright 用例里的重复准备工作抽出去
用例越写越多,beforeEach 里的登录、建数据、跳页面就越堆越厚,afterEach 还得写一遍对应的清理。Playwright Test 的 test.extend 把这两半合到一个函数里,用 use() 划开 setup 与 teardown。本文按 Playwright 仓库文档与源码,讲清 test.extend 的写法、fixture 函数的参数解析规则、use() 前后各干什么,以及哪些写法会在加载阶段直接报错。
定位与断言
strict mode 报错时怎么收窄、iframe 与 Shadow DOM 里的元素怎么找、ARIA 快照为什么比截图稳。加上两组容易混的概念:Locator 与 ElementHandle 的本质差别、会重试与不会重试的断言分别是哪些。最后两篇是六种定位策略与三类断言体系的选型。
Playwright 报 strict mode violation:定位器怎么收窄
一条 click 忽然报 strict mode violation,说定位器解析到了多个元素。这篇顺着 Playwright 仓库的文档与源码,讲清楚 strict 到底在什么时机判定、报错里的每一行怎么读,以及 filter()、链式、first()/nth()、and()/or() 这几种收窄手段各自改了什么、文档对它们的态度差在哪里,最后给出判定「不是这个原因」的几种情形。
Playwright iframe 里元素定位不到:frameLocator 怎么串
用例在 iframe 上超时,报错却只说找不到元素。这篇按 Playwright 仓库里 FrameLocator 的文档与测试用例,讲清楚 frameLocator 与 frame() 的分工、嵌套 iframe 的链式写法、pierceFrames 的边界,以及哪些报错其实不是 iframe 引起的。
Shadow DOM 里的元素定位:Playwright 哪些选择器能穿透
用了 Web Components 的页面上,同一个元素用 CSS 能定位,换成一条看起来等价的 XPath 就查不到。本文对着 Playwright 仓库的 locators.md、other-locators.md 与 packages/injected/src 下的选择器引擎源码,说清哪些定位方式会穿透 open shadow root、XPath 为什么不行、getByRole 在 shadow 边界上的两种表现,以及怎么判断问题根本不出在这里。
Playwright ARIA 快照怎么读:YAML 结构与截图快照的边界
从一次 toMatchAriaSnapshot 断言出发,沿 Playwright 仓库的文档与源码走一遍:YAML 节点的三段结构从哪来、role 与 accessible name 在 roleUtils 里怎么算、模板一侧的 /children 与 /url 是怎么被解析的,以及它和截图基线在存储与适用范围上的分界。
Playwright web-first 断言的重试:toHaveText 到 Frame.expect
同样是判断元素可见,写成 expect(await locator.isVisible()).toBe(true) 会偶发失败,写成 await expect(locator).toBeVisible() 就不会。本文沿着 Playwright 仓库里的文档与源码走一遍这条路径,说清哪些断言会重试、哪些不会、重试发生在进程的哪一侧、超时到底从哪一层取值,以及 expect.poll 与 expect.toPass 各自补在什么位置。
Playwright Locator vs ElementHandle:查询还是句柄
同一段点击代码,用 page.$ 拿到的句柄会偶发报 Element is not attached to the DOM,换成 getByText 就不会。本文沿着 Playwright 仓库里的文档与客户端、服务端源码走一遍这条路径,说清惰性求值与即时求值差在哪、元素脱离 DOM 时两条路径的处置为什么不同,以及官方把 ElementHandle 标成 discouraged 时给出的原话理由。
Playwright 六种定位策略怎么选:稳定性来自哪里、什么时候会碎
角色、文本、标签、测试 id、CSS、XPath 这六种定位方式,各自的稳定性建立在什么东西不变之上,又在什么改动下会失效。全部依据 Playwright 仓库 docs/src/locators.md 与 docs/src/other-locators.md 写明的机制,给一条从元素性质倒推的决策路径,不排名。
Playwright 的三类断言:会重试的、不重试的、软断言
同样是 expect,写法差一点行为就完全不同:有的会一直重试到超时,有的一次判定就结束,还有的失败了也不中断用例。本文按仓库文档梳理这三类断言的判定方式、软断言的失败累积机制,以及 JavaScript、Python、Java、C# 四种语言绑定在这件事上的写法差异,给出一条从处境倒推的选择路径。
等待、超时与不稳定用例
这一组是新手最常栽的地方。一次 click 到底做了哪五项检查、自动等待覆盖到哪里、为什么大多数 sleep 是多余的;然后是元素点不到、五层 timeout 分不清、用例时好时坏、弹窗把用例卡死这四类具体现象的排查动作。
Playwright 的 click 做哪些检查:actionability 拆开看
Playwright 的 click 在真正按下鼠标之前会跑一串可操作性检查。本文沿着仓库里的文档与源码走一遍这条路径,说清五项检查各自对应什么 DOM 判定、它们的实际执行顺序为什么和文档表格不完全一致、哪些动作会跳过哪几项,以及 force 与 trial 分别关掉了什么。
Playwright 的自动等待到底等什么:为什么大多数 sleep 是多余的
顺着 Playwright 仓库里的文档与服务端源码走一遍一次点击的完整路径,说清自动等待覆盖了哪些动作、哪些状态检查、断言侧的重试怎么工作,以及仓库明确留给显式等待的那几种场景。
Playwright 点不到页面上的元素:actionability 卡在哪一项
Playwright 点击超时时,真正卡住的往往不是定位器,而是可见、稳定、可接收事件、可用、可编辑这五项检查中的某一项。本文按仓库文档与源码,讲清每一项的判定语义、怎么从日志里读出卡在哪一步,以及 force 到底关掉了什么、代价是什么。
Playwright 超时报错分层排查:到底是哪一层的 timeout 触发的
同样是超时,Playwright 里至少有五个不同的 timeout 会把用例打挂,报错文本各不相同。本文按仓库文档给的错误样例和配置项,讲清楚怎么先判定是哪一层触发的,再去改对应的那一个开关,以及哪些现象说明问题根本不在超时配置上。
Playwright 页面跳转后操作报错:导航等待到底等的是什么
Playwright 用例里点完按钮页面跳走了,下一句操作却报 Execution context was destroyed,或者 waitForURL 明明写了却像没等。这篇按仓库文档与源码梳理自动等待到底覆盖了什么、waitForURL 与 waitForLoadState 差在哪、SPA 路由和 BFCache 这两类跳转仓库是怎么定性的,并给出可执行的判定动作与排除条件。
Playwright 用例时好时坏:retries 是止血不是治本,先分清三类
一个用例本地全绿、CI 偶尔红,加一行 retries 就没人再看了。本文按 Playwright 仓库文档梳理 retries 的配置层级与 retryStrategy 的两种取值,讲清 trace 的七种模式里哪些根本不录首跑,以及 test.fixme 与 test.fail 各自适用于哪种失败,最后给出「不是这个原因」的排除条件。
弹出确认框后用例卡死:Playwright 里 dialog 的默认处置是什么
点击按钮触发 confirm 后用例再也不往下走,多半是注册了 dialog 监听却没有在监听里 accept 或 dismiss。本文按仓库文档与源码梳理无监听时的默认处置、监听的注册时机、beforeunload 的特殊之处,并给出判定动作与排除条件。
网络、认证与数据
用 route 拦截请求让测试不依赖后端、登录态怎么存下来复用、复用的登录态为什么会突然失效、拦截配了却不生效(多半是 Service Worker 或时序)、不开浏览器做接口测试、下载的文件怎么拿到。最后一篇对照三层 mock 各自拦在哪。
用 Playwright route 拦截网络请求:测试不依赖后端
后端接口没就绪、返回值天天变、测空列表要造数据,端到端测试就卡在这。Playwright 的 page.route 把请求截在浏览器和网络之间,可以直接造响应、放行、掐断,也可以用 HAR 文件回放。本文按仓库文档梳理匹配规则、三种处置方式和 HAR 的录制回放,并交代文档写明的边界。
每个用例都重新登录太慢:用 Playwright storageState 存下登录态复用
从 Playwright 仓库 docs/src/auth.md 与 docs/src/api/class-browsercontext.md 出发,讲清 storageState 的存与读、setup 项目与 globalSetup 两种挂载方式的差别、多角色场景怎么分文件,以及文档里明说不支持的那几处边界。
Playwright 登录态突然失效:storageState 过期与作用域排查
跑了几周好好的 storageState 突然全线未登录,多半不是 Playwright 坏了,而是 token 过期、cookie 的 domain/path 对不上、或者几个 project 共用了同一份状态文件。本文按仓库文档与 API 签名,给出逐条可执行的判定动作与处置边界。
Playwright route 不生效:Service Worker 或时序绕过
写好的 page.route 一行都没被调用,页面照样打到真接口。这篇按 Playwright 仓库文档里写明的语义,拆开三个最常见的原因:Service Worker 接管了请求、拦截注册的时机与层级不对、匹配与优先级被后注册的 handler 吃掉,并给出可执行的判定动作与反向排除条件。
用 Playwright 做接口测试:不开浏览器也能跑
同一套 Playwright 工程里,request fixture、playwright.request.newContext() 和 page.request 是三个不同的东西,cookie 归属和生命周期都不一样。本文按仓库文档与源码梳理它们的分工,重点讲鉴权头到底该放在哪一层、beforeAll 里拿到的 request 为什么不能带进 test,以及配置项是通过哪段代码补进请求上下文的。
触发下载后拿不到文件:Playwright 的 download 事件与保存路径
点击了下载按钮,脚本却拿不到文件,或者拿到路径后文件又消失了。本文按 Playwright 仓库里 docs/src/downloads.md 与 docs/src/api/class-download.md 写明的语义,梳理 download 事件的触发时机、四种语言绑定各自的等待写法、saveAs 与临时文件的关系,以及 context 关闭后文件的去向,并给出可执行的判定动作与排除条件。
Playwright 三层 mock 怎么选:路由拦截、HAR 回放、API 打桩
Playwright 仓库里讲 mock 的文档其实有三份,分别拦在三个不同的位置。这篇按「你手里是什么处境」倒推该用哪一层,写清每层能覆盖什么、覆盖不到什么,以及三种维护成本各自从哪里来。
配置、并行与 CI
用例跑得慢和 CI 上挂本机过,是两类最花时间的问题。这一组覆盖 projects 多环境配置、同一选项在四个地方都能设时的优先级、分片怎么切、并行冲突怎么划范围、worker 进程模型、接进 CI 与 Docker、webServer 没等到就开跑,以及报告器怎么配。
用 Playwright 的 projects 配置多浏览器多环境:一份配置跑出多套组合
同一批用例要在 chromium/firefox/webkit 上跑、又要分别打到 staging 和 production,很多团队的做法是复制好几份配置文件。Playwright 的 projects 数组把这件事收进一个配置里,本文按仓库文档梳理 projects 的字段语义、dependencies 串联顺序,以及怎么按项目过滤运行。
Playwright 的配置优先级链:同一个选项在四个地方都能设
同一个 locale 可以写在全局 use、项目 use、文件或 describe 里的 test.use,还能被命令行参数顶掉,最后到底谁生效?本文顺着 Playwright 仓库里配置合并与 fixture 池的那几行代码走一遍,标出决定顺序的函数名与文件位置,并说明命令行到底能改哪几个键、describe 级为什么改不动某些选项。
用例太多跑太久:Playwright 的 sharding 分片并行怎么切
一条 CI 流水线跑几十分钟的端到端用例,靠单机加 worker 已经压不下去了。这篇沿着 Playwright 仓库里的 sharding 文档与 runner 源码,讲清 --shard=x/y 的参数语义、fullyParallel 对切分粒度的影响、blob 报告器为什么是分片的必需品,以及 merge-reports 合并时最容易踩的跨系统 rootDir 报错。
并行跑就互相干扰:Playwright 哪些用例必须串行、怎么划范围
本地一个个跑全绿,一到 CI 并行就随机红几个。这篇按排查顺序走一遍:怎么先确认问题确实出在并发上,Playwright 的 worker 隔离到底隔了什么、没隔什么,test.describe.configure 的作用域怎么算,什么时候该用 lock 而不是 serial,以及哪些现象说明根本不是并发的锅。
Playwright 的 worker 进程模型:一个 worker 里跑几个用例
从「我配了 workers 为什么进程数对不上」这个问题出发,沿着 Playwright 仓库里 createTestGroups、workerHash 与 dispatcher 的调度代码走一遍,说清 worker 什么时候被复用、什么时候被推倒重建、失败之后新 worker 怎么接着跑,以及 workers 这个配置项到底在配什么。
把 Playwright 接进 CI:从跑得起来到出报告
本地测试全绿、推到 GitHub Actions 就红一片,多半是浏览器和系统依赖没装对,或者失败现场没被上传出来。这篇按 Playwright 仓库 docs/src/ci.md 与 ci-intro.md 写明的三步走一遍:装依赖、装浏览器、跑测试,再把 HTML 报告和 trace 用 upload-artifact 带出来,并说清 Windows 侧与 Linux 侧的差别。
在 Docker 里跑 Playwright:官方镜像与自建镜像的取舍
本机跑得好好的用例,进了容器就报浏览器起不来。这篇按 Playwright 仓库里的 docker.md、browsers.md 与 utils/docker/Dockerfile.noble,讲清官方镜像里到底预装了什么、自建镜像需要补哪些系统依赖,以及容器里跑 headed 为什么要 Xvfb。
本机全过 CI 全挂:把 Playwright 的环境差异按五层拆开逐层对
本机跑绿、推上 CI 全红,是 Playwright 用户最常撞的一类问题。这篇把本机与 CI 的差异拆成浏览器版本、系统依赖与字体、并发度、视口、网络五层,每层给出仓库文档里写明的判定动作与处置方式,并说明哪些现象说明问题不在环境层。
Playwright webServer 没等服务就开跑:url、port、wait
Playwright 的 webServer 把 dev server 拉起来之后,到底凭什么判断「可以开跑了」?本文沿着仓库里 webServerPlugin.ts 的代码路径,把 url 的 HTTP 探活、port 的 TCP 探活、wait 的日志匹配三种语义拆开,给出用 DEBUG=pw:webserver 判定的可执行动作、对应的处置写法,以及哪些报错说明根本不是这个原因。
Playwright 报告器配置:内置几种怎么选、怎么同时输出多份
从仓库文档出发,讲清 Playwright Test 内置报告器各自产出什么形态的东西、怎么用数组式配置同时输出终端可读与机器可读的两份结果,以及自定义 reporter 需要实现哪些钩子方法、这些钩子按什么顺序被调用、有哪些文档写明的边界。
快照、截图与环境模拟
视觉回归的基线怎么生成与更新、换台机器就挂的跨平台渲染差异怎么处理、设备与语言时区权限能改哪些、用 Clock API 把时间捏在手里测倒计时。组件测试单列一篇(注意仓库对它的 experimental 标注)。
视觉回归怎么做:Playwright toHaveScreenshot 的基线与阈值
从首次运行生成基线、用 --update-snapshots 的四种模式更新基线,到 threshold/maxDiffPixels 两级阈值怎么配、动态区域用 mask 与 stylePath 怎么挡,全部依据 Playwright 仓库里的文档与源码,并说明这套能力的适用边界。
视觉快照换台机器就挂:Playwright 跨平台渲染差异怎么处理
本地跑绿的视觉快照一进 CI 就红,多半不是页面变了,而是快照文件名里的平台后缀对不上。本文按仓库文档与源码,讲清快照路径怎么拼出来、阈值选项各自管什么、以及把基线生成固定到容器里的做法,并给出「什么情况说明不是这个原因」的排除条件。
模拟设备、语言、时区、权限:Playwright 的 emulation 能改哪些环境变量
Playwright 的 emulation 把设备参数、语言、时区、地理位置和浏览器权限都做成了 context 级选项,但这几组选项的作用范围并不一样:有的只能在建 context 时定死,有的运行中还能改,有的只能整个 context 一起改。本文按仓库文档与源码,逐组说清它们改的是什么、边界在哪、怎么验证真的生效了。
Playwright Clock API 把时间捏在手里:setFixedTime 与 runFor
倒计时、无操作自动登出、每秒刷新的时钟组件,用真实等待去测既慢又不稳。Playwright 的 Clock 提供了四个语义完全不同的入口,本文按仓库文档与源码把它们的差别、适用场景、调用顺序限制与报错条件讲清楚,并说明为什么固定了时间断言字符串仍可能对不上。
Playwright 组件测试:在真实浏览器里挂载单个组件
想只测一个按钮组件,却得先启动整个应用、一层层点进去。Playwright 的 mount fixture 把组件测试做成了普通的端到端测试:你自己的 dev server 提供一张 gallery 页,测试导航过去挂载一个 story。本文按仓库文档梳理初始化命令、mount() 用法,以及与端到端共用一份配置时哪些开关不能放在顶层。
机制解读
不是教你怎么用,是讲清楚它为什么这样运转:BrowserContext 的隔离边界到底划在哪、fixture 的 test 级与 worker 级差在哪、一个 trace 文件里存了什么、TestInfo 能拿到什么、文档没封装的能力怎么从 CDPSession 拿(仅限 Chromium)。
Playwright BrowserContext 隔离边界:什么共享什么不共享
从「新建一个 context 之后到底什么被清空了」这个问题出发,沿 Playwright 仓库里 BrowserContext 的 API 文档走一遍:cookie、localStorage、IndexedDB、权限授予、HTTP 缓存各自挂在哪一层,哪些能在 page 级覆盖,哪些根本不归 context 管,以及多开 context 与多开 browser 的成本差在哪里。
Playwright fixture 的生命周期:test 级和 worker 级到底差在哪
从一个具体问题出发——自己写的 fixture 到底跑几次、重试之后会不会重跑。沿着 Playwright 仓库里的文档与 fixture 注册源码走一遍 scope 的两个取值、初始化时机、依赖方向、worker 复用的判定,以及 worker 级 fixture 在测试失败重试时的行为。
一个 Playwright trace 文件里到底存了什么
把 Playwright 的 trace.zip 拆开,沿着仓库源码走一遍:zip 里有哪些条目、每一类条目由哪个开关决定、快照与网络与控制台与源码与附件分别落在哪个目录、以及为什么脚本响应体默认不进档案。全部依据仓库内的文档与源码,讲清开关与体积的对应关系。
Playwright TestInfo 里能拿到什么:把用例上下文用起来
用例在 CI 上挂了,报告里只有一行报错,想把当时的日志和接口返回塞进去。本文沿着 Playwright 仓库的 class-testinfo.md 与 worker/testInfo.ts 走一遍:TestInfo 上有哪些字段、attach 到底做了什么、在 fixture 里什么时候读才读得到。
Playwright 没封装的能力:用 CDPSession 直接发 CDP 命令
Playwright 的高层 API 覆盖不到的浏览器能力,可以通过 CDPSession 直接发原始 Chrome DevTools Protocol 命令。这篇沿着仓库文档与源码走一遍:会话从哪两个入口建立、为什么只有 Chromium 能用、四种语言绑定订阅事件的写法差在哪,以及它和 page、context 混用时在域状态、生命周期和超时上的几处坑。
环境与工程问题
浏览器下载失败时离线与代理环境怎么装、扩展 fixture 之后 TypeScript 类型对不上、跑完还剩一堆浏览器进程该由谁负责关。
playwright install 下载浏览器失败:Playwright 在离线与代理环境怎么装
公司网络或离线机器上跑 playwright install 卡住、报证书错误、超时时,怎么用 --dry-run 先确认它到底要去哪儿下、下到哪儿,再用下载镜像与代理变量改掉来源,或者干脆指向一份已有的浏览器。所有依据来自 Playwright 仓库的文档与源码。
Playwright 的 TypeScript 类型报错:fixture 扩展后类型对不上
自定义 fixture 之后,编辑器提示参数上没有这个属性、worker fixture 赋值类型不匹配、配置文件里的自定义 option 不认——这几类报错的根源都在 test.extend 的两个泛型参数和 tsconfig 的支持范围上。本文按仓库里的类型定义与文档,给出判定动作、处置写法和排除条件。
跑完还剩一堆浏览器进程:Playwright 资源没释放的几处常见原因
脚本跑完了,任务管理器里还挂着一排浏览器进程。本文按 Playwright 仓库文档里写明的关闭语义,把 Test Runner、library、launchPersistentContext、connect 四种用法下 context 与 browser 的关闭责任归属讲清楚,并给出可执行的判定与验证动作。
迁移与选型
从 Puppeteer、Selenium、Protractor、Testing Library 过来分别要改什么。★这四篇的对照方不在我们的事实源内,只引用 Playwright 仓库里对它们的描述,不替对方补事实、不比优劣。后面是同项目内的形态选择:Test Runner 与 Library、四种语言绑定的能力差异、四种调试手段、各语言的测试运行器、headless 与 headed 的差异来源。
从 Puppeteer 迁到 Playwright:API 对不上的地方在哪
手上一套 Puppeteer 脚本要迁到 Playwright,真正卡人的不是语法,而是三件事:迁到 Library 还是 Test Runner、哪些 API 换了所属对象、以及运行器带来的并行与重试从哪来。本文只依据 Playwright 仓库里写明的迁移对应关系来讲。
Playwright 和 Selenium 怎么选:先看你要不要 Grid
团队已有一套 Selenium Grid,要不要接、能不能接?本文只依据 Playwright 仓库里写明的内容,拆开 `docs/src/selenium-grid.md` 与 `launchWithSeleniumHub` 的实际链路,讲清这条通路的浏览器边界、Selenium 4 与 3 的分叉、以及不接 Grid 时仓库自己给的替代路线。
Protractor 项目迁移到 Playwright:官方迁移页写了哪些对应关系
手上还有一套 Protractor 用例要搬家时,最想知道的是哪些写法能机械替换、哪些必须重写。本文只依据 Playwright 仓库 docs/src/protractor-js.md 这一页,把它给出的 API 对应表、逐行改写示例、以及 waitForAngular 的两种 polyfill 讲清楚,并指出照表替换之后会在哪里卡住。
Playwright 和 Testing Library 的定位器哲学差在哪
手里有一套 Testing Library 写的测试,要评估迁到 Playwright 的代价。迁移页给的那张方法对应表看着像逐行改名,真正决定工作量的却是另外三处:查询前缀被塌缩成一族 getBy*、断言从同步变成必须 await 的自动重试、以及 render 被拆成 story 与 mount。本文只对照仓库里白纸黑字写明的机制,逐条指出差异什么时候会咬到你。
Playwright Test 和 Playwright Library:两种用法什么时候选哪个
同一个 Playwright 有两种装法两种写法:装 @playwright/test 用 Test Runner,还是装 playwright 当库直接调。本文照仓库对照表逐条过一遍初始化、清理、断言、超时、并行、报告、重试与 trace 各自归在哪一侧,以及选库这一侧时你要自己接管什么,最后给一条从处境倒推的选型路径。
Playwright 四种语言绑定的能力差异:不是每个特性都有
团队语言已经定了,剩下的问题是「Playwright 的哪些功能我拿不到」。本文按仓库文档里的语言标记,把测试运行器、组件测试、UI Mode、trace 录制方式、断言与 API 类的语言归属逐条对上,给出一条从处境倒推到结论的判断路径。
Playwright 四种调试手段怎么选:Inspector、UI Mode、Trace、日志
Playwright 仓库里同时提供了 Inspector、UI Mode、Trace Viewer 和 DEBUG 日志四条调试路径,它们能看到的东西、是事中还是事后、能不能在 CI 上用都不一样。本文只依据仓库文档写明的机制,给一条从处境倒推到手段的选择路径。
Playwright 各语言的运行器对照:JS 用自带,其它接谁
Playwright 的四个语言绑定共用同一套浏览器 API,但测试怎么组织、并行从哪来、fixture 对应成什么,四条路完全不同。本文只对照仓库文档白纸黑字写明的机制:JS 用自带的 Playwright Test,Python 挂在 pytest 上,Java 接 JUnit 或 TestNG,.NET 走 MSTest/NUnit/xUnit 的基类,并给出一条从团队处境倒推到选型的决策路径。
headless 和 headed 结果不一样:Playwright 差异在哪几处
同一份 Playwright 用例,加了 --headed 就过、不加就挂,或者反过来。本文按仓库文档与源码逐处对照两种形态真正不同的地方:可执行文件、启动参数、视口与设备像素比、字体与渲染依赖,并给出「什么时候必须用 headed」的判断路径。
想让 AI 帮你写测试,而不是写一堆跑不稳的用例?
从 AI 编程实践到 Agent 工程落地,站内有成体系的教程与学习路线。