本期是本栏目第二轮单件深拆,对象是 Anthropic 官方 example-skills 插件里的 webapp-testing——专门让 Claude Code 替你测试本地 Web 应用的技能。本文材料取自本机安装的 anthropic-agent-skills 插件缓存中该技能的 SKILL.md 正文原文,逐段引用、逐段讲解。核心发现:这个技能真正值钱的不是“会写 Playwright 代码”,而是三条上下文工程纪律——脚本当黑盒不读源码、先侦察后动手、等 networkidle 再碰 DOM。它把 LLM 测网页时最常见的三种翻车方式,提前写死在了文档里。
webapp-testing 是 Anthropic 官方技能仓库 anthropics/skills 中 example-skills 目录下的一个技能,定位只有一句话:测试本地 Web 应用时,写原生 Python Playwright 脚本。
整个技能的文件结构非常克制:
webapp-testing/
├── SKILL.md # 主文档,约百行
├── scripts/
│ └── with_server.py # 服务生命周期管理器(支持多服务器)
└── examples/
├── element_discovery.py # 发现页面上的按钮、链接、输入框
├── static_html_automation.py # 用 file:// URL 测本地静态 HTML
└── console_logging.py # 自动化过程中捕获控制台日志
没有 requirements.txt,没有测试框架封装,没有断言库。SKILL.md 开头就把家底盘出来:
Helper Scripts Available:
scripts/with_server.py- Manages server lifecycle (supports multiple servers)
一个脚本,三个示例,一页正文。对比市面上动辄塞进十几万 token 的“全能测试框架”型技能,这个官方件的第一个设计决策就是做减法。
安装方式两种,命令如下:
# 方式一:Claude Code 内走官方插件市场
/plugin marketplace add anthropics/skills
/plugin install example-skills@anthropic-agent-skills
# 方式二:手动安装
git clone https://github.com/anthropics/skills
cp -r skills/example-skills/webapp-testing ~/.claude/skills/
# 前置依赖(Playwright 环境需自备)
pip install playwright
playwright install chromium
具体安装入口以仓库 README 为准。装完之后,当你对 Claude Code 说“帮我测一下这个页面能不能正常提交表单”这类任务时,技能就会被触发。
正文第一段全部内容就是开头那句"To test local web applications, write native Python Playwright scripts."。没有背景介绍,没有技术选型论述。这是官方件的标准开头写法——第一段只回答“这个技能存在是为了干什么”,把上下文窗口留给后面真正可执行的指令。本栏目此前拆官方 pdf、docx 件时提过“三层渐进披露”,这个件把第一层压到了极限:一句话。
紧跟工具清单,出现了整份文档里语气最重的一条规则:
Always run scripts with
--helpfirst to see usage. DO NOT read the source until you try running the script first and find that a customized solution is abslutely necessary. These scripts can be very large and thus pollute your context window. They exist to be called directly as black-box scripts rather than ingested into your context window.
三个层次:先跑 --help;实在不行才读源码;理由是"脚本很大,会污染你的上下文窗口,它们生来就是被直接调用的黑盒,不是被吞进上下文里的”。
这段话值得每个 Skill 作者抄一遍。多数自制技能的通病是让模型把整个仓库读一遍再干活,结果一次任务烧掉几万 token 在读代码上。官方在这里明确把“读源码”定义为最后手段,并且给出了为什么——这是很少见的天真话术,直接把成本模型讲给模型听。顺带一提,原文里 "abslutely" 是个拼写错误,这种未经润色的痕迹反而说明这是工程师手写的操作纪律,不是营销文案。
User task → Is it static HTML?
├─ Yes → Read HTML file directly to identify selectors
│ ├─ Success → Write Playwright script using selectors
│ └─ Fails/Incomplete → Treat as dynamic (below)
│
└─ No (dynamic webapp) → Is the server already running?
├─ No → Run: python scripts/with_server.py --help
│ Then use the helper + write simplified Playwright script
│
└─ Yes → Reconnaissance-then-action: ...
SKILL.md 用 ASCII 字符画了一棵决策树,第一刀切“静态还是动态”,第二刀切“服务器起了没有”。两个问题的答案组合出三条路径:静态 HTML 直接读文件找选择器;动态且服务没起就走 with_server.py 托管;动态且服务已起就走“侦察后动手”。
这是把“模型自由发挥空间”收敛成“查表执行”的典型手法。LLM 测网页时最大的不确定性不是代码写不写得出来,而是面对任务时先做什么。决策树把这个顺序写死了。
动态应用测试的老大难是服务生命周期:起服务、等端口就绪、跑测试、杀进程。这个技能用一个辅助脚本统一解决:
# 单服务
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 逻辑,服务器由辅助脚本自动管理。职责分离之后,模型每次生成的自动化脚本都短一截,出错面也随之缩小。
示例代码里还有两行行内注释,是全文的第二处重语气:
browser = p.chromium.launch(headless=True) # Always launch chromium in headless mode
page.goto('http://localhost:5173')
page.wait_for_load_state('networkidle') # CRITICAL: Wait for JS to execute
"Always"和"CRITICAL"没有写在散文里,而是写成了代码注释。这是很聪明的双重编码:模型抄这段代码模板时,规则跟着代码一起被抄走;就算模型跳过散文直接看代码,约束也还在。
Reconnaissance-Then-Action Pattern: 1. Inspect rendered DOM → 2. Identify selectors from inspection results → 3. Execute actions using discovered selectors
顺序是死的:先看渲染后的真实 DOM(截图 + 抓 content + page.locator('button').all()),从侦察结果里挑选择器,最后才执行动作。禁止凭猜测写选择器一步到位。
这一条直击 LLM 自动化测试的最大翻车点:模型很爱“想象”页面结构,直接写出 page.click('#submit-btn') 这种看起来合理但页面上根本不存在的选择器,然后陷入“猜选择器—报错—再猜”的死循环。先侦察后动手,等于强制模型用真实页面状态替换想象。
❌ Don't inspect the DOM before waiting for
networkidleon dynamic apps ✅ Do wait forpage.wait_for_load_state('networkidle')before inspection
单端动态应用(SPA)的页面在 JS 跑完前是一具空壳,过早抓 DOM 只会得到空列表。技能把这个坑提炼成一对正反例,两行解决。反例对照(❌/✅)是提示词工程里性价比极高的格式:模型对“不要做什么”比对“要做什么”更敏感,成对给出则两头都堵住了。
Best Practices 五条:脚本当黑盒、用 sync_playwright() 同步接口、用完关浏览器、选择器优先 text=/role=/CSS/ID、按需加 wait_for_selector()。最后 Reference Files 把三个示例文件的用途一句话讲清,形成正文之外的第二层参考。整个文档首尾呼应:开头说脚本有哪两个,结尾说示例有哪三个,中间没有任何冗余。
flowchart TD
U["用户下达测试任务"] --> M["模型读 SKILL.md"]
M --> H["先跑 --help 探测脚本用法"]
H --> W["with_server.py 托管服务"]
M --> P["模型只写 Playwright 逻辑"]
W --> R["服务就绪后自动运行脚本"]
P --> R
R --> O["页面结果回传给模型"]
O --> J{"测试通过吗"}
J -->|通过| K["汇报测试结论"]
J -->|失败| M
而整个技能对上下文的分层管理,是它区别于民间件的核心结构:
flowchart TD
A["第一层 SKILL.md 正文"] --> B["第二层 examples 三个示例"]
B --> C["第三层 with_server.py 源码"]
C --> D["禁区 默认不读"]
A --> E["模型常驻上下文 约百行"]
B --> F["按需查阅某个文件"]
C --> G["仅定制时才读"]
三层各管一摊:正文常驻、示例按需、源码禁区。这就是本栏目拆官方 pdf 件时说过的“渐进披露”,在测试场景下的具体落地。
| 维度 | 权重 | 评分 | 简评 |
|---|---|---|---|
| 功能完整度 | 25% | ★★★★☆ | 静态/动态/多服务全覆盖,但只管行为不管像素,无性能与移动端 |
| 设计质量 | 25% | ★★★★★ | 决策树、黑盒纪律、注释军规、反例对照,教科书级上下文工程 |
| 实战效果 | 20% | ★★★★☆ | 侦察再动手直击 LLM 测网页最大翻车点;效果依赖本机 Playwright 环境装好 |
| 上手难度 | 15% | ★★★★☆ | 概念零门槛,但需自备 Python + Playwright + Chromium 环境 |
| 社区活跃度 | 15% | ★★★★☆ | 官方 example-skills 插件渠道分发,随官方仓库更新,属长期维护件 |
横向参照同门:docx/pdf 件的强项是文档格式的边界处理,pptx 系的强项是模板化产出,而 webapp-testing 的强项是把失败模式前置写死——五件官方件里,它的正文最短,但每句话的“防翻车密度”最高。
适合交给它:本地开发中的功能回归(表单提交、登录流程、增删改查走通)、前后端双服务联调冒烟、改完前端之后“页面还能不能用”的快速验证、CI 前的本地预演。
不要指望它:像素级视觉还原走查(它只管行为不管审美)、线上生产环境监控(定位是 local web applications)、性能压测(Playwright 不是压测工具)、移动端真机测试。另外它假设你本地能装 Playwright,环境装不好,技能写得再好也白搭。
--help,正文明写“先跑 help、禁读源码”,并讲出理由(上下文污染)。一次任务省下的 token 是真实的钱。把 webapp-testing 拆成五个设计件,按“抄走后对自己技能的提升幅度”排名:
| 排名 | 设计件 | 为什么值钱 |
|---|---|---|
| 1 | 黑盒脚本纪律 | 所有带脚本的技能都适用,直接省上下文成本 |
| 2 | 侦察再动手 | 任何“先看再改”类任务(测网页、改代码、爬数据)通用 |
| 3 | 决策树前置 | 任务有分叉就能用,把自由度换成确定性 |
| 4 | 注释即军规 | 有示例代码的技能都该抄 |
| 5 | ❌✅对照 | 短小,适合所有已知高频翻车点 |
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
