☰
Cursor + playwright + MCP 实现UI自动化测试:TaoToken 统一 Key 配置与验证
2026/9/29 6:46:11 网站建设 项目流程

1. Cursor 里跑 Playwright MCP,为什么模型调用会先卡住

在 Cursor 里用 Playwright MCP 做 UI 自动化测试,流程本身不复杂:MCP Server 负责把浏览器操作暴露成工具,Cursor 里的模型负责理解你的用例描述、生成或调整测试脚本,Playwright 负责真正驱动 Chromium、Firefox、WebKit 跑起来。问题往往不在 Playwright,而在模型调用这一层。

我试过把 Playwright MCP 接进 Cursor 之后,最常遇到的不是脚本写不出来,而是模型请求时好时坏:有时 Cursor 内置模型额度用完了,有时团队里几个人各自配 Key,环境一换就报 401,有时想在 Cursor 里同时用不同模型做用例生成和脚本重构,结果每个模型都要单独配一遍地址和密钥。UI 自动化测试本身就需要反复“生成—回放—修正”,模型调用不稳定,整个 MCP 流程就会断在第一步。

这篇要解决的就是这件事:在 Cursor + Playwright MCP 的组合里,用 TaoToken 做统一 Key 和 API 通道管理,让模型调用只配一次,之后无论是生成测试用例、修正定位器,还是让模型读 Playwright 报告做二次分析,都走同一个入口。适合已经在用 Cursor、想把手动写 Playwright 脚本变成“描述用例 + 模型生成 + 回放验证”的测试同学,也适合团队里需要统一管理模型 Key 的工程角色。

核心检索词先摆清楚:Cursor 是编辑器,Playwright 是浏览器自动化框架,MCP 是模型和工具之间的协议层,TaoToken 在这里承担的是统一模型调用通道。下面从配置骨架到验证动作,一步步给可复制的内容。

2. TaoToken 前置:统一 Key 与 API 通道要准备什么

TaoToken 在这里的角色不是替代 Cursor,也不是替代 Playwright,而是把模型调用收敛到一个入口。你可以把它理解成一个统一的 API 网关:Cursor 里的模型请求、MCP 触发的模型调用、后续可能接的 Coding Plan,都指向同一个 base URL 和同一套 Key。这样做的直接好处是,换模型、加模型、团队共享额度,都不用改 Cursor 里每个模型的独立配置。

需要提前准备的东西不多:

第一,一个 TaoToken 账号,登录后进控制台创建 API Key。地址是 https://taotoken.net/api ,控制台入口在 https://taotoken.net/console 。Key 创建后只显示一次,建议直接存进环境变量,不要硬编码进 settings.json 或 config.toml。

第二,确认你要用的模型名。TaoToken 的模型对话入口在 https://taotoken.net/models ,接入文档在 https://taotoken.net/doc 。文档里会列出当前可用的模型标识,Cursor 配置里填的 model 字段要和文档一致,否则会出现“Key 正确但模型不存在”的 404。

第三,Node.js 环境。Playwright MCP 通过 npx 启动,所以本机要有 Node 18 以上。可以用node -v确认,低于 18 先升级。

第四,Cursor 版本。MCP 配置在 Cursor 的 settings.json 里,建议用较新的 Cursor 版本,旧版本对 MCP Server 的加载路径支持不一致,容易出现“配置写了但工具列表不出现”。

关于 Key 的安全,有一点要强调:不要把 Key 写进会提交到 Git 的文件。Playwright 项目里通常有.gitignore,把.env和 Cursor 的本地配置目录加进去。团队共享时,用环境变量注入,而不是互相发 Key 文本。

如果你后续要做长期编码或 Agent 类的自动化,可以了解 Coding Plan,入口在 https://taotoken.net/coding-plan 。它更适合需要持续调用、按周期管理的场景,和本篇的一次性 UI 测试配置是互补关系。

3. 可复制配置:config.toml 与 settings.json 骨架

这一节给两份骨架。一份是 Playwright MCP 侧的config.toml,一份是 Cursor 侧的settings.json。两份配合起来,才能让 Cursor 通过 MCP 调 Playwright,同时模型请求走 TaoToken。

先看 Playwright MCP 的配置。Playwright MCP 官方推荐用 npx 启动,最小配置是一个 JSON。但如果你想把模型通道也纳入统一管理,可以在项目根目录放一个config.toml,用来声明 MCP Server 的启动参数和模型相关的环境变量引用。注意,MCP Server 本身不直接调模型,模型调用发生在 Cursor 侧,所以config.toml主要管 Playwright 的启动行为,模型 Key 通过环境变量传给 Cursor。

