AI + 自动化测试的项目越来越多。

自然语言写 Case、AI 生成 Playwright、AI 操作浏览器……

第一次看的时候都挺惊艳。

但如果真的做过几年 UI 自动化,应该知道一个很现实的问题:

自动化最痛苦的,很多时候不是“写出来”,而是“养下去”。

今天页面还是:

Login

明天产品改版:

Sign in

原来的 Locator 挂了。

今天:

#submit

下个版本前端重构:

[data-testid="login-button"]

又挂了。

于是每天 CI 里面一片红。

你开始排查:

到底是 Bug?

还是环境问题?

还是数据问题?

还是 UI 改了?

还是 Selector 又失效了?

最后发现:

业务一点问题都没有,只是按钮换了个地方。

这也是为什么很多公司自动化刚开始做的时候轰轰烈烈,半年以后就没人愿意维护了。

最近看到一个挺有意思的开源项目:

Passmark。

GitHub:bug0inc/passmark

目前已经有 1K+ Star。

它想解决的问题,刚好就是:

能不能让 AI 不只是帮我们“写自动化”,还帮我们“养自动化”?


一、先看看普通 Playwright 为什么容易变成维护地狱

比如我们要测试一个商城购物流程。

传统 Playwright 可能是:

await page.goto('/products');await page  .getByText('Acme Circles T-Shirt')  .click();await page  .getByLabel('Color')  .selectOption('White');await page  .getByLabel('Size')  .selectOption('S');await page  .getByRole('button', {    name: 'Add to cart'  })  .click();

第一次写的时候其实没什么问题。

真正的问题发生在几个月以后。

前端:

我改了下页面。

测试:

改了什么?

前端:

没什么,就重构了一下。

然后 CI:

FAILEDElement not found

你:

……

于是开始打开页面。

F12。

找元素。

改 Locator。

重新运行。

提交代码。

CI 再跑。

如果只有 10 条自动化还好。

如果是:

500 条1000 条3000 条

这种维护成本就开始变得很难受了。

所以 UI 自动化真正贵的地方,从来不只是:

第一次写脚本。

而是:

后面每一次页面变化,都可能需要有人继续维护。


Passmark 还是建立在 Playwright 上。

但写测试的时候,可以不用先写一堆 Selector。

例如测试一个购物车。

可以直接描述:

打开商城点击 Acme Circles T-Shirt选择 White选择 S加入购物车检查购物车里出现这件商品

Passmark 提供的 runSteps() 会把这些自然语言步骤交给 AI,再通过 Playwright 操作浏览器。

整个流程可以简单理解成:

自然语言测试步骤        ↓       AI        ↓理解页面结构        ↓生成实际操作        ↓    Playwright        ↓     Browser

所以测试人员写的东西开始从:

怎么找到这个按钮?

慢慢变成:

我要测试什么?

比如:

steps: [  { description: "Click Acme Circles T-Shirt" },  { description: "Select color", data: { value: "White" } },  { description: "Select size", data: { value: "S" } },  { description: "Add to cart" }]

代码一下就简单很多。

不过如果 Passmark 只是做到这里,我觉得其实没什么特别值得写的。

现在能做“自然语言 → 浏览器操作”的项目已经不少了。

真正让我觉得有意思的是后面。


这是我看到 AI 自动化时最先想到的问题。

假设:

1000 条自动化

每天跑:

5 次

每一个步骤都:

页面 ↓AI ↓分析 ↓操作

那问题马上来了。

第一:

Token 不要钱吗?

第二:

模型调用不要时间吗?

第三:

模型每次结果一定一样吗?

如果传统 Playwright:

几十毫秒↓找到元素↓点击

现在变成:

获取页面↓调用模型↓等待模型↓模型分析↓返回操作↓Playwright 执行

那自动化可能反而越做越慢。

所以 Passmark 加了一个我觉得非常重要的东西:

Step Cache。


假设第一次执行:

点击 Login

AI 分析页面。

找到正确操作。

Playwright 执行成功。

Passmark 会把成功的 Step 缓存起来。

下一次再跑:

点击 Login

就不需要重新问 AI 了。

而是:

