拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Playwright+ClaudeCode+MCP:自然语言驱动浏览器自动化实战

Playwright+ClaudeCode+MCP:自然语言驱动浏览器自动化实战

把 Playwright、ClaudeCode、MCP、CLI 这四个词放在一起,我第一反应是:终于有人把这套链路理清了。过去小半年我一直拿 ClaudeCode 当日常终端里的主力编程助手,后来又折腾着用 MCP 协议把 Playwright 接进去,让 AI 直接操纵浏览器去跑测试、抓页面、做断言。这套组合最吸引我的地方在于,你不需要再一行行手写那些重复的页面定位、等待、断言逻辑,只要用自然语言把目标描述清楚,AI 自己调工具、自己看结果、自己改代码。这篇文章主要面向两类人:一类是写过 Playwright 但还没体验过 MCP 的测试/前端工程师,另一类是用 ClaudeCode 写代码、但一直觉得浏览器自动化很麻烦的人。我会从工具定位、环境搭建、实际协作、协议原理,再到最常见的坑,把整套流程捋一遍。

1. 先搞清楚这几个工具到底在干什么

1.1 为什么是 Playwright

Playwright 是微软开源的浏览器自动化框架,支持 Chromium、Firefox、WebKit,一套代码三种浏览器都能跑。以前用 Selenium 的时候,写出来的脚本总有一股“老古董”的味道:要手动等元素出现、手动处理 iframe、选择器稍微一变整个脚本就崩。Playwright 把这些痛点基本都端掉了,它自带 auto-wait 机制,元素没出来就自动等,locator 重试策略也做得相当细,还有 codegen 录制器、Trace Viewer 回放,调试体验强过前面一个时代。

我在实际使用中感受最明显的一点是:Playwright 的 locator 设计非常接近真实用户的操作视角。比如getByRole('button', { name: '提交' })、getByText('登录'),语义清晰,页面改版后选择器不容易像 xpath 那样一碰就碎。而且它的事件模型是“先动作、后等待”的,点击、填写、导航这些操作都内置了等待与重试,脚本写起来干净很多。

1.2 ClaudeCode、CLI、MCP 各管哪一段

ClaudeCode 是 Anthropic 出品的命令行 AI 编程助手,直接跑在终端里。CLI 的全称是 Command-Line Interface,就是命令行接口,所有用claude命令开头的能力都走这一层。MCP 是 Model Context Protocol,模型上下文协议,它解决的是“AI 怎么调用外部工具”的问题。

这三者的分工可以打一个比方:ClaudeCode 是大脑,负责理解你的人类语言指令并拆解任务;MCP 是神经,负责把大脑的命令翻译成具体工具能理解的动作;Playwright 是手,真正去打开浏览器、点击按钮、读取页面内容。以前你想浏览器自动化,得自己去写 Playwright 脚本;现在你只需要对着 ClaudeCode 说“打开这个页面,找到那个按钮,点了看看结果”,它自会通过 MCP 把 Playwright 调用起来,再回来告诉你发生了什么。

1.3 这套组合解决的核心问题

传统端到端测试的日常是什么?开 codegen 录制、生成脚本、手动清理选择器、跑测试、看报告、修 bug,循环往复。这套流程里 70% 是体力活,而 ClaudeCode + MCP + Playwright 接起来之后,你只需要给一句任务描述,AI 自动完成页面探查、脚本生成、执行、反馈,最后由你来审核。

我自己踩过最深的一个坑是“老项目测试代码没人敢动”。选择器乱、等待靠 sleep、一跑就 flaky。用 MCP 接上之后,我让 ClaudeCode 先跑一遍现有测试,然后逐条分析失败的 locator,最后批量替换成getByRole或getByText,半天时间重构完之前两周没敢碰的测试套件。这就是这套组合的真正价值——不是替代你思考,而是干掉重复劳动。

2. 环境搭建与安装避坑

2.1 Playwright 安装这几步就够了

安装 Playwright 本身不复杂,但我见太多人在第一步就卡住,这里把完整的路径写清楚。