# config.toml # Playwright MCP 启动配置骨架 # 放在项目根目录,供本地脚本或 Cursor 读取 [mcp] # MCP Server 名称,Cursor 里会显示这个名字 name = "playwright" # 启动命令,npx 拉取最新版 playwright-mcp command = "npx" args = ["@playwright/mcp@latest"] # 浏览器相关参数 [mcp.browser] # 默认无头模式,调试时可改为 false 打开浏览器 headless = true # 指定浏览器,可选 chromium / firefox / webkit browser = "chromium" # 视口大小,影响截图和元素定位 viewport = { width = 1280, height = 720 } # 模型通道配置,供 Cursor 读取环境变量时参考 [model] # TaoToken 统一 API 入口 base_url = "https://taotoken.net/api" # Key 从环境变量读取,不要写死 api_key_env = "TAOTOKEN_API_KEY" # 默认模型,按文档实际名称填写 default_model = "gpt-4o"

这份config.toml不是 Playwright MCP 强制要求的格式,而是我用来把“MCP 启动参数”和“模型通道参数”放在一起管理的做法。真正生效的是 Cursor 的settings.json,因为 Cursor 才是发起模型请求的一方。

下面是 Cursor 的settings.json骨架。路径通常在~/.cursor/settings.json或项目级.cursor/settings.json。如果你之前已经配过 MCP,注意不要覆盖已有的mcpServers,而是把playwright加进去。

{ "mcpServers": { "playwright": { "command": "npx", "args": ["@playwright/mcp@latest"], "env": { "PLAYWRIGHT_HEADLESS": "true" } } }, "models": { "taotoken-default": { "provider": "openai", "baseUrl": "https://taotoken.net/api", "apiKey": "${env:TAOTOKEN_API_KEY}", "model": "gpt-4o" }, "taotoken-claude": { "provider": "anthropic", "baseUrl": "https://taotoken.net/api", "apiKey": "${env:TAOTOKEN_API_KEY}", "model": "claude-3-5-sonnet" } } }

这里有两个关键点。第一,apiKey用${env:TAOTOKEN_API_KEY}引用环境变量,Cursor 支持这种写法,避免 Key 明文落盘。第二,baseUrl统一指向https://taotoken.net/api,不同模型共用同一个入口,换模型只改model字段,不用改地址和 Key。

环境变量在 macOS/Linux 下可以这样设置,写进~/.zshrc或~/.bashrc:

export TAOTOKEN_API_KEY="你的Key"

Windows 下用系统环境变量面板,或者 PowerShell:

[Environment]::SetEnvironmentVariable("TAOTOKEN_API_KEY", "你的Key", "User")

设置完重启 Cursor,让环境变量生效。这一步不做,settings.json里的${env:TAOTOKEN_API_KEY}会解析成空字符串,模型请求直接 401。

4. 验证请求:一次测试用例生成与回放

配置写完,接下来验证整条链路。目标是:在 Cursor 里描述一个 UI 测试用例,让模型通过 TaoToken 生成 Playwright 脚本,再用 Playwright MCP 回放,确认浏览器操作和断言都跑通。

先建一个最小 Playwright 项目。如果你已经有项目,跳过初始化,直接确认playwright.config.ts存在。

mkdir ui-mcp-demo && cd ui-mcp-demo npm init -y npm init playwright@latest

npm init playwright@latest会问几个问题,浏览器选 Chromium 就够验证,CI 工作流可以先选 no,后面需要再加。装完后目录里会有tests/example.spec.ts和playwright.config.ts。

然后确认 MCP Server 能启动。在终端里手动跑一次:

npx @playwright/mcp@latest --help

能打印帮助信息,说明 npx 拉取正常。如果卡住或报网络错误,先解决 npm 源的问题,再回 Cursor 里配。

回到 Cursor,打开这个项目,在对话里输入类似这样的描述:

帮我生成一个 Playwright 测试用例,访问 https://example.com,断言页面标题包含 Example Domain,并截图保存到 test-results 目录。

Cursor 会调用你配置的taotoken-default模型,通过 TaoToken 的 API 通道生成脚本。生成结果大概长这样:

import { test, expect } from '@playwright/test'; test('example domain title check', async ({ page }) => { await page.goto('https://example.com'); await expect(page).toHaveTitle(/Example Domain/); await page.screenshot({ path: 'test-results/example.png' }); });

