SKILL 11 / MCP · DEEP DIVE

浏览器自动化 MCP:让模型读结构,别让它猜像素

Playwright MCP 拆解 · accessibility tree vs 截图 · 测试与抓取的分界

2026-09-12 · BigCat

同一句「点那个登录按钮」,截图路线要模型从一张图里算出它在 (412, 318);快照路线只要它说出 ref=e47。一个在赌,一个在指。

相关 → Skill 10 文档检索类 MCP(上期是只读的一类,本期这一类能点、能填、能提交)

// WHY THIS MATTERS

文档检索类 MCP 只往上下文里搬文本;浏览器自动化类给出去的是一双能点、能填、能提交的手。这是所有 MCP 类别里权限跨度最大的一类,也是最容易看着很酷、装完没用上的一类。

主角是 Playwright MCP(据 GitHub 仓库页 2026-09 约 3.7 万 star,Apache-2.0)。但真正值得你花三分钟搞懂的不是它的装法,而是它和一切「截图 + 坐标」方案的分野:它交给模型的是无障碍树,不是像素。下面九个条目都能今天装上,最后一节回答那个最该问的问题——什么时候这些一个都别装。

// 01

它替你干掉什么:干掉「我自己开个浏览器点一遍」那一圈

论断:它替掉的不是测试框架,是你改完前端后切到浏览器、刷新、点三下、把 console 报错复制回来的那一圈往返。真正的收益是模型第一次有了客观 oracle——它能自己看见自己改坏了没有。

第一条立刻能跑的用法

# ① 装(官方 README 给的就是这条)
claude mcp add playwright npx @playwright/mcp@latest

# ② 更克制的装法:profile 只留在内存里,不落盘,指定浏览器
npx @playwright/mcp@latest --isolated --browser chrome

# ③ 第一句话这么说(先起好本地服务,再让它自己看):
打开 http://localhost:5173,先 browser_snapshot 看一眼页面结构,
点「登录」,填 demo / demo,提交后把 console 里的报错原样贴给我。

注意这句话里没有「截个图给我看」。官方给 browser_snapshot 写的工具描述是一句大白话:「Capture accessibility snapshot of the current page, this is better than screenshot」;而 browser_take_screenshot 的描述直接堵死了另一条路:「You can't perform actions based on the screenshot, use browser_snapshot for actions」。截图在这套设计里只负责给人看,不负责给模型指路。

失败模式:装完直接说「测一下我的站」。服务没起、URL 没给,模型会自己 navigate 到一个它「记得」的地址,然后认真地汇报一个不存在页面的结论。先起服务、先给 URL——这也是官方 webapp-testing skill 里 with_server.py 存在的全部理由。
一手源 · microsoft/playwright-mcp README(命令、工具描述、flag 均抄自此处)
// 02

机制:它凭什么有效——因为它把「这个按钮」变成了一个可引用的名字

论断:两条路线的差别不在精度,在失败方式。坐标点错了你不知道,模型会继续往下走;ref 找不到会当场报错。前者悄悄产出假结论,后者停下来。
两条路线 ──────────────────────────────────────────────────────────── 截图路线 screenshot ──► 模型看图 ──► 猜坐标 (412,318) ──► click_at 需要 vision 模型 · 换分辨率/滚动一下全废 · 错了不报错 快照路线 accessibility tree ──► role + name + ref=e47 ──► click(ref) 纯文本 · 模型能引用 · ref 失效立即抛错 ──────────────────────────────────────────────────────────── 官方 Key Features 的三句原话: Fast and lightweight. Uses Playwright's accessibility tree, not pixel-based input. LLM-friendly. No vision models needed, operates purely on structured data. Deterministic tool application. Avoids ambiguity common with screenshot-based approaches. ────────────────────────────────────────────────────────────

为什么它顺带还更省

无障碍树是文本,模型能在后续每一步里直接引用其中的节点;截图是图片,既要 vision 能力,又无法被 grep、无法被下一句话指名。省 token 只是结果,可引用才是原因。

但快照不是万能的

canvas、WebGL、纯图形的画布、以及「这两个元素有没有对齐」这类视觉回归问题,无障碍树里根本没有对应节点。这就是 --caps=vision(坐标交互)和截图工具至今还在的原因——它们是补集,不是备份。chrome-devtools-mcp 同时提供 take_snapshot 与 take_screenshot,也是同一个分工。

