browser-devtools-mcp-vscode
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseBrowser DevTools MCP VSCode Extension
Browser DevTools MCP VSCode Extension
Overview
概述
Browser DevTools MCP for VS Code & Cursor is a Playwright-powered browser automation extension that integrates the server into your IDE via the Model Context Protocol (MCP). It enables AI assistants like GitHub Copilot and Cursor AI to interact with real web browsers for testing, debugging, and automation tasks.
browser-devtools-mcpKey capabilities:
- Browser automation (navigation, clicks, form filling)
- Screenshots and visual testing
- Accessibility audits and ARIA tree inspection
- Core Web Vitals measurement (LCP, INP, CLS, TTFB, FCP)
- Network inspection and request mocking
- React DevTools integration
- OpenTelemetry distributed tracing
- Figma design comparison
- Non-blocking debugging (tracepoints, logpoints, watch expressions)
- Batch execution via JavaScript
适用于VS Code与Cursor的Browser DevTools MCP是一款基于Playwright的浏览器自动化扩展,它通过Model Context Protocol(MCP)将服务器集成到你的IDE中。它支持GitHub Copilot和Cursor AI等AI助手与真实网页浏览器交互,完成测试、调试和自动化任务。
browser-devtools-mcp核心功能:
- 浏览器自动化(导航、点击、表单填充)
- 截图与可视化测试
- 可访问性审计与ARIA树检查
- Core Web Vitals指标测量(LCP、INP、CLS、TTFB、FCP)
- 网络检查与请求模拟
- React DevTools集成
- OpenTelemetry分布式追踪
- Figma设计对比
- 非阻塞调试(追踪点、日志点、监视表达式)
- JavaScript批量执行
Installation
安装
From Open VSX Registry
从Open VSX注册表安装
bash
undefinedbash
undefinedVS Code
VS Code
code --install-extension serkan-ozal.browser-devtools-mcp-vscode
code --install-extension serkan-ozal.browser-devtools-mcp-vscode
Cursor
Cursor
cursor --install-extension serkan-ozal.browser-devtools-mcp-vscode
undefinedcursor --install-extension serkan-ozal.browser-devtools-mcp-vscode
undefinedFrom VSIX File
从VSIX文件安装
bash
undefinedbash
undefinedVS Code
VS Code
code --install-extension browser-devtools-mcp-vscode-x.x.x.vsix
code --install-extension browser-devtools-mcp-vscode-x.x.x.vsix
Cursor
Cursor
cursor --install-extension browser-devtools-mcp-vscode-x.x.x.vsix
undefinedcursor --install-extension browser-devtools-mcp-vscode-x.x.x.vsix
undefinedFirst-Time Setup
首次设置
On first activation, the extension downloads Playwright browsers (default: Chromium). To customize:
- Open Command Palette (/
Ctrl+Shift+P)Cmd+Shift+P - Run: Browser DevTools MCP: Install Playwright Browsers...
- Select browsers: Chromium (default), Firefox, and/or WebKit
Alternatively, configure in Settings:
- (default:
browserDevtoolsMcp.install.chromium)true - (default:
browserDevtoolsMcp.install.firefox)false - (default:
browserDevtoolsMcp.install.webkit)false
首次激活时,扩展会下载Playwright浏览器(默认:Chromium)。如需自定义:
- 打开命令面板(/
Ctrl+Shift+P)Cmd+Shift+P - 运行:Browser DevTools MCP: Install Playwright Browsers...
- 选择浏览器:Chromium(默认)、Firefox和/或WebKit
也可在设置中配置:
- (默认:
browserDevtoolsMcp.install.chromium)true - (默认:
browserDevtoolsMcp.install.firefox)false - (默认:
browserDevtoolsMcp.install.webkit)false
Configuration
配置
Quick Settings Panel
快速设置面板
Open the Browser DevTools MCP panel in the Explorer sidebar for common settings.
在资源管理器侧边栏打开Browser DevTools MCP面板,进行常用设置。
Full Settings
完整设置
Open VS Code Settings ( / ) and search for "Browser DevTools MCP" or run:
Ctrl+,Cmd+,Browser DevTools MCP: Open Settings打开VS Code设置( / ),搜索"Browser DevTools MCP",或运行:
Ctrl+,Cmd+,Browser DevTools MCP: Open SettingsKey Settings
核心设置
General
常规
json
{
"browserDevtoolsMcp.enable": true,
"browserDevtoolsMcp.telemetry.enable": true,
"browserDevtoolsMcp.platform": "browser" // "browser" or "node"
}json
{
"browserDevtoolsMcp.enable": true,
"browserDevtoolsMcp.telemetry.enable": true,
"browserDevtoolsMcp.platform": "browser" // "browser" 或 "node"
}Browser Configuration
浏览器配置
json
{
"browserDevtoolsMcp.browser.headless": true,
"browserDevtoolsMcp.browser.persistent": false,
"browserDevtoolsMcp.browser.userDataDir": "",
"browserDevtoolsMcp.browser.useSystemBrowser": false,
"browserDevtoolsMcp.browser.executablePath": "",
"browserDevtoolsMcp.browser.locale": "en-US"
}json
{
"browserDevtoolsMcp.browser.headless": true,
"browserDevtoolsMcp.browser.persistent": false,
"browserDevtoolsMcp.browser.userDataDir": "",
"browserDevtoolsMcp.browser.useSystemBrowser": false,
"browserDevtoolsMcp.browser.executablePath": "",
"browserDevtoolsMcp.browser.locale": "en-US"
}CDP (Chrome DevTools Protocol) Mode
CDP(Chrome DevTools Protocol)模式
json
{
"browserDevtoolsMcp.browser.cdp.enable": false,
"browserDevtoolsMcp.browser.cdp.endpointUrl": "" // e.g., "http://localhost:9222"
}json
{
"browserDevtoolsMcp.browser.cdp.enable": false,
"browserDevtoolsMcp.browser.cdp.endpointUrl": "" // 例如:"http://localhost:9222"
}Network & Security
网络与安全
json
{
"browserDevtoolsMcp.network.proxy": "", // e.g., "http://proxy.example.com:8080"
"browserDevtoolsMcp.network.bypassProxy": "",
"browserDevtoolsMcp.network.ignoreHTTPSErrors": false
}json
{
"browserDevtoolsMcp.network.proxy": "", // 例如:"http://proxy.example.com:8080"
"browserDevtoolsMcp.network.bypassProxy": "",
"browserDevtoolsMcp.network.ignoreHTTPSErrors": false
}Debugging
调试
json
{
"browserDevtoolsMcp.debug.enable": false,
"browserDevtoolsMcp.debug.screenshots": false,
"browserDevtoolsMcp.debug.traces": false,
"browserDevtoolsMcp.debug.videos": false,
"browserDevtoolsMcp.debug.outputDir": ""
}json
{
"browserDevtoolsMcp.debug.enable": false,
"browserDevtoolsMcp.debug.screenshots": false,
"browserDevtoolsMcp.debug.traces": false,
"browserDevtoolsMcp.debug.videos": false,
"browserDevtoolsMcp.debug.outputDir": ""
}OpenTelemetry
OpenTelemetry
json
{
"browserDevtoolsMcp.otel.enable": false,
"browserDevtoolsMcp.otel.exporterUrl": "", // e.g., "http://localhost:4318/v1/traces"
"browserDevtoolsMcp.otel.serviceName": "browser-devtools-mcp",
"browserDevtoolsMcp.otel.propagationHeaderName": "traceparent"
}json
{
"browserDevtoolsMcp.otel.enable": false,
"browserDevtoolsMcp.otel.exporterUrl": "", // 例如:"http://localhost:4318/v1/traces"
"browserDevtoolsMcp.otel.serviceName": "browser-devtools-mcp",
"browserDevtoolsMcp.otel.propagationHeaderName": "traceparent"
}Using with AI Assistants
与AI助手配合使用
In Cursor
在Cursor中
The extension automatically registers the MCP server via Cursor's native MCP API. AI assistants can directly invoke browser automation tools.
Example prompts:
"Navigate to example.com and take a screenshot"
"Run accessibility audit on the current page"
"Measure Core Web Vitals for https://example.com"
"Click the submit button and capture network requests"
"Mock the /api/users endpoint to return test data"扩展会通过Cursor原生MCP API自动注册MCP服务器。AI助手可直接调用浏览器自动化工具。
示例提示:
"导航至example.com并截取截图"
"对当前页面运行可访问性审计"
"测量https://example.com的Core Web Vitals指标"
"点击提交按钮并捕获网络请求"
"模拟/api/users接口返回测试数据"In VS Code (1.96+)
在VS Code(1.96+)中
The extension registers via . GitHub Copilot can use the MCP tools.
vscode.lm.registerMcpServerDefinitionProvider扩展通过进行注册。GitHub Copilot可使用MCP工具。
vscode.lm.registerMcpServerDefinitionProviderMCP Tools Reference
MCP工具参考
Navigation & Interaction
导航与交互
navigate
navigate
typescript
// Navigate to URL
{
"url": "https://example.com",
"waitUntil": "networkidle" // "load" | "domcontentloaded" | "networkidle"
}typescript
// 导航至URL
{
"url": "https://example.com",
"waitUntil": "networkidle" // "load" | "domcontentloaded" | "networkidle"
}click
click
typescript
// Click element by selector
{
"selector": "button.submit",
"timeout": 30000
}typescript
// 通过选择器点击元素
{
"selector": "button.submit",
"timeout": 30000
}fill
fill
typescript
// Fill form input
{
"selector": "input[name='email']",
"value": "test@example.com"
}typescript
// 填充表单输入框
{
"selector": "input[name='email']",
"value": "test@example.com"
}type
type
typescript
// Type text with keyboard simulation
{
"selector": "textarea",
"text": "Hello world",
"delay": 100 // ms between keystrokes
}typescript
// 模拟键盘输入文本
{
"selector": "textarea",
"text": "Hello world",
"delay": 100 // 按键间隔(毫秒)
}select
select
typescript
// Select dropdown option
{
"selector": "select[name='country']",
"values": ["US"]
}typescript
// 选择下拉选项
{
"selector": "select[name='country']",
"values": ["US"]
}Inspection & Testing
检查与测试
screenshot
screenshot
typescript
// Capture screenshot
{
"fullPage": true,
"selector": null, // or specific element selector
"path": "/tmp/screenshot.png" // optional
}typescript
// 捕获截图
{
"fullPage": true,
"selector": null, // 或指定元素选择器
"path": "/tmp/screenshot.png" // 可选
}accessibility_snapshot
accessibility_snapshot
typescript
// Get accessibility tree
{
"selector": "main" // optional, default entire page
}typescript
// 获取可访问性树
{
"selector": "main" // 可选,默认整个页面
}accessibility_audit
accessibility_audit
typescript
// Run accessibility audit
{
"includeWarnings": true,
"selector": null
}typescript
// 运行可访问性审计
{
"includeWarnings": true,
"selector": null
}web_vitals
web_vitals
typescript
// Measure Core Web Vitals
{
"url": "https://example.com"
}typescript
// 测量Core Web Vitals指标
{
"url": "https://example.com"
}Network
网络
network_requests
network_requests
typescript
// Get network request log
{
"filter": {
"url": "/api/*",
"method": "GET",
"status": 200
}
}typescript
// 获取网络请求日志
{
"filter": {
"url": "/api/*",
"method": "GET",
"status": 200
}
}mock_route
mock_route
typescript
// Mock API endpoint
{
"pattern": "**/api/users",
"response": {
"status": 200,
"body": { "users": [{"id": 1, "name": "Test User"}] },
"headers": { "Content-Type": "application/json" }
}
}typescript
// 模拟API接口
{
"pattern": "**/api/users",
"response": {
"status": 200,
"body": { "users": [{"id": 1, "name": "Test User"}] },
"headers": { "Content-Type": "application/json" }
}
}unmock_route
unmock_route
typescript
// Remove mock
{
"pattern": "**/api/users"
}typescript
// 移除模拟
{
"pattern": "**/api/users"
}React DevTools
React DevTools
react_inspect_element
react_inspect_element
typescript
// Inspect React component
{
"selector": "div.App"
}typescript
// 检查React组件
{
"selector": "div.App"
}react_get_component_tree
react_get_component_tree
typescript
// Get full component tree
{}typescript
// 获取完整组件树
{}Debugging
调试
set_tracepoint
set_tracepoint
typescript
// Non-blocking breakpoint with logging
{
"source": "app.js",
"line": 42,
"condition": "user.id === 123",
"logMessage": "User: {user.name}"
}typescript
// 带日志的非阻塞断点
{
"source": "app.js",
"line": 42,
"condition": "user.id === 123",
"logMessage": "User: {user.name}"
}set_logpoint
set_logpoint
typescript
// Inject console.log
{
"source": "utils.js",
"line": 15,
"message": "Value: {myVariable}"
}typescript
// 注入console.log
{
"source": "utils.js",
"line": 15,
"message": "Value: {myVariable}"
}watch_expression
watch_expression
typescript
// Watch expression value
{
"expression": "this.state.count",
"source": "Counter.jsx"
}typescript
// 监视表达式值
{
"expression": "this.state.count",
"source": "Counter.jsx"
}Batch Execution
批量执行
execute
execute
typescript
// Execute multiple operations
{
"code": `
// Navigate
await callTool('navigate', { url: 'https://example.com' });
// Fill form
await page.fill('input[name="search"]', 'test query');
// Click and wait
await page.click('button[type="submit"]');
await page.waitForLoadState('networkidle');
// Capture screenshot
const screenshot = await callTool('screenshot', { fullPage: true });
return { screenshot };
`
}typescript
// 执行多个操作
{
"code": `
// 导航
await callTool('navigate', { url: 'https://example.com' });
// 填充表单
await page.fill('input[name="search"]', 'test query');
// 点击并等待
await page.click('button[type="submit"]');
await page.waitForLoadState('networkidle');
// 捕获截图
const screenshot = await callTool('screenshot', { fullPage: true });
return { screenshot };
`
}Common Patterns
常见模式
Automated Testing Workflow
自动化测试工作流
typescript
// AI prompt: "Test the login flow and capture results"
// 1. Navigate to login page
await callTool('navigate', { url: 'https://app.example.com/login' });
// 2. Fill credentials (use environment variables)
await callTool('fill', {
selector: 'input[name="username"]',
value: process.env.TEST_USERNAME
});
await callTool('fill', {
selector: 'input[name="password"]',
value: process.env.TEST_PASSWORD
});
// 3. Submit form
await callTool('click', { selector: 'button[type="submit"]' });
// 4. Wait for navigation
await callTool('wait', { selector: '.dashboard', timeout: 5000 });
// 5. Capture evidence
const screenshot = await callTool('screenshot', { fullPage: true });
// 6. Run accessibility audit
const audit = await callTool('accessibility_audit', {});typescript
// AI提示:"测试登录流程并捕获结果"
// 1. 导航至登录页面
await callTool('navigate', { url: 'https://app.example.com/login' });
// 2. 填充凭据(使用环境变量)
await callTool('fill', {
selector: 'input[name="username"]',
value: process.env.TEST_USERNAME
});
await callTool('fill', {
selector: 'input[name="password"]',
value: process.env.TEST_PASSWORD
});
// 3. 提交表单
await callTool('click', { selector: 'button[type="submit"]' });
// 4. 等待导航完成
await callTool('wait', { selector: '.dashboard', timeout: 5000 });
// 5. 捕获证据
const screenshot = await callTool('screenshot', { fullPage: true });
// 6. 运行可访问性审计
const audit = await callTool('accessibility_audit', {});Performance Testing
性能测试
typescript
// AI prompt: "Measure performance of the homepage"
const vitals = await callTool('web_vitals', {
url: 'https://example.com'
});
// vitals contains: LCP, INP, CLS, TTFB, FCP
console.log(`LCP: ${vitals.LCP}ms`);
console.log(`CLS: ${vitals.CLS}`);typescript
// AI提示:"测量首页性能"
const vitals = await callTool('web_vitals', {
url: 'https://example.com'
});
// vitals包含:LCP、INP、CLS、TTFB、FCP
console.log(`LCP: ${vitals.LCP}ms`);
console.log(`CLS: ${vitals.CLS}`);API Mocking for Frontend Tests
前端测试的API模拟
typescript
// AI prompt: "Mock the user API and test the profile page"
// 1. Set up mock
await callTool('mock_route', {
pattern: '**/api/user/profile',
response: {
status: 200,
body: {
id: 1,
name: 'Test User',
email: 'test@example.com'
}
}
});
// 2. Navigate and test
await callTool('navigate', { url: 'https://app.example.com/profile' });
// 3. Verify UI
await callTool('screenshot', { selector: '.profile-card' });
// 4. Clean up
await callTool('unmock_route', { pattern: '**/api/user/profile' });typescript
// AI提示:"模拟用户API并测试个人资料页面"
// 1. 设置模拟
await callTool('mock_route', {
pattern: '**/api/user/profile',
response: {
status: 200,
body: {
id: 1,
name: 'Test User',
email: 'test@example.com'
}
}
});
// 2. 导航并测试
await callTool('navigate', { url: 'https://app.example.com/profile' });
// 3. 验证UI
await callTool('screenshot', { selector: '.profile-card' });
// 4. 清理
await callTool('unmock_route', { pattern: '**/api/user/profile' });Debugging with Tracepoints
使用追踪点调试
typescript
// AI prompt: "Debug the checkout flow without stopping execution"
// Set tracepoint at critical function
await callTool('set_tracepoint', {
source: 'checkout.js',
line: 78,
condition: 'cart.total > 1000',
logMessage: 'High value cart: {cart.total}, items: {cart.items.length}'
});
// Watch state changes
await callTool('watch_expression', {
expression: 'this.state.checkoutStep',
source: 'CheckoutComponent.jsx'
});
// Execute checkout flow
await callTool('navigate', { url: 'https://shop.example.com/checkout' });
// ... interact with pagetypescript
// AI提示:"无需停止执行即可调试结账流程"
// 在关键函数处设置追踪点
await callTool('set_tracepoint', {
source: 'checkout.js',
line: 78,
condition: 'cart.total > 1000',
logMessage: '高价值购物车:{cart.total},商品数量:{cart.items.length}'
});
// 监视状态变化
await callTool('watch_expression', {
expression: 'this.state.checkoutStep',
source: 'CheckoutComponent.jsx'
});
// 执行结账流程
await callTool('navigate', { url: 'https://shop.example.com/checkout' });
// ... 与页面交互React Component Inspection
React组件检查
typescript
// AI prompt: "Inspect the React component structure of the dashboard"
// Get full component tree
const tree = await callTool('react_get_component_tree', {});
// Inspect specific component
const component = await callTool('react_inspect_element', {
selector: 'div[data-testid="dashboard"]'
});
// component contains: props, state, hooks, childrentypescript
// AI提示:"检查仪表盘的React组件结构"
// 获取完整组件树
const tree = await callTool('react_get_component_tree', {});
// 检查特定组件
const component = await callTool('react_inspect_element', {
selector: 'div[data-testid="dashboard"]'
});
// component包含:props、state、hooks、子组件Network Monitoring & Analysis
网络监控与分析
typescript
// AI prompt: "Monitor API calls during user signup"
// Navigate to signup
await callTool('navigate', { url: 'https://app.example.com/signup' });
// Fill and submit form
await callTool('fill', { selector: 'input[name="email"]', value: 'test@example.com' });
await callTool('click', { selector: 'button.signup' });
// Get network requests
const requests = await callTool('network_requests', {
filter: {
url: '/api/*',
method: 'POST'
}
});
// Analyze response times and status codes
requests.forEach(req => {
console.log(`${req.method} ${req.url}: ${req.status} (${req.duration}ms)`);
});typescript
// AI提示:"监控用户注册过程中的API调用"
// 导航至注册页面
await callTool('navigate', { url: 'https://app.example.com/signup' });
// 填充并提交表单
await callTool('fill', { selector: 'input[name="email"]', value: 'test@example.com' });
await callTool('click', { selector: 'button.signup' });
// 获取网络请求
const requests = await callTool('network_requests', {
filter: {
url: '/api/*',
method: 'POST'
}
});
// 分析响应时间和状态码
requests.forEach(req => {
console.log(`${req.method} ${req.url}: ${req.status} (${req.duration}ms)`);
});Batch Execution for Complex Workflows
复杂工作流的批量执行
typescript
// AI prompt: "Run complete E2E test with multiple assertions"
const result = await callTool('execute', {
code: `
// Navigate to app
await callTool('navigate', { url: 'https://app.example.com' });
// Check accessibility
const audit = await callTool('accessibility_audit', { includeWarnings: false });
if (audit.violations.length > 0) {
throw new Error('Accessibility violations found');
}
// Measure performance
const vitals = await callTool('web_vitals', { url: 'https://app.example.com' });
if (vitals.LCP > 2500) {
console.warn('LCP exceeds threshold');
}
// Interact with UI
await page.click('button.start-tour');
await page.waitForSelector('.tour-step-1');
// Capture state
const screenshot = await callTool('screenshot', { fullPage: true });
return {
audit: audit.violations.length === 0,
performance: vitals,
screenshot
};
`
});typescript
// AI提示:"运行完整的端到端测试并包含多个断言"
const result = await callTool('execute', {
code: `
// 导航至应用
await callTool('navigate', { url: 'https://app.example.com' });
// 检查可访问性
const audit = await callTool('accessibility_audit', { includeWarnings: false });
if (audit.violations.length > 0) {
throw new Error('发现可访问性问题');
}
// 测量性能
const vitals = await callTool('web_vitals', { url: 'https://app.example.com' });
if (vitals.LCP > 2500) {
console.warn('LCP超过阈值');
}
// 与UI交互
await page.click('button.start-tour');
await page.waitForSelector('.tour-step-1');
// 捕获状态
const screenshot = await callTool('screenshot', { fullPage: true });
return {
audit: audit.violations.length === 0,
performance: vitals,
screenshot
};
`
});Troubleshooting
故障排除
Playwright Browser Download Fails
Playwright浏览器下载失败
Symptom: Extension shows error during activation about browser download.
Solutions:
-
Use system browser:json
{ "browserDevtoolsMcp.browser.useSystemBrowser": true } -
Set custom executable path:json
{ "browserDevtoolsMcp.browser.executablePath": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" } -
Skip download via environment variable:bash
export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 code # or cursor -
Configure proxy if behind firewall:json
{ "browserDevtoolsMcp.network.proxy": "http://proxy.company.com:8080" } -
Manually install browsers:bash
npx playwright install chromium
症状: 激活扩展时显示浏览器下载相关错误。
解决方案:
-
使用系统浏览器:json
{ "browserDevtoolsMcp.browser.useSystemBrowser": true } -
设置自定义可执行文件路径:json
{ "browserDevtoolsMcp.browser.executablePath": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" } -
通过环境变量跳过下载:bash
export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 code # 或 cursor -
在防火墙后配置代理:json
{ "browserDevtoolsMcp.network.proxy": "http://proxy.company.com:8080" } -
手动安装浏览器:bash
npx playwright install chromium
MCP Server Not Registering
MCP服务器未注册
Symptom: AI assistant cannot access browser automation tools.
Solutions:
-
Verify extension is enabled:json
{ "browserDevtoolsMcp.enable": true } -
Check MCP server status in Command Palette:
- Run: Browser DevTools MCP: Show Server Status
-
Restart MCP session:
- Run: Browser DevTools MCP: Restart Server
-
Check VS Code/Cursor version:
- VS Code: Requires 1.96+
- Cursor: Native MCP support required
症状: AI助手无法访问浏览器自动化工具。
解决方案:
-
验证扩展已启用:json
{ "browserDevtoolsMcp.enable": true } -
在命令面板中检查MCP服务器状态:
- 运行:Browser DevTools MCP: Show Server Status
-
重启MCP会话:
- 运行:Browser DevTools MCP: Restart Server
-
检查VS Code/Cursor版本:
- VS Code:需要1.96+
- Cursor:需要原生MCP支持
Headless Mode Issues
无头模式问题
Symptom: Browser automation fails in headless mode but works in headed mode.
Solution: Disable headless for debugging:
json
{
"browserDevtoolsMcp.browser.headless": false
}症状: 无头模式下浏览器自动化失败,但有头模式可正常工作。
解决方案: 禁用无头模式以调试:
json
{
"browserDevtoolsMcp.browser.headless": false
}Certificate Errors
证书错误
Symptom: HTTPS errors preventing navigation.
Solution:
json
{
"browserDevtoolsMcp.network.ignoreHTTPSErrors": true
}Warning: Only use for development/testing environments.
症状: HTTPS错误阻止导航。
解决方案:
json
{
"browserDevtoolsMcp.network.ignoreHTTPSErrors": true
}警告: 仅在开发/测试环境中使用。
Performance Issues
性能问题
Symptom: Slow browser operations or timeouts.
Solutions:
-
Enable persistent context:json
{ "browserDevtoolsMcp.browser.persistent": true, "browserDevtoolsMcp.browser.userDataDir": "/path/to/userdata" } -
Adjust timeouts in tool calls:typescript
await callTool('click', { selector: 'button', timeout: 60000 // 60 seconds }); -
Disable screenshots/videos:json
{ "browserDevtoolsMcp.debug.screenshots": false, "browserDevtoolsMcp.debug.videos": false }
症状: 浏览器操作缓慢或超时。
解决方案:
-
启用持久化上下文:json
{ "browserDevtoolsMcp.browser.persistent": true, "browserDevtoolsMcp.browser.userDataDir": "/path/to/userdata" } -
调整工具调用中的超时时间:typescript
await callTool('click', { selector: 'button', timeout: 60000 // 60秒 }); -
禁用截图/视频:json
{ "browserDevtoolsMcp.debug.screenshots": false, "browserDevtoolsMcp.debug.videos": false }
Telemetry Opt-Out
遥测数据退出
To disable telemetry:
-
Via settings:json
{ "browserDevtoolsMcp.telemetry.enable": false } -
Via environment variable:bash
export TELEMETRY_ENABLE=false -
Via config file: Edit:
~/.browser-devtools-mcp/config.jsonjson{ "telemetryEnabled": false }
禁用遥测数据:
-
通过设置:json
{ "browserDevtoolsMcp.telemetry.enable": false } -
通过环境变量:bash
export TELEMETRY_ENABLE=false -
通过配置文件: 编辑:
~/.browser-devtools-mcp/config.jsonjson{ "telemetryEnabled": false }
Advanced Configuration
高级配置
OpenTelemetry Distributed Tracing
OpenTelemetry分布式追踪
Enable tracing to monitor browser automation operations:
json
{
"browserDevtoolsMcp.otel.enable": true,
"browserDevtoolsMcp.otel.exporterUrl": "http://localhost:4318/v1/traces",
"browserDevtoolsMcp.otel.serviceName": "browser-automation",
"browserDevtoolsMcp.otel.propagationHeaderName": "traceparent"
}启用追踪以监控浏览器自动化操作:
json
{
"browserDevtoolsMcp.otel.enable": true,
"browserDevtoolsMcp.otel.exporterUrl": "http://localhost:4318/v1/traces",
"browserDevtoolsMcp.otel.serviceName": "browser-automation",
"browserDevtoolsMcp.otel.propagationHeaderName": "traceparent"
}Persistent Browser Context
持久化浏览器上下文
Maintain browser state across sessions:
json
{
"browserDevtoolsMcp.browser.persistent": true,
"browserDevtoolsMcp.browser.userDataDir": "${workspaceFolder}/.browser-data"
}跨会话保持浏览器状态:
json
{
"browserDevtoolsMcp.browser.persistent": true,
"browserDevtoolsMcp.browser.userDataDir": "${workspaceFolder}/.browser-data"
}CDP Attach Mode (Chromium Only)
CDP附加模式(仅Chromium)
Attach to existing browser instance:
json
{
"browserDevtoolsMcp.browser.cdp.enable": true,
"browserDevtoolsMcp.browser.cdp.endpointUrl": "http://localhost:9222"
}Start Chrome with remote debugging:
bash
google-chrome --remote-debugging-port=9222附加到现有浏览器实例:
json
{
"browserDevtoolsMcp.browser.cdp.enable": true,
"browserDevtoolsMcp.browser.cdp.endpointUrl": "http://localhost:9222"
}启动带远程调试的Chrome:
bash
google-chrome --remote-debugging-port=9222Custom Locale
自定义区域设置
Test internationalization:
json
{
"browserDevtoolsMcp.browser.locale": "tr-TR"
}测试国际化:
json
{
"browserDevtoolsMcp.browser.locale": "tr-TR"
}Best Practices
最佳实践
-
Use environment variables for secrets:typescript
await callTool('fill', { selector: 'input[name="apiKey"]', value: process.env.API_KEY }); -
Enable debugging output for troubleshooting:json
{ "browserDevtoolsMcp.debug.enable": true, "browserDevtoolsMcp.debug.outputDir": "${workspaceFolder}/debug-output" } -
Use batch execution for performance:
- Group related operations in tool
execute - Access Playwright object directly for complex interactions
page
- Group related operations in
-
Mock external dependencies:
- Use to isolate frontend tests
mock_route - Mock slow/unreliable APIs for consistent testing
- Use
-
Leverage accessibility snapshots:
- Test keyboard navigation and screen reader compatibility
- Validate ARIA attributes and semantic HTML
-
Monitor performance continuously:
- Set up web vitals baselines
- Alert on regressions in LCP, CLS, or INP
-
使用环境变量存储敏感信息:typescript
await callTool('fill', { selector: 'input[name="apiKey"]', value: process.env.API_KEY }); -
启用调试输出以排查问题:json
{ "browserDevtoolsMcp.debug.enable": true, "browserDevtoolsMcp.debug.outputDir": "${workspaceFolder}/debug-output" } -
使用批量执行提升性能:
- 将相关操作分组到工具中
execute - 直接访问Playwright 对象进行复杂交互
page
- 将相关操作分组到
-
模拟外部依赖:
- 使用隔离前端测试
mock_route - 模拟缓慢/不可靠的API以确保测试一致性
- 使用
-
利用可访问性快照:
- 测试键盘导航和屏幕阅读器兼容性
- 验证ARIA属性和语义化HTML
-
持续监控性能:
- 建立Core Web Vitals基准
- 当LCP、CLS或INP出现退化时发出警报