把这段保存成tests/example-domain.spec.ts,然后跑:

npx playwright test tests/example-domain.spec.ts

预期输出是 1 passed。如果失败,先看报错是定位问题还是网络问题。定位问题通常是选择器不对,可以让 Cursor 里的模型读报错信息,重新生成选择器;网络问题则检查 Playwright 下载的浏览器是否完整。

回放验证通过后,再试一次 MCP 工具调用。在 Cursor 对话里输入:

用 playwright MCP 打开 https://example.com,截图并返回页面标题。

如果 MCP 配置正确,Cursor 会列出可用的 Playwright 工具,并实际驱动浏览器执行。这一步成功,说明 Cursor → MCP → Playwright 的链路通了,而模型请求走的是 TaoToken 的统一通道。

想单独验证模型通道是否正常,可以打开模型对话入口 https://taotoken.net/models ,在网页里发一条测试消息,确认 Key 和模型名都对。网页能通、Cursor 里不通,问题就在 Cursor 的settings.json或环境变量,而不是 Key 本身。

5. 本篇常见错排查

配置过程中最容易踩的坑集中在几个地方,按出现频率排一下。

第一个是 401 Unauthorized。原因通常是环境变量没生效,或者settings.json里 Key 写成了明文但复制时带了空格。排查方法:在终端echo $TAOTOKEN_API_KEY确认有值,然后重启 Cursor。如果用的是项目级.cursor/settings.json,确认它没有被.gitignore忽略导致 Cursor 读不到。

第二个是模型不存在 404。TaoToken 的模型名要和文档一致,gpt-4o和gpt-4o-mini是两个不同标识,写错就 404。去 https://taotoken.net/doc 核对当前可用模型列表,别凭记忆填。

第三个是 MCP Server 不出现。Cursor 的 MCP 工具列表里看不到 playwright,先检查settings.json的 JSON 格式是否合法,多一个逗号都会导致整个文件解析失败。可以用node -e "JSON.parse(require('fs').readFileSync('settings.json'))"验证。另外确认npx @playwright/mcp@latest能在终端独立跑通。

第四个是 Playwright 浏览器下载失败。npm init playwright@latest之后如果没自动下载浏览器,手动跑npx playwright install chromium。国内网络环境下这一步可能慢,耐心等或换 npm 源,不要中途打断。

第五个是脚本生成后定位器不对。模型生成的page.click('text=登录')这类选择器,在实际页面里可能匹配到多个元素。让 Cursor 里的模型读 Playwright 的报错堆栈,它会给出更精确的getByRole或getByTestId写法。这也是 MCP 流程的价值:报错能直接回传给模型做二次修正。

第六个是截图路径不存在。page.screenshot({ path: 'test-results/example.png' })要求目录已存在,Playwright 默认会创建test-results,但如果你改了路径,先mkdir -p一下。

如果排查到一半不确定是模型通道问题还是 MCP 问题,最快的分流方法是:先在 https://taotoken.net/models 网页端发消息,通 → 模型通道没问题,查 Cursor 配置;不通 → 查 Key 和模型名。接入细节以 https://taotoken.net/doc 为准,API Key 管理在 https://taotoken.net/api-keys 。

6. 把统一 Key 固化进你的 Cursor 工作流

一次配置跑通之后,建议把几个动作固化下来,避免每次换项目重来。

把TAOTOKEN_API_KEY写进 shell 的启动文件,而不是每个项目单独设。这样 Cursor 在任何项目里打开,模型通道都是通的。团队协作时,Key 通过内部密钥管理工具分发,不要贴在聊天记录里。

把settings.json里的模型配置做成模板,新项目直接复制.cursor/settings.json,只改model字段。TaoToken 的统一入口意味着baseUrl和apiKey两行永远不变,这是它相比每个模型单独配地址的价值所在。

Playwright MCP 的config.toml可以按项目调整headless和browser,但 MCP Server 的启动命令保持npx @playwright/mcp@latest,让它始终拉最新版,避免版本落后导致的工具缺失。

如果你后面要把 UI 自动化测试接进 CI,或者让 Agent 长期跑回归,可以看 Coding Plan,入口在 https://taotoken.net/coding-plan 。它解决的是持续调用和额度管理的问题,和本篇的一次性配置不冲突。

最后留一个实用习惯:每次改完settings.json,先在 Cursor 里发一条最简单的“你好”确认模型通道通,再跑 Playwright 用例。这样出问题时能快速判断是配置层还是脚本层,省掉一半排查时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询