让 Claude 帮你点浏览器:10 分钟从零生成一套可运行的 E2E 测试

简介: 本文介绍如何用Playwright MCP让Claude“先看页面再写代码”,解决AI凭空猜测导致E2E测试失败的痛点。通过“侦察→生成→执行→修正”闭环,10分钟即可从零产出可运行测试,大幅提升自动化测试效率与可靠性。

让 Claude 帮你点浏览器:10 分钟从零生成一套可运行的 E2E 测试

上个月,一个测试同学跑来找我,表情有点复杂。

“哥,我让 AI 写 E2E 测试,前十分钟很爽。它一口气生成了两百行,结构清晰,注释完整。然后我跑了一下,报错。改完一个,又冒出来两个。修到第三个小时,我把自己写脚本的时间算了一下——从零手写也就四十分钟。”

我问他:“你生成之前,让 AI 看过页面长什么样吗?”

他愣了一下:“没有。我就说‘帮我写一个登录的 E2E 测试’。”

这就是问题所在。AI 不是在“写错的代码”,它是在“写它想象中的代码” 。它没见过你的页面,不知道按钮叫什么名字、class 是稳定的还是哈希的、登录后是跳转还是弹 Toast。它只能按训练数据里最常见的写法给你猜一段。

Playwright MCP 解决的就是这个“想象”问题。它让 Claude 先“看”一眼页面,再“写”操作 。不是让 AI 猜页面,是让 AI 操作浏览器、读取真实的页面结构,基于它实际看到的东西来生成脚本。

10 分钟,从零到一套能跑的 E2E 测试,靠的就是这个顺序。
核心思路:先侦察,再执行
Anthropic 在 Playwright MCP 里做了一个很关键的设计,叫 Reconnaissance-Then-Action——翻译成人话就是:别着急点,先看看页面到底长什么样。

传统方式是:你理解页面 → 找元素 → 写 Playwright 代码 → 机器执行。

MCP 方式是:你给目标 → Claude 操作浏览器 → Claude 读取页面快照 → Claude 基于快照生成代码 → 执行 → 失败就重新看页面、修脚本。

这个顺序一换,AI 就从“猜页面”变成了“看页面”。它写出来的定位器,是它实际在页面上见到的元素,不是你描述里“应该存在”的元素。

10 分钟四步走:从零到第一个可运行的 E2E
第 1 分钟:装 Playwright MCP
前置条件只有一个:Node.js 18+。

打开终端,在项目目录下执行一条命令:

claude mcp add playwright npx @playwright/mcp@latest
这条命令会在当前项目注册 Playwright MCP,Claude Code 重启后就能识别。也可以手动在项目根目录创建 .mcp.json:

{
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["-y", "@playwright/mcp@latest"]
}
}
}
重启 Claude Code,在对话里输入 /mcp,确认 playwright 状态是 connected。

第 2 分钟:告诉 Claude 你的项目约束
这一步很多人会跳过,但它决定了生成代码的“风格”对不对 。

在项目根目录放一个 CLAUDE.md,写清楚基本约束:

项目信息

测试规范

  • 使用 Page Object 模式
  • 优先使用 getByRole 和 getByTestId
  • 禁止使用 waitForTimeout
  • 断言必须包含页面可见性和业务状态
    为什么放在这里而不是每次都跟 AI 说? 因为 Claude Code 每次进入项目会自动读取 CLAUDE.md。你写一次,它每次都按这个规范生成。

第 3-8 分钟:让 Claude 边看边写
现在给 Claude 一个具体的、有步骤的目标,而不是一句“帮我写登录测试”。

在 Claude Code 里输入:

打开 http://localhost:3000/login,先 snapshot 看看页面上有什么。
然后基于你看到的元素,生成一个 Playwright E2E 测试:

  1. 输入正确的邮箱和密码
  2. 点击登录
  3. 验证跳转到 /dashboard,且页面上出现 "Welcome"
  4. 再生成一个异常用例:密码错误时,应该看到错误提示
    关键就在第一句“先 snapshot 看看页面上有什么” 。Playwright MCP 的 browser_snapshot 会返回当前页面的可访问性快照——不是截图,是结构化的文本,包含每个可交互元素的角色、名称和引用标识。Claude 拿到这份快照,就知道“页面上有一个 textbox,名字叫 Email,ref 是 e5”,而不是猜“这里应该有一个 input”。