Step ↓检查 Cache ↓找到之前成功的操作 ↓Playwright ↓直接执行

也就是:

第一次自然语言 ↓AI ↓找到操作 ↓Playwright ↓成功 ↓Cache以后自然语言 ↓Cache ↓Playwright

AI 退出。

这点其实非常重要。

因为 AI 自动化如果真的想进入 CI/CD,就不能:

每一个步骤、每一次回归,都让大模型重新思考。

稳定的东西应该尽可能缓存下来。


这就到了 Passmark 最有意思的部分:

Auto-Healing。

比如之前:

Add to cart

这个步骤已经缓存。

每天直接执行。

突然某天前端改版。

原来的操作失效了。

传统自动化:

Cache / Locator     ↓   执行     ↓   FAILED     ↓测试人员收到通知     ↓打开页面     ↓重新找元素     ↓修改代码     ↓重新提交

Passmark 想做的是:

Cache  ↓执行  ↓失败  ↓AI 重新分析当前页面  ↓找到新的操作方式  ↓重新执行  ↓成功  ↓更新 Cache

这就是所谓:

Self-Healing。

说得简单一点:

旧路走不通了,让 AI 自己重新找一条路。


以前大家讨论 AI + 自动化,经常关注:

AI 能不能帮我写代码?

但我越来越觉得:

这可能不是最有价值的问题。

因为一个稍微熟悉 Playwright 的测试工程师,写:

await page.getByRole('button').click();

真的没有多难。

真正让测试人员头疼的是:

半年以后,这几千行代码谁来维护?

如果 AI 能做到:

页面小改版↓原操作失效↓AI 自动重新定位↓验证成功↓缓存新操作↓继续跑

那么它解决的是:

自动化维护成本。

这比“帮我少写几行 Locator”有价值得多。


做测试最终绕不开一个问题:

怎么判断 PASS / FAIL?

传统自动化一般是:

expect(text).toBe("Success");

非常确定。

但如果我们开始用 AI 判断页面:

“这个订单是不是创建成功了?”

问题来了:

AI 会不会看错?

如果只有一个模型:

Claude:PASS

测试就通过?

Passmark 的做法比较有意思。

它可以同时让:

Claude+Gemini

判断。

如果:

Claude:PASSGemini:PASS

那比较简单。

如果:

Claude:PASSGemini:FAIL

怎么办?

再让第三个模型当裁判。

也可以直接配置成:

两个模型意见不一致↓直接 FAIL↓交给人看

这个设计我挺喜欢。

因为 AI 测试真正麻烦的地方并不是:

AI 会不会操作页面。

而是:

AI 判断错了怎么办?

让多个模型互相验证,至少比“一个模型说了算”靠谱一些。


这个功能我觉得挺有意思。

比如点击:

保存

页面弹出:

保存成功

1 秒以后消失。

这种 Toast、Snackbar、临时 Banner,在 UI 自动化里面经常比较烦。

因为你截图的时候:

没了。

你做 AI 页面判断的时候:

也没了。

Passmark 提供了:

Video Assertion。

简单理解就是:

开始执行 ↓录制页面 ↓点击保存 ↓Toast 出现 ↓Toast 消失 ↓执行结束 ↓把整段视频交给模型 ↓判断:“刚才有没有出现保存成功?”

这样 AI 判断的不是:

最后一帧。

而是:

刚才整个过程中发生过什么。

对于:

ToastSnackbarLoading短暂动画一闪而过的错误提示

这种东西确实挺有用。


Passmark 默认还是通过页面的 Accessibility / ARIA 信息理解 Web 页面。

但现在它还支持 Computer Use 模式。

简单理解:

传统方式:

DOM / ARIA ↓AI ↓Playwright

Computer Use:

页面截图 ↓AI 看屏幕 ↓判断按钮在哪里 ↓通过坐标操作

这就意味着以后某些:

Canvas复杂可视化页面拖拽SliderDOM 不友好的页面

也可以尝试让视觉模型处理。

当然,这种方式成本和稳定性目前肯定还是需要实际验证。

但方向已经比较明显了:

规则明确的页面,用结构化信息。

实在不好操作的页面,再让 AI 看屏幕。

