2026/10/5 20:21:02

MCP-Playwright 实战:用 JS 代码驱动 AI 完成复杂网页交互任务

MCP-Playwright 实战:用 JS 代码驱动 AI 完成复杂网页交互任务 1. 为什么 AI 需要 MCP-Playwright 才能操作真实网页大语言模型能写代码、能分析文本但你把一个需要登录、翻页、勾选条件、再点提交的网页任务丢给它它只能干瞪眼。原因很直接模型本身没有浏览器它看不到 DOM点不了按钮也拿不到渲染后的数据。过去我们靠 Selenium 手写 XPath页面一改选择器就全废后来靠模型生成脚本又卡在“生成完还得人工跑、报错还得人工改”的循环里。MCP-Playwright 解决的正是这个断层。MCP 是模型上下文协议它把 Playwright 的浏览器控制能力包装成模型可以调用的工具集。模型不再只是“输出一段代码让你去跑”而是能在对话过程中直接发起动作打开页面、点击元素、填写输入框、执行一段 JS、截图回传。Playwright 本身是微软开源的自动化框架支持 Chromium、Firefox、WebKit 三套内核稳定性比早期方案好很多。两者结合后AI 第一次真正具备了“看见网页、操作网页”的闭环能力。这套组合适合谁我梳理了三类典型场景。第一类是自动化测试同学需要让 AI 根据自然语言描述生成并执行交互步骤比如“登录后进入订单页筛选近七天已发货订单导出列表”。第二类是数据采集与分析页面是动态渲染的接口有签名直接抓包成本高用浏览器驱动反而更省事。第三类是智能代理开发你要做一个能自主完成多步骤表单的 AgentMCP-Playwright 就是它的“手和眼”。热词里提到的 MCP-Playwright、Playwright、AI、JS、自动化其实指向同一个核心让 JS 代码成为 AI 与浏览器之间的执行层。你写的不再是给人看的脚本而是给模型调用的工具描述加执行逻辑。下面我会从环境准备、配置片段、可复制脚本到排障完整走一遍。2. TaoToken 前置准备拿到 Base URL、API Key 与模型 ID在配置 MCP 服务之前得先有一个能调用模型的入口。TaoToken 在这里扮演的是模型网关角色它提供兼容 OpenAI 风格的接口你拿到 Base URL 和 API Key 后就能在 MCP 配置里把模型接进来。注意MCP-Playwright 负责浏览器动作模型负责决策“下一步点哪里”两者缺一不可。第一步访问官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并登录。进入控制台后找到 API Keys 页面新建一个 Key。这个 Key 只显示一次复制后先存到本地密码管理器或环境变量里别直接写进会提交到 Git 的配置文件。第二步确认 Base URL。TaoToken 的 API 地址是 https://taotoken.net/api注意这个地址不带任何查询参数配置时直接填这个即可。如果你用的是 OpenAI SDK 兼容模式通常还需要在末尾保留/v1具体以接入文档为准。文档入口在 https://taotoken.net/doc 里面有各语言 SDK 的示例。第三步选模型 ID。这一步很关键因为 MCP-Playwright 的交互任务对模型的指令遵循能力要求较高。你可以在模型对话页面 https://taotoken.net/model-chat 里先试几个模型看哪个对“点击第几个按钮”“填写哪个字段”这类指令理解更准。实测下来指令遵循强的模型在复杂分支任务里出错率明显低。选好后记下 Model ID后面配置里要用。如果你打算长期跑编码类或 Agent 类任务可以关注 Coding Plan 页面 https://taotoken.net/coding-plan 它针对高频调用场景做了额度优化。不过对于本篇的 MCP-Playwright 验证先用按量计费的 Key 就够了。这里有个容易踩的坑很多人把 Key 直接写进claude_desktop_config.json或 MCP 的 settings 文件然后不小心同步到了云端。正确做法是用环境变量引用配置里写${TAOTOKEN_API_KEY}这种形式具体语法取决于你用的 MCP 客户端。下面第三节我会给出完整片段。3. 可复制配置MCP 服务 JSON 与 Playwright 启动参数这一节是全文的核心操作部分。我会给出两个配置片段一个是 MCP 客户端里注册 Playwright 服务的 JSON另一个是模型接入的 settings 片段。路径和字段名我会写清楚你直接替换自己的值即可。先看 MCP 服务注册。以 Claude Desktop 为例配置文件在 macOS 下通常是~/Library/Application Support/Claude/claude_desktop_config.jsonWindows 下在%APPDATA%\Claude\claude_desktop_config.json。如果你用的是 Cline 或其它支持 MCP 的编辑器路径不同但结构一致。{ mcpServers: { playwright: { command: npx, args: [ -y, executeautomation/playwright-mcp-server ], env: { PLAYWRIGHT_BROWSERS_PATH: 0, TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_API_KEY: ${TAOTOKEN_API_KEY}, TAOTOKEN_MODEL_ID: your-model-id } } } }这里有几个点要说明。command用npx是为了免去全局安装-y表示自动确认。executeautomation/playwright-mcp-server是社区维护的 Playwright MCP 服务包如果你用的是其它实现包名要相应替换。PLAYWRIGHT_BROWSERS_PATH设为0表示使用项目本地安装的浏览器避免和系统全局版本冲突。env里的三个变量是我建议加的。TAOTOKEN_BASE_URL固定填https://taotoken.net/apiTAOTOKEN_API_KEY用环境变量引用不要写明文。TAOTOKEN_MODEL_ID填你在模型对话页面选好的那个 ID。注意MCP 服务本身不一定直接读这三个变量它们更多是给配套的模型调用层用的如果你的 MCP 客户端把模型配置和 MCP 配置分开那就把这三个值填到模型配置那边。再看模型接入的 settings 片段。如果你用的是支持 OpenAI 兼容接口的客户端配置通常长这样{ model: { provider: openai-compatible, baseUrl: https://taotoken.net/api, apiKey: ${TAOTOKEN_API_KEY}, modelId: your-model-id, temperature: 0.2 } }temperature我建议设低一点0.2 左右。因为网页交互任务需要确定性模型每次决策要稳定温度太高会导致同一个页面它这次点“提交”、下次点“取消”。这个参数在复杂表单场景里影响很大。如果你用的是 Codex 类的auth.json结构字段名可能是base_url和api_key注意下划线风格。Cline 的 MCP 配置则是在设置界面里填 Base URL、Key、Model ID 三件套填完后它会自动写入配置文件。无论哪种核心三件套不变Base URL 是https://taotoken.net/apiKey 是你的 TaoToken KeyModel ID 是你选的模型。配置写完后重启 MCP 客户端。重启后在工具列表里应该能看到playwright相关的工具比如playwright_navigate、playwright_click、playwright_evaluate。如果看不到先检查 JSON 语法再检查npx是否能正常拉包。4. 验证请求用 JS 脚本驱动一次多步骤表单交互配置就绪后我们来跑一个真实任务。我设计了一个场景打开一个带动态渲染的注册表单页填写用户名和邮箱勾选服务条款点击提交然后读取提交后的提示文本。这个场景覆盖了输入、点击、条件判断和结果读取能验证 MCP-Playwright 的完整链路。先给出一段可复制的 JS 交互脚本。这段脚本不是直接跑在 Node 里而是作为 MCP 工具调用的参数传给 Playwright 服务。不同 MCP 客户端的调用方式不同但核心是playwright_evaluate或playwright_run_code这类工具。async function fillAndSubmit(page) { await page.goto(https://example.com/signup, { waitUntil: networkidle }); await page.waitForSelector(#username, { state: visible }); await page.fill(#username, mcp_test_user); await page.waitForSelector(#email, { state: visible }); await page.fill(#email, mcp_testexample.com); const agreeBox await page.$(#agree-terms); if (agreeBox) { const checked await agreeBox.isChecked(); if (!checked) { await agreeBox.check(); } } await page.click(#submit-btn); await page.waitForSelector(.result-message, { timeout: 10000 }); const message await page.textContent(.result-message); return message; }这段脚本的关键点在于等待策略。waitUntil: networkidle表示等网络空闲再继续适合动态渲染页面。waitForSelector带state: visible比单纯等元素存在更稳因为有些元素在 DOM 里但被隐藏。条件分支那段先判断复选框是否存在再判断是否已勾选避免重复勾选导致取消。最后用waitForSelector等结果元素出现再读文本。在 MCP 客户端里你可以用自然语言让模型调用这段逻辑。比如输入“用 playwright 打开注册页填写用户名 mcp_test_user 和邮箱 mcp_testexample.com勾选条款后提交告诉我结果提示是什么。”模型会把它拆成多个工具调用navigate、fill、check、click、evaluate。你可以在客户端的工具调用日志里看到每一步。成功的结果长这样模型返回“提交成功提示文本为注册已受理请查收邮件。”同时你可以在 Playwright 的截图工具里看到页面截图。如果模型返回的是“找不到 #submit-btn”那说明选择器不对或页面没加载完进入下一节排障。这里我试过一个坑有些页面的提交按钮是button但被一层div包裹click会点到外层。解决办法是用page.click(#submit-btn, { force: true })强制点击或者先scrollIntoViewIfNeeded。这个细节在复杂页面里很常见。5. 常见报错排查401、local proxy failed、reading choices 与 OAuth这一节我按真实遇到的报错来写每个都给出定位思路和修复动作。401 Unauthorized。这个最常见说明 API Key 不对或没传。先检查环境变量TAOTOKEN_API_KEY是否真的被 MCP 客户端读到了。有些客户端不展开${}语法那就得用客户端自己的密钥管理功能。再检查 Base URL 是否写成了https://taotoken.net/api/带尾斜杠某些 SDK 对尾斜杠敏感。最后确认 Key 没有过期或被删除。修复后重启客户端再跑一次最小请求只让模型调用一次playwright_navigate打开空白页看是否还报 401。local proxy failed。这个报错通常出现在 MCP 服务启动阶段意思是本地代理或端口绑定失败。Playwright MCP 服务默认会起一个本地通信通道如果端口被占用就会失败。解决办法是换端口或者在配置里加--port参数指定一个空闲端口。另外如果你本机装了会拦截流量的安全软件也可能导致本地回环通信失败临时关闭后重试。注意这里说的是本地回环不是任何外部网络配置。reading choices 报错。这个一般出现在模型返回结构解析阶段提示读取choices字段失败。原因是模型接口返回的 JSON 结构和客户端预期不一致。检查你的 Base URL 是否指向了正确的兼容端点。TaoToken 的 API 地址是https://taotoken.net/api如果你用的是 OpenAI SDK可能需要在代码里把base_url设为https://taotoken.net/api/v1。具体以接入文档 https://taotoken.net/doc 为准。修复后模型对话应该能正常返回内容。OAuth 相关报错。如果你在 MCP 客户端里配置了需要 OAuth 的模型提供方但实际用的是 API Key 模式就会报 OAuth 失败。解决办法是把认证方式从 OAuth 切换为 API Key填 TaoToken 的 Key。有些客户端在切换后需要清空缓存重新登录记得做这一步。除了这四个还有一个高频问题模型能调用工具但点不中元素。这通常不是报错而是任务失败。排查方法是让模型先执行playwright_screenshot截图你看截图里元素的实际位置和选择器是否匹配。如果页面有 iframe选择器要加上 frame 定位。如果是动态 ID改用文本选择器或data-testid。排障时建议用最小复现法先只做 navigate再做单个 fill逐步加步骤。这样能快速定位是哪一步断了。另外把 MCP 客户端的日志级别调到 debug能看到每次工具调用的入参和返回非常有用。6. 从验证到落地把 MCP-Playwright 接入你的自动化流程跑通单次任务后下一步是把它变成可复用的流程。我的做法是把常用的交互步骤封装成几个 JS 函数每个函数对应一个业务动作比如login(page, user, pass)、searchOrder(page, orderId)、exportList(page)。然后在 MCP 客户端里用自然语言组合调用。这样模型不需要每次从零生成选择器出错率会低很多。如果你要做的是长期运行的 Agent建议关注 Coding Plan https://taotoken.net/coding-plan 它在高频调用场景下额度更划算。同时把 API Key 的管理做成轮换机制避免单 Key 泄露影响全部任务。模型对话页面 https://taotoken.net/model-chat 可以随时用来测试新模型对交互指令的理解程度换模型前先在那里跑一遍你的核心脚本。还有一个实用技巧给每个关键步骤加超时和重试。Playwright 的waitForSelector默认 30 秒复杂页面可以调到 60 秒。重试逻辑写在 JS 里比如点击后等结果如果 5 秒没出现就再点一次。这些细节能让你的自动化流程在真实网络环境下稳定很多。最后别忘了截图留痕。每次任务结束让模型调一次playwright_screenshot把截图存到本地按时间戳命名。出问题时回看截图比翻日志快得多。这套组合我用下来处理多步骤表单和条件分支任务的效率比手写脚本高不少尤其是页面结构频繁变动的场景改选择器的工作量小了很多。