Claude 会依次做这几件事:

打开浏览器(browser_navigate),获取快照(browser_snapshot),基于快照中的元素生成 Playwright 代码,执行代码,如果失败,重新快照、修定位器、再试。

你会在终端里看到它在“点”浏览器,每一步都有记录。

第 9-10 分钟:Review 生成的代码
Claude 生成完 .spec.ts 文件后,你只需要检查三件事:

定位器稳不稳。 如果它用了 CSS class 或 XPath,改成 getByRole 或 getByTestId。Playwright MCP 的快照里本来就有可访问角色和名称,用 getByRole 不需要额外工作,而且 class 重构不会让它碎。

有没有 waitForTimeout。 有就删掉,换成 Playwright 的自动等待或 web-first 断言。

断言够不够。 只断言“元素可见”不够。至少要加一层业务状态校验——登录成功不只是页面显示了“Welcome”,可能还要看 cookie 或接口响应。

这三项检查,两分钟够用。

两个真实的生成示例
示例一:TodoMVC——5 分钟生成可运行测试
社区里有一个公开的 Playwright MCP 实测案例,用 TodoMVC 演示了完整的生成流程。Claude 通过 MCP 打开页面、获取快照,识别出 textbox “What needs to be done?” 和 checkbox “Toggle Todo”,然后基于这些元素生成了下面这段代码:

import { test, expect } from'@playwright/test';

test('add and complete a todo', async ({ page }) => {
await page.goto('https://demo.playwright.dev/todomvc');
await page.getByRole('textbox', { name: 'What needs to be done?' }).fill('Buy groceries');
await page.keyboard.press('Enter');
await expect(page.getByText('Buy groceries')).toBeVisible();
await page.getByRole('checkbox', { name: 'Toggle Todo' }).check();
await expect(page.getByText('1 item left')).toBeVisible();
});
这段代码第一次跑就通过了。 因为定位器不是猜的,是 Claude 在快照里实际看到的。getByRole 和 getByText 都是基于快照中的可访问信息生成的,class 怎么变都不影响。

示例二:TestDino Demo Store——完整的购买旅程
有一个开源项目 pw-agent 用 Playwright MCP 让 Claude 自动探索一个电商演示站,生成从注册到下单的完整 E2E 测试。Claude 通过 MCP 操作浏览器,发现了真实的 data-testid 属性,生成了 complete-purchase.spec.ts,覆盖 11 个步骤:打开首页 → 注册 → 登录 → 浏览商品 → 加购 → 结算 → 填写地址 → 支付 → 验证订单 API。

这个项目的生成方式有一个值得参考的细节:它先让 Claude 用 MCP 探索,产出一份 Markdown 测试计划,再基于计划生成代码。计划里写清楚了每个步骤和对应的选择器,代码只是把计划翻译成可执行的 spec。计划和代码分离,出了问题能定位是“计划漏了”还是“代码写错了” 。

避坑指南
坑一:跳过快照直接生成。 这是最大的坑。AI 不先看页面,就是在猜选择器。快照是 MCP 工作流的地基,不是可选项。

坑二:一次跑太多场景。 一上来就让 Claude 生成“完整的购买流程”,它会在长链路里丢失上下文。一个场景一个场景跑,跑通一个再跑下一个,短循环比长循环稳定得多。

坑三:只让 AI 写,不 Review。 AI 生成的代码是初稿。定位器、等待策略、断言深度,每一项都需要人检查。MCP 让生成变快了,但没有让 Review 变得不必要。

坑四:以为“能生成”就等于“能进 CI”。 本地跑通的 spec,进 CI 之前还要确认:测试是否独立、有没有依赖前一条用例的登录态、超时配置是否合理。生成是第一步,工程化是第二步。