失败模式:让模型「看截图判断样式对不对」。它能告诉你「看起来挺整齐」,但那句话没有任何约束力。样式回归要么上真正的视觉对比工具,要么写断言,别指望一句自然语言描述。
// 03

真实用法与边界:九个条目,分三层装

论断:这一类最常见的错误不是选错工具,是把测试和抓取混着装——于是「打开一个页面」有四个工具抢答,你永远不知道这次跑的是哪条链路。

第一层 · 本地驱动(先把这层装对)

第二层 · 同样的能力,但不接 server

第三层 · 远程浏览器与抓取(边界在这一层)

测试与抓取的分界线

你的应用、你有源码、需要断言 → 第一层或第二层,产出应该是一个能重跑的 .spec.ts。别人的站、只要数据、没有断言 → 第三层,产出是数据。判断标准很简单:这次跑完,有没有东西值得留下来明天再跑一次?有就是测试,没有就是抓取。

失败模式:三层一起常驻。playwright-mcp 的 browser_navigate、chrome-devtools-mcp 的 navigate_page、Browserbase 的 navigate、Firecrawl 的 firecrawl_scrape 全在候选里,模型每次挑一个。同一层里只留一个,这是上一期就给过的纪律。
// 04

代价与替代品:它不是安全边界,这句是官方自己写的

论断:文档检索类最坏的结果是查错一个参数;浏览器自动化类最坏的结果是在你登录的会话里点下了一个不该点的按钮。这一类的代价不在 token,在权限。

三条要知情的红线

能立刻拧的四个旋钮

三种什么都不装的做法

诚实的代价:这一类是最容易「装完演示一次就再没用过」的。判据只有一条——过去一周,它有没有替你发现过一个你自己没看见的前端问题?答不上来就摘掉,它占的工具位比文档检索类贵得多。

// 一页选购卡

先装这三个:① claude mcp add playwright npx @playwright/mcp@latest(先不加 --caps,核心组够用);② 要看性能和网络那天才加 npx -y chrome-devtools-mcp@latest,且不与 ① 同时常驻;③ npx playwright init-agents --loop=claude,把探索沉淀成 tests/ 里的 .spec.ts。

按需再加:npx @playwright/mcp@latest --extension(需要登录态的那一天)· https://mcp.browserbase.com/mcp(本地跑不动浏览器时)· npx -y firecrawl-mcp(抓别人的站)· @browserbasehq/stagehand(一次性结构化提取)· browser-use skill install(要的是自主完成率而非可控性)。

明确别装:@modelcontextprotocol/server-puppeteer(2025-05-29 已归档)· 第一层和第三层同时常驻 · --allow-unrestricted-file-access · 为「万一要截个图」而开的 --caps=vision。

一句话判据:能用 ref 指的就别用坐标点;这次跑完有东西值得明天再跑一次,就把它写成测试,别每次让模型重走一遍。

// 术语表

accessibility tree(无障碍树)
浏览器为读屏软件维护的页面结构树,每个节点带 role(按钮/链接/输入框)与可读名称。它天生就是「给非视觉使用者的页面描述」,正好也是给模型的。
snapshot ref(快照引用)
快照里给每个可交互节点分配的短标识(如 e47)。模型后续动作引用它而不是坐标;它失效时会当场报错,而不是静默点空。
capability(能力分组 / --caps)
Playwright MCP 把工具按用途分组,默认只开核心组,vision / pdf / devtools / network / storage 等需显式开启。少开一组就是少交一份工具税。
extension mode(扩展模式)
不新起浏览器,而是接管你正在用的那个实例,因此自带登录态。便利与风险是同一件事。
performance trace(性能轨迹)
DevTools 录制的一段运行时数据,含主线程、渲染与网络时序。它是 chrome-devtools-mcp 相对通用自动化 server 的真差异。
act / observe / extract
Stagehand 与 Browserbase 那一系的三件套:执行动作、找出可操作元素、按 schema 取数据。抓取侧的通用形状。
networkidle
页面网络请求静默一段时间后的状态。动态应用不等这一步就去读 DOM,是这一类最高频的假阴性来源。

// 延伸阅读