没必要什么东西都上最贵的 AI。


我觉得千万不要把它理解成:

Passmark 要替代 Playwright。

恰恰相反。

它底层还是 Playwright。

可以简单理解:

            测试人员                ↓          自然语言 Test                ↓            Passmark                ↓        ┌───────┴────────┐        ↓                ↓      Cache              AI        ↓                ↓        └───────┬────────┘                ↓           Playwright                ↓             Browser

Playwright 负责:

稳定执行浏览器操作。

AI 负责:

那些不稳定、需要理解页面的地方。

Cache 负责:

能不用 AI 的时候就别用 AI。

我觉得这个分工其实挺合理。


这里还是得泼点冷水。

Self-Healing 最大的问题就是:

它修好了,到底是不是好事?

比如以前按钮叫:

Submit Order

后来页面改成:

Cancel Order

如果 AI:

“原来的按钮找不到了。”

然后聪明地找到了另外一个按钮。

点击。

执行成功。

……

这反而可能是事故。

所以 Self-Healing 最重要的问题从来不是:

能不能找到新的元素。

而是:

它找到的新元素,还是不是原来业务上那个东西?

这也是为什么 AI 自动修复不能完全没有边界。

对于:

按钮换位置DOM 重构class 变化Selector 变化

Self-Healing 很适合。

但如果:

业务流程变化交互逻辑变化产品规则变化

最好还是让测试人员确认。

否则:

测试脚本倒是绿了,业务已经测偏了。


而是它给出了一种比较现实的组合:

自然语言+AI+Cache+Self-Healing+Multi-Model Assertion+Playwright

每一个东西负责不同的问题。

AI:

第一次理解页面。

Cache:

别每次都浪费 Token。

Playwright:

稳定执行。

Self-Healing:

页面小变化以后自己恢复。

Multi-Model:

降低 AI 判断错误的风险。

Video:

补充截图看不到的瞬时 UI。

这比一句:

“AI 自动生成 Playwright 脚本。”

完整得多。


我以前一直觉得,AI 对 UI 自动化最大的价值是:

降低写脚本的门槛。

但看完 Passmark 这类项目之后,我现在更关注另外一个问题:

AI 能不能降低维护自动化的成本?

因为写一条自动化,只发生一次。

维护一条自动化,却可能发生:

10 次、20 次、50 次。

如果 AI 只是帮我们:

100 行代码↓变成20 行代码

确实有帮助。

但真正改变测试工作方式的,可能是:

页面改了↓测试挂了↓不用马上找测试人员↓AI 尝试修复↓确认业务语义没变↓继续回归

如果这条路最后真的能跑通,那么未来 UI 自动化的重点可能也会慢慢发生变化。

测试人员不用天天跟 Locator 较劲。

而是把时间放在:

到底测什么。

什么结果才算正确。

哪些场景绝对不能出问题。

AI 自动修复以后,到底有没有把测试修歪。

这可能才是 AI 真正进入自动化测试以后,更值得关注的变化。

下一步我准备实际把 Passmark 跑起来。

不用特别复杂的系统。

就拿一个普通商城,做一个:

登录 → 搜索商品 → 加购物车 → 验证结果

先跑第一次,让 AI 建立 Cache。

然后故意修改页面元素。

再跑第二次。

看看它所谓的 Self-Healing 到底能不能真的把自动化救回来。

如果最后只是 Demo 看着漂亮,那也没什么不好。

至少我们能知道:

AI 自动化到底走到哪一步了。

这里有一点我建议你保留:不要把 Self-Healing 写成“页面怎么变都不用维护”。Passmark 官方实际机制是成功步骤缓存在 Redis 中,后续优先走缓存;缓存步骤失效时才回退到 AI 重新解析并更新缓存。缓存目前也有适用范围,并不是所有复杂多步骤 Flow 都能无条件缓存。

另外它的多模型 Assertion 目前确实是 Claude + Gemini 并行判断,意见不一致时可以调用第三个模型裁决,或者配置为直接失败;Video Assertion 则是录制完整步骤后交给 Gemini 判断瞬时 UI。

Passmark GitHub 项目https://github.com/bug0inc/passmark?utm\_source=chatgpt.com