坑五:CI 里忘了 --headless。 本地开发用带界面模式没问题,CI 的 Linux runner 没有显示器。在 MCP 启动参数里加 --headless,或者用环境变量 PLAYWRIGHT_MCP_HEADLESS=true。

最后
回到开头那个问题:为什么他修了三个小时?

因为他让 AI 在“没有看过页面”的情况下写代码。 AI 写的每一行,都建立在一个它自己想象出来的页面上。他修的那三个小时,本质上是在逐个纠正 AI 的“想象”和真实页面之间的差距。

Playwright MCP 做的事情,是把“想象”变成“看见”。Claude 先操作浏览器、读取真实快照,再基于快照生成代码。 你不需要写一行 Playwright 代码,也不需要告诉它按钮的 class 叫什么——它自己看。

10 分钟四步:装 MCP、写约束、让它边看边写、Review 三件事。

下次你面对一个页面要写 E2E 测试的时候,别打开编辑器了。打开 Claude Code,说一句:

“先 snapshot 看看页面上有什么,然后帮我生成登录的 E2E 测试。”

本文部分内容参考了霍格沃兹测试开发学社整理的相关技术资料,主要涉及软件测试、自动化测试、测试开发及 AI 测试等内容,侧重测试实践、工具应用与工程经验整理。

相关文章
|
云安全 安全 网络安全
|
7天前
|
JavaScript 安全 前端开发
Nodejs Brotli decoder 代码执行漏洞 (CVE-2026-111497)10629
Node.js发布安全更新修复Brotli解码器高危RCE漏洞(CVE-2026-111497),建议受影响版本用户立即升级。
1997 1
|
14天前
|
JSON 程序员 数据格式
最新版Notepad++下载、安装、配置保姆级教程(附官网安装包)
Notepad++ 是一款免费开源、轻量快速的 Windows 文本编辑器,支持多标签、语法高亮、代码折叠与宏录制,体积小、启动快、资源占用低,兼容 x64/x32/ARM 架构,是程序员和文字工作者的高效利器。
2964 0
|
13天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
2203 44
|
10天前
|
Web App开发 人工智能 前端开发
2026 年 AI 浏览器怎么选?Ego Lite、Tabbit、Chrome DevTools MCP 深度对比,开发者到底该用哪个?
2026年AI浏览器选型指南:Ego Lite专注多Agent协同(Mac优先),Tabbit国产首选,原生支持Windows与Codex控制;Chrome DevTools MCP非浏览器而是开发者利器,深度集成Console/Network/Performance调试能力,让AI真正“看懂并验证”前端代码。
1398 3
|
7天前
|
安全 应用服务中间件 Go
PHP2Shell 漏洞拆解:WordPress 与 nginx 为何中招
PHP2Shell 双 RCE 已遭在野利用:WordPress、Drupal 全在射程内,nginx 其实另有洞。拆成因与修复顺序
PHP2Shell 漏洞拆解:WordPress 与 nginx 为何中招
|
7天前
|
开发者 索引
DeepSeekHarness大肥鱼自带插件市场了?加个地址就能用
Open Plugin Market 是一个开放插件索引平台,收录800+优质DSH插件,支持分类浏览、智能推荐与随机发现。无需安装市场,粘贴索引地址即可一键接入,网页版直访 dshopen.org,助力小开发者被看见。(239字)
1598 1
DeepSeekHarness大肥鱼自带插件市场了?加个地址就能用
|
6天前
|
人工智能 Linux API
Magpie, 轻量本地AI网关!免费Token用不完!
Magpie 是开源AI编程模型调度网关,上线一月获1.8万Star。它通过本地高性能网关统一托管多平台API密钥、账号与免费额度,实现跨Agent的模型秒级切换、静默额度轮换与资源复用,显著降低碎片化管理成本。(239字)
Magpie, 轻量本地AI网关!免费Token用不完!
|
6天前
|
安全 程序员 应用服务中间件
PHP 被曝两大致命漏洞,请所有程序员抓紧做这件事!
PHP 官方发布了紧急安全更新,一口气修复了两个严重漏洞。如果网站和服务器用了 PHP 应该怎么处理?漏洞的原理是什么?本文给你讲清楚
678 0

热门文章

最新文章