如题,AI收集整理,作为了解
Playwright MCP 使用指南
概述
什么是 Playwright MCP
Playwright MCP(Model Context Protocol)是微软开源的一个基于模型上下文协议的服务器,它在大语言模型(LLM)和 Playwright 浏览器自动化框架之间架起了一座桥梁。
核心特性
✅ 轻量高效
✅ LLM 友好
-
纯结构化数据交互,无需视觉模型
-
降低集成复杂度
-
确定性操作,结果可预测
✅ 多模式支持
-
持久化配置文件:存储登录状态等数据
-
隔离模式:每次会话独立,关闭后状态清空
✅ 强大的自动化能力
应用场景
| 场景 |
描述 |
效率提升 |
| 自动化测试 |
自然语言生成测试用例,自动执行 |
95% |
| 数据抓取 |
智能网页数据提取,反爬规避 |
90% |
| 办公自动化 |
表单填充、报告生成等重复任务 |
95% |
| AI 助手 |
让 AI 具备网页操作能力 |
80% |
环境准备
系统要求
基础环境
-
Node.js: v16+ 或 Python 3.8+
-
操作系统: Windows 10+, macOS 10.15+, Ubuntu 18.04+
-
内存: 建议 4GB 以上
-
磁盘空间: 至少 2GB(包含浏览器安装)
客户端支持
以下 AI 客户端支持 Playwright MCP:
网络要求
-
稳定的网络连接
-
部分场景可能需要代理(如访问海外网站)
安装配置
1. 安装 Playwright MCP 服务器
使用 npm 安装(推荐)
1 2 3 4 5
| # 全局安装Playwright MCP npm install -g @playwright/mcp@latest
# 验证安装 npx @playwright/mcp --version
|
使用 yarn 安装
1 2
| # 使用yarn安装 yarn global add @playwright/mcp@latest
|
2. 安装浏览器驱动
1 2 3 4 5
| # 安装Playwright所需的浏览器 npx playwright install
# 或者指定安装特定浏览器 npx playwright install chromium firefox webkit
|
3. 客户端配置
Cursor IDE 配置(推荐)
-
打开 Cursor IDE
-
进入设置(Settings)
-
找到 MCP 配置(MCP Settings)
-
添加以下配置:
1 2 3 4 5 6 7 8
| { "mcpServers": { "playwright": { "command": "npx", "args": ["@playwright/mcp@latest"] } } }
|
VS Code 配置
-
安装 Playwright 扩展
-
创建.vscode/launch.json文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| { "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Playwright MCP", "program": "${workspaceFolder}/node_modules/@playwright/mcp/dist/cli.js", "args": ["--port", "8931"], "console": "integratedTerminal", "sourceMaps": true } ] }
|
4. 启动服务器
基础启动
1 2 3 4 5 6 7 8
| # 启动MCP服务器(默认配置) npx @playwright/mcp
# 指定端口启动 npx @playwright/mcp --port 8931
# 启用SSE传输(推荐) npx @playwright/mcp --port 8931 --sse
|
配置文件启动
创建mcp.config.json配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| { "browser": { "browserName": "chromium", "launchOptions": { "headless": true, "args": ["--no-sandbox"] } }, "server": { "port": 8931, "host": "localhost" }, "capabilities": ["core", "tabs", "pdf", "history"], "outputDir": "./output" }
|
启动时指定配置文件:
1
| npx @playwright/mcp --config mcp.config.json
|
5. 验证安装
启动成功后,您应该看到类似以下输出:
1 2 3 4
| Playwright MCP Server v1.2.3 Listening on http://localhost:8931 Capabilities: core, tabs, pdf, history Browser: chromium (headless)
|
基础使用
启动会话
通过命令行启动
1 2 3 4 5
| # 启动交互式会话 npx @playwright/mcp --interactive
# 启动无头模式 npx @playwright/mcp --headless
|
通过客户端启动
在支持 MCP 的 AI 客户端中:
-
确保 MCP 服务器已启动
-
在客户端中启用 MCP 功能
-
开始使用自然语言指令
基本操作示例
示例 1:简单网页导航
指令:
1
| 请访问百度首页,搜索"Playwright教程",然后返回搜索结果的前5条标题
|
执行过程:
-
AI 调用browser_navigate导航到百度
-
调用browser_type在搜索框输入关键词
-
调用browser_click点击搜索按钮
-
调用browser_snapshot获取页面快照
-
AI 解析快照,提取结果并整理
示例 2:数据提取
指令:
1
| 请访问GitHub Trending页面,获取今天最热门的5个Python项目的名称和星数
|
执行过程:
-
导航到 GitHub Trending
-
选择 Python 语言筛选
-
提取项目信息
-
格式化输出为表格
会话管理
持久化会话
1 2 3 4 5
| # 启动持久化会话 npx @playwright/mcp --persist --user-data-dir ./session-data
# 恢复会话 npx @playwright/mcp --user-data-dir ./session-data
|
隔离会话
1 2
| # 启动隔离会话(每次启动都是新的环境) npx @playwright/mcp --isolated
|
核心工具详解
工具分类
Playwright MCP 提供了五大类工具,覆盖 Web 自动化全流程需求:
| 类别 |
工具数量 |
主要功能 |
| 基础操作 |
8 个 |
点击、输入、拖拽等基本交互 |
| 导航操作 |
3 个 |
页面跳转、前进后退 |
| 资源操作 |
4 个 |
截图、PDF、网络监控 |
| 实用工具 |
3 个 |
浏览器管理、窗口控制 |
| 标签页管理 |
4 个 |
多标签页操作 |
核心工具详细说明
1. 页面快照工具
browser_snapshot
功能:捕获当前页面的可访问性快照
参数:无
返回值:YAML 格式的可访问性树结构
使用示例:
1 2 3 4
| { "name": "browser_snapshot", "parameters": {} }
|
返回示例:
1 2 3 4 5 6 7 8
| - Page URL: https://example.com - Page Title: 示例页面 - Page Snapshot: - generic (active) (ref=e1): 页面内容区域 - heading "登录表单" (ref=e2) - textbox "用户名" (ref=e3) - textbox "密码" (ref=e4) - button "登录" (ref=e5)
|
2. 导航工具
browser_navigate
功能:导航到指定 URL
参数:
使用示例:
1 2 3 4 5 6
| { "name": "browser_navigate", "parameters": { "url": "https://www.baidu.com" } }
|
browser_navigate_back
功能:返回上一页
参数:无
3. 元素交互工具
browser_click
功能:点击页面元素
参数:
使用示例:
1 2 3 4 5 6 7 8
| { "name": "browser_click", "parameters": { "element": "搜索按钮", "ref": "e5", "doubleClick": false } }
|
browser_type
功能:向可编辑元素输入文本
参数:
-
element: 元素描述
-
ref: 元素引用 ID
-
text: 输入文本
browser_select_option
功能:选择下拉选项
参数:
-
element: 下拉框描述
-
ref: 下拉框引用 ID
-
values: 要选择的值数组
4. 资源操作工具
browser_take_screenshot
功能:捕获页面截图
参数:
-
raw: 是否返回无损 PNG(可选)
-
filename: 保存文件名(可选)
-
element: 元素描述(可选,局部截图)
browser_pdf_save
功能:将页面保存为 PDF
参数:
5. 网络监控工具
browser_network_requests
功能:获取网络请求记录
参数:无
browser_console_messages
功能:获取控制台消息
参数:无
工具调用流程
一个完整的自动化流程通常包括:
-
获取快照 → browser_snapshot
-
分析页面 → AI 解析快照内容
-
执行操作 → 调用相应的交互工具
-
验证结果 → 获取新快照验证操作效果
实战案例
案例 1:自动化测试生成
需求
为一个电影搜索应用生成自动化测试用例
实施步骤
Step 1: 环境准备
1 2 3 4
| # 创建测试项目 mkdir movie-test && cd movie-test npm init -y npm install @playwright/test
|
Step 2: 配置 Cursor MCP
在 Cursor 中配置 MCP 服务器,然后输入提示词:
1 2 3 4 5 6 7
| 你是一个Playwright测试生成器。 请访问 https://debs-obrien.github.io/playwright-movies-app 探索网站功能,然后生成完整的测试用例。 要求: 1. 使用基于角色的定位器 2. 包含适当的等待和断言 3. 覆盖主要功能点
|
Step 3: AI 探索与测试生成
AI 会自动:
-
访问网站
-
探索搜索功能、主题切换、分页等
-
发现潜在 bug(如搜索结果显示异常)
-
生成完整的测试代码
Step 4: 生成的测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| import { test, expect } from '@playwright/test';
test.describe('Movie Search Application', () => { test('Search for a movie by title', async ({ page }) => { // 访问应用 await page.goto('https://debs-obrien.github.io/playwright-movies-app'); // 验证首页加载 await expect(page.getByRole('heading', { level: 1 })).toHaveText('Movie Search'); // 点击搜索按钮 await page.getByRole('search').click(); // 输入搜索关键词 const searchTerm = 'Star Wars'; const searchInput = page.getByRole('textbox', { name: 'Search Input' }); await searchInput.fill(searchTerm); await searchInput.press('Enter'); // 验证搜索结果 await expect(page).toHaveTitle(`${searchTerm} - Search Results`); await expect(page.getByRole('heading', { level: 1 })).toHaveText(searchTerm); await expect(page.getByRole('list', { name: 'movies' })).toBeVisible(); // 点击第一个电影查看详情 const firstMovie = page.getByRole('list', { name: 'movies' }).getByRole('link').first(); const movieTitle = await firstMovie.getByRole('heading', { level: 2 }).textContent(); await firstMovie.click(); // 验证详情页 await expect(page.getByRole('heading', { level: 1 })).toHaveText(movieTitle || ''); }); });
|
案例 2:智能数据抓取
需求
从电商网站抓取商品信息并生成报告
实施步骤
Step 1: 编写抓取指令
1 2 3
| 请访问京东首页,搜索"笔记本电脑",筛选价格在5000-8000元之间的产品, 获取前10个商品的名称、价格、评分和销量信息, 最后生成一个Markdown格式的产品对比表格。
|
Step 2: AI 执行抓取
AI 会:
-
导航到京东首页
-
在搜索框输入关键词
-
设置价格筛选条件
-
提取商品信息
-
处理分页和动态加载
-
格式化输出结果
Step 3: 生成的报告示例
| 排名 |
商品名称 |
价格 |
评分 |
销量 |
| 1 |
MacBook Air M2 |
¥7,999 |
4.9 |
10 万 + |
| 2 |
ThinkPad X1 Carbon |
¥7,499 |
4.8 |
5 万 + |
| 3 |
Dell XPS 13 |
¥6,999 |
4.7 |
3 万 + |
案例 3:办公自动化
需求
自动登录企业 OA 系统,填写日报表单
实施步骤
Step 1: 配置持久化会话
1 2
| # 启动持久化会话 npx @playwright/mcp --persist --user-data-dir ./oa-session
|
Step 2: 编写自动化指令
1 2 3 4 5 6 7 8 9 10
| 请访问企业OA系统登录页面 https://oa.company.com/login 使用以下信息登录: 用户名:john.doe 密码:********** 登录后导航到日报填写页面, 填写今天的工作内容: - 完成项目A的需求分析 - 参加团队周会 - 修复生产环境bug 提交表单后确认提交成功。
|
Step 3: 执行自动化
AI 会:
-
保存登录状态(后续无需重复登录)
-
自动填写表单
-
处理验证码(如需要人工协助)
-
提交并验证结果
最佳实践
1. 指令编写最佳实践
✅ 清晰明确的指令
不佳示例:
优秀示例:
1 2
| 请在京东首页搜索框输入"智能手机",点击搜索按钮, 然后获取前5个商品名称和价格,整理成表格。
|
✅ 提供必要的上下文
1 2
| 请访问GitHub Trending页面,选择"本月的"Python项目, 获取前3个项目的信息。注意:需要处理分页加载。
|
✅ 分步执行复杂任务
1 2 3
| 我们分两步执行: 1. 首先访问https://example.com/login登录系统 2. 登录成功后导航到/dashboard页面,获取今日数据
|
2. 元素定位策略
✅ 优先使用可访问性快照
1 2 3 4
| { "name": "browser_snapshot", "parameters": {} }
|
✅ 使用稳定的元素描述
-
优先使用角色定位:“登录按钮”、“搜索框”
-
避免使用位置描述:“页面底部的按钮”
✅ 处理动态内容
1 2 3 4 5 6 7
| { "name": "browser_wait_for", "parameters": { "text": "加载完成", "time": 10 } }
|
3. 会话管理策略
持久化模式 vs 隔离模式
| 模式 |
适用场景 |
优点 |
缺点 |
| 持久化 |
需要保持登录状态的场景 |
无需重复登录 |
状态可能冲突 |
| 隔离模式 |
测试、数据抓取 |
环境干净 |
需要重复登录 |
会话管理代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| // 持久化会话配置 const persistConfig = { browser: { browserName: 'chromium', isolated: false, userDataDir: './persistent-session' } };
// 隔离会话配置 const isolatedConfig = { browser: { browserName: 'chromium', isolated: true } };
|
4. 错误处理最佳实践
✅ 重试机制
1 2 3 4 5 6 7 8 9 10 11
| async function clickWithRetry(element, retries = 3) { for (let i = 0; i < retries; i++) { try { await element.click(); return true; } catch (error) { if (i === retries - 1) throw error; await page.waitForTimeout(1000 * (i + 1)); } } }
|
✅ 超时设置
1 2 3 4 5 6 7
| { "name": "browser_wait_for", "parameters": { "text": "提交成功", "time": 15 } }
|
5. 安全最佳实践
✅ 敏感信息处理
-
避免在指令中明文包含密码
-
使用环境变量存储敏感信息
-
及时清理会话数据
✅ 权限控制
1 2 3 4 5 6
| { "network": { "allowedOrigins": ["https://trusted-domain.com"], "blockedOrigins": ["https://malicious-domain.com"] } }
|
性能优化
1. 浏览器实例池化
实现原理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class BrowserPool { constructor(size = 3) { this.pool = []; this.size = size; this.init(); }
async init() { // 预热浏览器实例 for (let i = 0; i < this.size; i++) { const browser = await playwright.chromium.launch(); this.pool.push(browser); } }
async acquire() { // 从池中获取实例 if (this.pool.length === 0) { await this.waitForAvailable(); } return this.pool.pop(); }
release(browser) { // 归还实例到池 this.pool.push(browser); } }
|
配置建议
-
池大小:3-5 个实例
-
定期重启:每 24 小时
-
内存监控:设置阈值自动重启
2. 并行执行优化
多会话并行
1 2 3 4 5 6 7 8 9 10
| // 同时处理多个任务 const tasks = [ { url: 'https://site1.com', action: 'extract' }, { url: 'https://site2.com', action: 'screenshot' } ];
// 并行执行 const results = await Promise.all( tasks.map(task => processTask(task)) );
|
浏览器上下文隔离
1 2 3 4 5 6 7 8 9 10 11 12 13
| // 为每个任务创建独立上下文 async function processTask(task) { const context = await browser.newContext(); const page = await context.newPage(); try { // 执行任务 return await executeTask(page, task); } finally { // 清理资源 await context.close(); } }
|
3. 网络优化
资源加载控制
1 2 3 4 5 6 7 8 9
| { "browser": { "contextOptions": { "javaScriptEnabled": true, "images": false, // 禁用图片加载 "videos": false // 禁用视频加载 } } }
|
缓存策略
1 2 3 4 5 6
| // 启用HTTP缓存 const context = await browser.newContext({ cache: { cacheStoragePath: './cache' } });
|
4. 内存管理
启动参数优化
1 2
| # 优化内存使用的启动参数 npx @playwright/mcp --browser-args="--disable-dev-shm-usage --single-process --disable-gpu"
|
资源清理
1 2 3 4 5 6 7
| // 定期清理不活跃会话 setInterval(async () => { const inactiveSessions = getInactiveSessions(); for (const session of inactiveSessions) { await session.cleanup(); } }, 3600000); // 每小时执行一次
|
5. 性能监控
关键指标监控
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class PerformanceMonitor { constructor() { this.metrics = { responseTime: [], memoryUsage: [], successRate: [] }; }
recordResponseTime(time) { this.metrics.responseTime.push(time); }
recordMemoryUsage(usage) { this.metrics.memoryUsage.push(usage); }
generateReport() { // 生成性能报告 return { avgResponseTime: this.calculateAverage(this.metrics.responseTime), maxMemoryUsage: Math.max(...this.metrics.memoryUsage), successRate: this.calculateSuccessRate() }; } }
|
常见问题
1. 安装问题
Q: 安装时出现权限错误
问题:
1
| Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
|
解决方案:
1 2 3 4 5 6 7 8 9 10 11 12
| # 方案1:使用sudo(不推荐) sudo npm install -g @playwright/mcp
# 方案2:修复npm权限 sudo chown -R $USER:$GROUP ~/.npm sudo chown -R $USER:$GROUP /usr/local/lib/node_modules
# 方案3:使用nvm管理Node.js版本 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash nvm install 18 nvm use 18 npm install -g @playwright/mcp
|
Q: 浏览器安装失败
问题:
1
| Failed to install browsers
|
解决方案:
1 2 3 4 5
| # 手动安装浏览器 npx playwright install --force
# 设置代理(如果需要) HTTPS_PROXY=http://proxy:port npx playwright install
|
2. 连接问题
Q: 客户端无法连接到 MCP 服务器
问题:
1
| Connection refused: connect
|
解决方案:
1 2 3 4 5 6 7 8
| # 1. 检查服务器是否正在运行 ps aux | grep playwright-mcp
# 2. 检查端口是否被占用 netstat -tlnp | grep 8931
# 3. 重启服务器 npx @playwright/mcp --port 8931
|
Q: 跨域访问被拒绝
问题:
1
| CORS policy: No 'Access-Control-Allow-Origin' header
|
解决方案:
1 2 3 4 5 6 7
| { "server": { "cors": { "allowedOrigins": ["*"] } } }
|
3. 执行问题
Q: 元素定位失败
问题:
1
| Element not found or not visible
|
解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| [ { "name": "browser_wait_for", "parameters": { "text": "登录", "time": 10 } }, { "name": "browser_snapshot", "parameters": {} }, { "name": "browser_click", "parameters": { "element": "登录按钮", "ref": "e5" } } ]
|
Q: 页面加载超时
问题:
1
| Timeout waiting for page to load
|
解决方案:
1 2 3 4 5 6 7
| { "browser": { "contextOptions": { "navigationTimeout": 30000 } } }
|
4. 性能问题
Q: 内存使用过高
问题:
浏览器进程占用大量内存
解决方案:
1 2 3 4 5 6 7
| # 1. 使用无头模式 npx @playwright/mcp --headless
# 2. 限制浏览器启动参数 npx @playwright/mcp --browser-args="--disable-dev-shm-usage --single-process"
# 3. 定期重启服务器
|
Q: 响应速度慢
问题:
AI 指令执行响应时间长
解决方案:
1 2 3 4 5 6 7 8
| { "browser": { "contextOptions": { "images": false, "javaScriptEnabled": true } } }
|
5. 安全问题
Q: 验证码处理
问题:
网站弹出验证码,AI 无法处理
解决方案:
-
人工干预:暂停自动化,人工输入验证码
-
第三方服务:集成验证码识别服务
-
会话复用:使用已登录的浏览器会话
Q: 反爬虫检测
问题:
IP 被网站封禁
解决方案:
1 2 3 4 5 6 7 8
| { "network": { "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", "proxy": { "server": "http://proxy-server:port" } } }
|
6. 兼容性问题
Q: 浏览器兼容性
问题:
某些功能在特定浏览器中不工作
解决方案:
1 2 3 4 5 6 7 8
| { "browser": { "browserName": "chromium", "launchOptions": { "channel": "chrome" } } }
|
Q: 页面渲染问题
问题:
动态内容无法正确加载
解决方案:
1 2 3 4 5 6 7
| { "name": "browser_wait_for", "parameters": { "text": "加载完成", "time": 15 } }
|
资源与参考
官方文档
Playwright MCP
MCP 协议
社区资源
学习资源
示例项目
工具与扩展
开发工具
第三方库
支持与反馈
获取帮助
报告问题
更新日志
最新版本
-
v1.2.3 (2025-10-15)
-
新增 PDF 生成功能
-
优化内存使用
-
修复 Chrome 120 兼容性问题
版本计划
-
v1.3.0 (预计 2025-11-30)
-
支持移动设备模拟
-
增强的网络监控
-
多语言支持