# 初始化 Node 项目 npm init -y # 安装 Playwright 测试库 npm install -D @playwright/test # 下载 Chromium 浏览器内核 npx playwright install chromium # 如果要在 Linux 环境跑,还需要系统依赖 npx playwright install --with-deps

npx playwright install这一步很关键,它不只是装个 npm 包,而是把 Chromium/Firefox/WebKit 的浏览器二进制下载到本地缓存目录。Windows 下通常一次就能过,Linux 下容易出现系统库缺失,比如libnss3、libatk、libgbm这些,直接报“Host system is missing dependencies”,这时候install --with-deps或者手动apt-get install就能解决。

2.2 npx playwright install 失败的表现与处理

这个命令失败基本就三类问题:下载超时、权限不足、系统依赖缺失。

下载超时是最常见的,特别是浏览器二进制体积不小,国内网络偶尔会断。解决思路是把下载源切到国内镜像:

# Linux / macOS export PLAYWRIGHT_DOWNLOAD_HOST=https://npmmirror.com/mirrors/playwright npx playwright install chromium

Windows PowerShell 里用$env:PLAYWRIGHT_DOWNLOAD_HOST="https://npmmirror.com/mirrors/playwright"再执行安装。

权限问题多见于 Linux 服务器,EACCES报错一出来,先确认 npm 全局路径是不是有写权限,或者直接加sudo。系统依赖缺失前面说了,用--with-deps一把梭。还有个容易忽略的点:公司防火墙或安全软件会拦截二进制下载,如果你在办公室网络里一直失败,先切热点试试,定位是不是网络策略的问题。

2.3 ClaudeCode 的安装与验证

ClaudeCode 支持两种安装方式。如果本机有 Node.js 环境,直接走 npm 最省事:

npm install -g @anthropic-ai/claude-code # 验证是否装好 claude --version

不想污染全局环境,或者机器上没 Node,就去官网下对应平台的 native installer。装完之后在终端输入claude就进入交互式对话,也可以在命令里直接带任务:

claude "帮我看看当前目录下的 package.json 里有哪些依赖"

很多人问 PyCharm 能不能用 ClaudeCode。PyCharm 目前没有官方插件,但这不妨碍你用——直接在 PyCharm 自带的 Terminal 里执行claude,它就运行在当前项目目录了,能正常读代码、改文件、跑命令。VSCode 那边反而有官方扩展,装完直接在侧边栏开对话,体验更顺。

2.4 配置 MCP Server

MCP Server 的配置有两种典型场景:本地起一个、连远程已有的。

本地场景,最常用的是 Playwright 官方提供的 MCP Server:

claude mcp add playwright -- npx @playwright/mcp@latest

这段命令的意思是:给 ClaudeCode 注册一个名为playwright的 MCP Server,启动方式是通过npx运行最新的@playwright/mcp包。注册完成后可以在会话里执行/mcp查看状态,显示playwright connected就说明链路通了。

远程场景,比如团队里有人在一台公共服务器上部署好了 MCP Server,其他成员通过http://或wss://协议连接。配置格式大致是:

claude mcp add --transport http my-remote-server https://your-mcp-host.example.com/mcp

如果是带鉴权的 WebSocket 端点,地址里会带 token,形如wss://your-mcp-host:port/mcp/?token=YOUR_TOKEN。整条命令会写进 ClaudeCode 的配置文件,默认路径是~/.claude/.mcp.json,Windows 下是%USERPROFILE%\.claude\.mcp.json,启动 ClaudeCode 时自动加载。这个文件里的内容属于敏感信息,不要提交到 Git。

3. 实操:用 ClaudeCode + Playwright MCP 干活

3.1 第一次连通性验证

装好之后,最让人忐忑的一步就是验证链路是否通。我一般会这样测:

先把 Playwright MCP Server 启动起来,确认没有报错;然后在 ClaudeCode 对话里输入/mcp,看到 server 状态是 connected;接着随便给一句任务:

