Skip to main content
Glama
Leviathangk

Playwright MCP Server

by Leviathangk
test-debug-baidu.js6.03 kB
/** * 调试百度页面结构 * 查看"百度一下"按钮的实际 HTML 结构 */ import { Client } from '@modelcontextprotocol/sdk/client/index.js'; import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'; class DebugTest { constructor() { this.client = null; this.transport = null; } async connect() { console.log('🔌 连接到 MCP 服务器...\n'); this.transport = new StdioClientTransport({ command: 'node', args: [ 'build/index.js', '--browser', 'chromium', // '--executable-path', 'D:\\Download\\chrome-win\\chrome-win\\chrome.exe', '--headless', 'false' ] }); this.client = new Client({ name: 'debug-test', version: '1.0.0' }, { capabilities: {} }); await this.client.connect(this.transport); console.log('✅ 已连接\n'); } async callTool(name, args = {}) { const response = await this.client.callTool({ name, arguments: args }); if (response.isError) { console.log('❌ 错误:', response.content[0].text); return null; } return JSON.parse(response.content[0].text); } async close() { await this.client.close(); } } async function main() { const test = new DebugTest(); try { await test.connect(); // 1. 创建会话 console.log('📝 创建浏览器会话...'); const session = await test.callTool('browser_create_session'); const sessionId = session.sessionId; console.log(`✅ 会话 ID: ${sessionId}\n`); // 2. 访问百度 console.log('🌐 访问百度...'); await test.callTool('browser_navigate', { sessionId: sessionId, url: 'https://www.baidu.com', waitUntil: 'networkidle' }); console.log('✅ 页面加载完成\n'); // 3. 获取所有可交互元素 console.log('🔍 获取页面所有可交互元素...\n'); const structure = await test.callTool('browser_get_page_structure', { sessionId: sessionId, maxElements: 1000, // 增加限制 includeHidden: true // 包括隐藏元素 }); if (structure && structure.elements) { console.log(`找到 ${structure.totalFound} 个可交互元素\n`); // 查找包含"百度"的元素 const baiduElements = structure.elements.filter(el => el.text && el.text.includes('百度') ); console.log('=' .repeat(80)); console.log(`包含"百度"的元素(共 ${baiduElements.length} 个):`); console.log('=' .repeat(80) + '\n'); baiduElements.forEach((el, index) => { console.log(`${index + 1}. 文本: "${el.text}"`); console.log(` 标签: ${el.tag}`); console.log(` 选择器: ${el.selector}`); console.log(` 可见: ${el.visible ? '是' : '否'}`); console.log(` 可点击: ${el.clickable ? '是' : '否'}`); if (el.attributes) { console.log(` 属性:`, el.attributes); } console.log(''); }); // 查找所有 button 和 input const buttons = structure.elements.filter(el => el.tag === 'button' || el.tag === 'input' ); console.log('=' .repeat(80)); console.log(`所有按钮和输入框(共 ${buttons.length} 个):`); console.log('=' .repeat(80) + '\n'); buttons.forEach((el, index) => { console.log(`${index + 1}. 文本: "${el.text || '(无文本)'}"`); console.log(` 标签: ${el.tag}`); console.log(` 选择器: ${el.selector}`); console.log(` 可见: ${el.visible ? '是' : '否'}`); if (el.attributes) { console.log(` 属性:`, el.attributes); } console.log(''); }); // 特别查找 id 包含 submit 或 su 的元素 const submitElements = structure.elements.filter(el => el.selector && (el.selector.includes('submit') || el.selector.includes('#su')) ); if (submitElements.length > 0) { console.log('=' .repeat(80)); console.log(`ID 包含 submit/su 的元素(共 ${submitElements.length} 个):`); console.log('=' .repeat(80) + '\n'); submitElements.forEach((el, index) => { console.log(`${index + 1}. 文本: "${el.text || '(无文本)'}"`); console.log(` 标签: ${el.tag}`); console.log(` 选择器: ${el.selector}`); console.log(` 可见: ${el.visible ? '是' : '否'}`); console.log(''); }); } } // 4. 测试 find_element_by_text console.log('=' .repeat(80)); console.log('测试 find_element_by_text:'); console.log('=' .repeat(80) + '\n'); const tests = [ { text: '百度一下', type: 'any' }, { text: '百度', type: 'any' }, { text: '一下', type: 'any' }, { text: '百度一下', type: 'button' }, ]; for (const testCase of tests) { console.log(`查找: "${testCase.text}" (类型: ${testCase.type})`); const result = await test.callTool('browser_find_element_by_text', { sessionId: sessionId, text: testCase.text, elementType: testCase.type }); if (result && result.found) { console.log(`✅ 找到: ${result.tag} - "${result.text}"`); console.log(` 选择器: ${result.selector}\n`); } else { console.log(`❌ 未找到\n`); } } // 5. 等待观察 console.log('⏳ 等待 5 秒后关闭...\n'); await new Promise(resolve => setTimeout(resolve, 5000)); // 6. 关闭会话 console.log('🔒 关闭会话...'); await test.callTool('browser_close_session', { sessionId: sessionId }); console.log('✅ 测试完成!\n'); } catch (error) { console.error('❌ 测试失败:', error.message); console.error(error.stack); } finally { await test.close(); } } console.log('🎯 开始调试百度页面\n'); main().catch(error => { console.error('❌ 致命错误:', error); process.exit(1); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Leviathangk/PlaywrightMCPForCrawler'

If you have feedback or need assistance with the MCP directory API, please join our Discord server