Anthropic 官方示例 · webapp-testing
让 AI Agent 用 Playwright 自主验证本地 Web 应用
—— 夜雨飘零
用 AI 编程助手改前端,往往卡在同一个环节:代码改完了,功能到底跑没跑通,Agent 自己说不清。你让它「帮我测一下登录页」,它多半只能读源码、猜 DOM 结构,或者建议你手动打开浏览器点一遍。静态 HTML 还好,一旦遇到 React、Vue 这类需要等 JavaScript 渲染的单页应用,光靠读文件根本没法确认页面真实长什么样。
Anthropic 在官方 skills 仓库里提供了一个叫 webapp-testing 的 Agent Skill,把 Playwright 浏览器自动化和本地服务器生命周期管理封装成一套可复用的工作流。Agent 加载这个 Skill 后,可以写 Python 脚本启动本地 dev server、打开无头 Chromium、截图、抓控制台日志,按「先侦察、再操作」的模式验证 UI 行为。对需要频繁改前端、又希望 Agent 能自主回归测试的开发者来说,这比反复口述「你帮我看看页面」要靠谱得多。
01
PART
这是什么
WHAT · 技能定位
webapp-testing 是 Anthropic 官方 skills 仓库 中的示例 Skill,遵循通用的 SKILL.md 格式,可在 Cursor、Claude Code、Claude.ai 等支持 Agent Skills 的工具中使用。
它的定位很直接:用 Python Playwright 与本地 Web 应用交互和测试,支持功能验证、UI 调试、截图与浏览器日志查看。Skill 包里还附带 scripts/with_server.py 辅助脚本和若干示例,教 Agent 如何管理服务器启停、选择测试策略、避免常见的动态页面陷阱。
02
PART
核心功能与亮点
FEATURES · 能力拆解
先侦察
截图 · DOM · 选择器
再操作
点击 · 填表 · 断言
再验证
日志 · 截图回看
Reconnaissance-Then-Action 核心节奏
决策树:静态页与动态应用分开处理
Skill 内置了一套选择逻辑,Agent 会先判断页面类型再决定测试路径:
静态 HTML
直接读取 HTML 文件找选择器,写 Playwright 脚本访问 file:// 或本地服务。
动态 Web 应用
若服务未启动,用 with_server.py 拉起 dev server;若已在跑,则走「侦察—操作」流程——先导航并等待 networkidle,再截图或检查 DOM,从渲染结果里找选择器,最后执行点击、填表等操作。
服务器生命周期管理
scripts/with_server.py 是 Skill 的核心辅助工具,支持同时管理多个本地服务(比如后端 3000 端口 + 前端 5173 端口),等端口就绪后再跑自动化脚本,结束后自动清理进程。Agent 被明确要求:先跑 --help 看用法,把脚本当黑盒调用,不要先读源码——因为这些脚本可能很大,直接塞进上下文会浪费 token。
侦察—操作(Reconnaissance-Then-Action)模式
对动态单页应用,Skill 强调先看清页面再动手:
page.screenshot(path='/tmp/inspect.png', full_page=True)
content = page.content()
page.locator('button').all()
从截图、DOM 内容和元素列表里发现稳定的选择器(text=、role=、CSS、ID),再写后续交互逻辑。官方特别提醒:动态应用在检查 DOM 之前必须 wait_for_load_state('networkidle'),否则拿到的结构不完整。
示例脚本覆盖常见场景
Skill 的 examples/ 目录提供了三个参考:
element_discovery.py
扫描页面上的按钮、链接、输入框。
static_html_automation.py
用 file:// URL 测试本地静态 HTML。
console_logging.py
监听并保存浏览器控制台输出,便于排查 JS 报错。
最佳实践约束
Skill 对 Agent 的行为做了明确规范:使用 sync_playwright() 写同步脚本;Chromium 始终以 headless 模式启动;操作完成后关闭浏览器;优先用描述性选择器;必要时加 wait_for_selector() 或超时等待。
03
PART
安装与启用
SETUP · 多端接入
🛠 环境要求 · 开工前先对齐
✓ 已安装 Python,并可使用 pip
✓ 本机可执行 pip install playwright 与 playwright install chromium
✓ 使用 Cursor / Claude Code / Claude.ai 等支持 Agent Skills 的宿主
Claude Code
Anthropic 官方 README 提供了插件市场安装方式。在 Claude Code 中注册 marketplace 后,安装 example-skills 插件即可使用仓库中的示例 Skill(含 webapp-testing):
$ /plugin marketplace add anthropics/skills
$ /plugin install example-skills@anthropic-agent-skills
安装后直接在对话里提及即可,例如:「用 webapp-testing 帮我验证本地前端改动」。
Claude.ai 与 Claude API
Claude.ai 付费计划已内置部分示例 Skill;自定义 Skill 可按 Using skills in Claude 上传。API 侧可通过 Skills API 使用预置或自定义 Skill。
Cursor
Cursor 支持通用的 SKILL.md 格式。将 Skill 目录放到项目级 .cursor/skills/ 或全局 ~/.cursor/skills/ 即可被 Agent 自动发现:
$ git clone https://github.com/anthropics/skills.git
$ cp -r skills/skills/webapp-testing .cursor/skills/webapp-testing
也可在 Cursor 的 Customize → Rules → Remote Rule (Github) 中导入 GitHub 仓库。使用前需在本机安装 Playwright Python 包及浏览器:
$ pip install playwright
$ playwright install chromium
Agent 会在对话上下文匹配时自动加载 Skill,也可在聊天中输入 /webapp-testing 或 @webapp-testing 手动唤起。
04
PART
典型用法示例
USAGE · 实战命令
单服务器:启动 dev server 并跑自动化
$ python scripts/with_server.py --server "npm run dev" --port 5173 -- python your_automation.py
多服务器:前后端同时拉起
$ python scripts/with_server.py \
--server "cd backend && python server.py" --port 3000 \
--server "cd frontend && npm run dev" --port 5173 \
-- python your_automation.py
自动化脚本里只写 Playwright 逻辑,服务器由 helper 托管:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto('http://localhost:5173')
page.wait_for_load_state('networkidle')
# 在此编写断言、点击、填表等逻辑
browser.close()
捕获控制台日志
console_logs = []
def handle_console_message(msg):
console_logs.append(f"[{msg.type}] {msg.text}")
page.on("console", handle_console_message)
page.goto(url)
page.wait_for_load_state('networkidle')
05
PART
适用场景与注意事项
NOTES · 谁该用 · 怎么避坑
适合谁用
前后端分离本地开发
需要 Agent 改完代码后自动跑一遍 UI 验证。
单页应用调试
关注渲染时序、选择器稳定性,需要截图和 DOM 侦察。
前端 JS 报错排查
需要把浏览器 console 输出落盘分析。
固化标准操作
希望把「测本地 Web 应用」做成 Agent 可重复执行的标准流程。
需要注意
Skill 要求写 Python Playwright 脚本,不是 Node.js 版 Playwright;运行环境需提前装好依赖。
with_server.py 等 bundled 脚本应作为黑盒调用,先 --help 再执行,避免 Agent 把大段源码读进上下文。
动态页面务必等 networkidle,这是官方标注的 Common Pitfall,跳过这步会导致选择器识别失败。
仓库 README 声明这些 Skill 以演示和教育为目的,生产环境使用前请在自己的项目中充分测试。
该 Skill 面向 本地 Web 应用;远程 staging / 生产环境的 E2E 测试需自行调整 URL 和网络策略。
!踩坑提示 🕳
跳过 networkidle 是最常见失败原因:页面看起来「打开了」,DOM 其实还没渲染完,后续选择器会全部落空。
///
LAST
写在最后
SUMMARY · 小结
webapp-testing 把 Playwright 自动化测试封装成 Agent Skill,解决了「AI 改前端但没法自己验」的痛点。决策树帮你区分静态页和动态应用,with_server.py 管好多服务启停,侦察—操作模式让 Agent 先看渲染结果再写交互。如果你已经在用 Cursor 或 Claude Code,把这个 Skill 放进 .cursor/skills/ 或对应插件里,下次改完 UI 直接让 Agent 跑脚本验证,比手动点浏览器高效得多。
✦ 官方资料
官方地址:webapp-testing 仓库
我是 夜雨飘零,热衷于分享 AI 观察与干货。
如果你觉得今天这篇有收获,欢迎点赞、在看、转发三连,我们下篇见。
既然看到这里了,如果觉得有用,随手点个赞、在看、转发三连吧。
THANKS FOR READING
夜雨聆风