打开 https://example.com ,把页面标题读给我,然后截一张全页截图保存到当前目录。

如果 ClaudeCode 能正确返回页面标题,并且截图文件也生成了,说明 Playwright MCP 这条路彻底通了。第一次看到控制台里跳出“工具调用成功”的时候,那种感觉就像家里的水管终于接上了主阀——之前一堆分散的工具,突然全都串起来了。

3.2 让 AI 自己完成一条端到端操作

接下来试一个更接近真实工作的场景:让 ClaudeCode 完成一次完整页面操作并给出结论。我常用的测试指令长这样:

打开 https://playground.example.com ,点击“开始测试”按钮, 等待新页面加载完成,读取页面上第一个表格的前三行内容并总结。

这条任务跑起来后,ClaudeCode 会通过 MCP 调起浏览器,依次执行goto、click、waitForLoadState、locator读取表格内容,最后把结果汇总成自然语言回复给你。观察它的执行过程可以看到,AI 遇到元素找不到时会自己加等待、换选择器,比想象中的“只会照脚本执行”要聪明不少。这就是 MCP 的价值——工具能力开放给模型,模型自己在执行中做微调决策。

3.3 生成规范的可复用测试用例

如果你想落地的不是“一次性执行”,而是正式存进项目里的自动化用例,那就要用生成代码的模式。让 ClaudeCode 产出标准测试文件:

在 tests/ 目录下生成一个 login.spec.js,包含: 1. 访问登录页 2. 填写用户名和密码 3. 点击登录按钮 4. 断言跳转后的页面包含“欢迎回来”

生成的代码大致长这样:

const { test, expect } = require('@playwright/test'); test('用户登录', async ({ page }) => { await page.goto('https://example.com/login'); await page.getByPlaceholder('用户名').fill('testuser'); await page.getByPlaceholder('密码').fill('pass123'); await page.getByRole('button', { name: '登录' }).click(); await expect(page.getByText('欢迎回来')).toBeVisible(); });

然后直接本地跑npx playwright test,这套用例就正式并入回归体系了。整个过程里我的角色就是“提需求 + 审代码”,写脚本的体力活全交给了 AI,这一步的效率提升是肉眼可见的。

3.4 关于 body 语法和 Playwright Agent 的补充

刚才提到的 body 语法,实际指的是 Playwright 的 API 请求体写法。Playwright 不仅能操作页面,还能发 HTTP 请求、校验响应体,这层能力在接口测试里也常被用到:

const response = await page.request.post('https://api.example.com/login', { data: { username: 'test', password: 'pass' }, }); const body = await response.json();

在构建 AI Agent 时,Playwright 的 request 上下文常常被用于 API 前置登录、准备测试数据这类操作。

Playwright Agent 的概念指的是“把 Playwright 作为可编程代理来执行自动化任务”,比如在后台服务里用一个 Agent 循环监听任务队列,拿到 URL 就开浏览器干活,把结果回写。配合 MCP 后,ClaudeCode 本身就充当了这个 Agent 的“大脑”,让浏览器自动化从“定时脚本”进化成“能理解任务的执行体”。

4. MCP 的核心机制与同类工具对比

4.1 MCP 协议到底做了什么

MCP 是软件层的协议,不是硬件协议,这一点容易和“USB-C 那种物理接口”搞混。它的类比对象其实是接口标准:但没有物理形态,是纯数据的约定。MCP 把 AI 客户端和外部工具之间的通信方式标准化,格式统一走 JSON-RPC,定义的资源、工具、提示词三个核心原语。

通信链路大概是:用户在 ClaudeCode 里发指令 → ClaudeCode 作为 MCP 客户端 → 向 MCP Server 发起请求 → Server 执行具体操作 → 把结果返回给 ClaudeCode → AI 根据结果决定下一步。可以把 MCP 想成一个万能插座,只要工具方实现了 MCP Server,任何支持 MCP 的 AI 客户端都能直接使用它,再不用为每个工具单独写一套集成逻辑。

4.2 Playwright MCP 和 Browser Use MCP 的差异

这是我被问得最多的问题之一,尤其是做 AI Agent 的人最容易搞混。两者本质上是两套不同的软件:

对比维度Playwright MCPBrowser Use MCP
定位把 Playwright 能力封装给 AI 使用给 AI Agent 提供浏览器自主操作能力
底层实现基于 Playwright 官方 API通常基于 Playwright,但加了 Agent 决策层
典型场景自动化测试、临时性页面操作让 AI 自动规划多步任务并执行
对任务理解不负责决策,等模型调工具自带任务理解与规划能力
适合谁测试/前端工程师AI 应用开发者、Agent 构建者

用最简单的话说:Playwright MCP 是“遥控器”,提供精细操作通道但不抢大脑;Browser Use MCP 是“机器人”,自带规划逻辑,你告诉它目标,它自己拆步骤执行。如果你只是想用 ClaudeCode 写测试、跑断言,选 Playwright MCP 就对了;如果你在做一个能自己上网查资料、填表单的 Agent,Browser Use 这类框架会更合适。

4.3 远程 MCP Server 与安全边界

团队协作场景下,MCP Server 经常部署在一台公共机器上,其他人通过远程地址连过来。好处是浏览器、登录态、Cookie 都集中在服务端,成员不需要各自维护环境。但代价是安全面一下子变大了:一个能远程控制浏览器的服务,实际上等于一个可以登录你所有站点账号的“万能钥匙”。所以有三条安全底线我建议一定守住:

第一,token 不要硬编码在配置文件里,用环境变量注入,比如MCP_TOKEN=xxx claude --mcp-config mcp.json;第二,MCP Server 只监听内网或加白名单,不要裸奔到公网;第三,敏感环境的操作,比如支付、邮件、后台管理,用独立的浏览器 profile,避免和日常任务混在一起。

5. 日常使用最常见的 5 个坑

5.1 网络层面的报错

ClaudeCode 在某些 Windows 环境会报internetopenurl() failed. 0x800...这类错误,从字面看是系统 API 调用失败,实际原因通常是系统代理设置、防火墙拦截或者本地安全软件挂钩了网络请求。排查思路可以分三步:先确认系统能正常访问外网,再检查有没有全局代理或 hosts 劫持,最后看安全软件是否拦截了 Node.js 进程的出网请求。临时禁用安全软件做对照测试,是定位这类问题最快的方法,不要一上来就重装。

5.2 找不到 CLI 二进制文件的报错

unable to locate the codex cli binary or required runtime components这类报错多发生在混合安装工具链的机器上,本质是 PATH 环境变量里没有对应二进制,或者安装包被用户改了目录。解决办法很直白:重新跑一遍全局安装命令,确认安装路径在 PATH 中,然后在终端里输入二进制名验证能否找到。我自己吃过一次亏是 macOS 上 npm 装到了/opt/homebrew/bin,但 shell 配置文件里 PATH 没包含这个目录,所有命令都是 command not found,当时还以为是装坏了。

5.3 滑块验证码与反自动化检测

滑块验证码和瑞数这类风控是自动化测试绕不过去的现实问题。这里必须说明白:验证码、指纹风控的设计目的就是拦自动化,强行绕过既不合规也会让你被封号封 IP。正确做法是分层处理:测试环境让开发把风控关掉,或者后端提供一个测试专用的白名单标记;预发布环境实在过不了滑块,就用 headed 模式启动浏览器,人工介入划一下,测试继续跑;不要在脚本里写针对滑块的绕过逻辑,这属于把自己往风险里推的行为。

5.4 录制的脚本不稳定怎么办

codegen 录出来的脚本能跑,但一换环境就 flaky,八成是选择器写得太脆。录制器默认生成的 CSS 选择器带了很长一串div[id=...] > div > span这样的路径,页面稍微改个布局就碎。这类问题修起来有固定的套路:能用getByRole就不写 CSS,能用getByText就不写 class,实在要写 CSS 就保持简洁、选有语义的测试标记,比如>

返回列表