/** * ERP 登录调试脚本 * * 用途:人工调试 ERP 登录流程,定位主界面特征元素 * 使用方式: * 1. 修改下方的 ERP_CONFIG 配置(URL、用户名、密码) * 2. 运行:npx ts-node src/main/tools/erp-login-debug.ts * 3. 登录后会自动暂停,打开 Playwright Inspector 进行元素定位 * 4. 在 Inspector 中点击主界面元素,获取选择器 * 5. 将找到的元素选择器添加到 locators.ts * * 调试模式说明: * - headless: false - 显示浏览器窗口 * - slowMo: 100 - 放慢操作速度便于观察 * - debugger 语句会暂停执行,打开开发者工具 */ import { chromium } from 'playwright' import path from 'path' // ==================== 配置区域 ==================== const ERP_CONFIG = { url: 'https://68.11.34.30:8082/', // ← 修改为你的 ERP 地址 username: 'BLDpengqiangqiang', // ← 修改为你的用户名 password: 'Cqbld123456.' // ← 修改为你的密码 } // 调试配置 const DEBUG_CONFIG = { headless: false, // 必须为 false,需要看到浏览器 slowMo: 100, // 操作间隔(毫秒) timeout: 60000 // 超时时间(毫秒) } // ================================================ async function debugErpLogin(): Promise { console.log('='.repeat(60)) console.log('ERP 登录调试工具') console.log('='.repeat(60)) console.log('目标 URL:', ERP_CONFIG.url) console.log('用户名:', ERP_CONFIG.username) console.log('密码:', '***'.repeat(ERP_CONFIG.password.length)) console.log('='.repeat(60)) console.log() console.log('操作步骤:') console.log('1. 浏览器将自动打开并尝试登录') console.log('2. 如果登录失败,请检查配置或手动重试') console.log('3. 登录成功后,会自动暂停并打开开发者工具') console.log('4. 使用元素选择器定位主界面特征元素') console.log('5. 记录元素选择器,按 Ctrl+C 退出脚本') console.log() console.log('按 Enter 键开始...') // 等待用户确认 await new Promise((resolve) => { process.stdin.resume() process.stdin.once('data', () => { process.stdin.pause() resolve() }) }) let browser: any = null let context: any = null let page: any = null try { console.log('\n正在启动浏览器...') // 启动浏览器(带调试配置) browser = await chromium.launch({ headless: DEBUG_CONFIG.headless, slowMo: DEBUG_CONFIG.slowMo, args: ['--ignore-certificate-errors', '--ignore-ssl-errors', '--disable-web-security'] }) context = await browser.newContext({ acceptDownloads: true, viewport: { width: 1920, height: 1080 }, ignoreHTTPSErrors: true, javaScriptEnabled: true }) page = await context.newPage() // 启用详细的控制台日志 page.on('console', (msg: any) => { console.log(`[Page Console] ${msg.type()}: ${msg.text()}`) }) page.on('pageerror', (error: any) => { console.error(`[Page Error] ${error.message}`) }) // 导航到登录页面 const loginUrl = `${ERP_CONFIG.url}/yonbip/resources/uap/rbac/login/main/index.html` console.log(`正在加载登录页面:${loginUrl}`) await page.goto(loginUrl, { timeout: DEBUG_CONFIG.timeout }) await page.waitForLoadState('domcontentloaded') console.log('登录页面已加载') // 等待并定位登录表单 iframe console.log('等待登录表单...') await page.waitForSelector('#forwardFrame', { state: 'attached', timeout: 15000 }) const frameLocator = page.locator('#forwardFrame') const contentFrame = await frameLocator.contentFrame() if (!contentFrame) { throw new Error('无法访问 forwardFrame 内容框架') } const mainFrame = contentFrame console.log('登录表单框架已就绪') // 填充用户名 console.log('正在输入用户名...') try { const usernameInput = mainFrame.getByRole('textbox', { name: '用户名' }) await usernameInput.waitFor({ state: 'visible', timeout: 5000 }) await usernameInput.fill(ERP_CONFIG.username) console.log('用户名已输入') } catch (e: any) { console.error('找不到用户名输入框:', e.message) throw new Error('找不到用户名输入框,请检查页面结构是否改变') } // 填充密码 console.log('正在输入密码...') try { const passwordInput = mainFrame.getByRole('textbox', { name: '密码' }) await passwordInput.waitFor({ state: 'visible', timeout: 5000 }) await passwordInput.fill(ERP_CONFIG.password) console.log('密码已输入') } catch (e: any) { console.error('找不到密码输入框:', e.message) throw new Error('找不到密码输入框,请检查页面结构是否改变') } await page.pause() // 点击登录按钮 console.log('正在点击登录按钮...') try { const loginButton = mainFrame.getByRole('button', { name: '登录' }) await loginButton.waitFor({ state: 'visible', timeout: 5000 }) await loginButton.click() console.log('已点击登录按钮') } catch (e: any) { console.error('找不到登录按钮:', e.message) throw new Error('找不到登录按钮,请检查页面结构是否改变') } // 等待页面加载 console.log('等待登录响应...') await page.waitForLoadState('domcontentloaded', { timeout: 10000 }) await page.waitForTimeout(2000) // 额外等待,确保页面完全加载 // 处理强制登录确认对话框 try { const confirmBtn = mainFrame.getByRole('button', { name: '确定' }) const count = await confirmBtn.count() if (count > 0) { console.log('检测到强制登录确认对话框,正在确认...') await confirmBtn.first().click() await page.waitForTimeout(2000) console.log('已确认强制登录') } else { console.log('普通登录,无需确认') } } catch { console.log('未检测到确认对话框') } // ==================== 登录成功,进入调试模式 ==================== console.log() console.log('='.repeat(60)) console.log('✓ 登录成功!') console.log('='.repeat(60)) console.log() console.log('现在进入调试模式,请进行以下操作:') console.log() console.log('1. 按 F12 打开浏览器开发者工具') console.log('2. 使用元素选择器 (Ctrl+Shift+C) 点击主界面特征元素') console.log('3. 在 Elements 面板中右键元素 → Copy → Copy selector') console.log('4. 或者使用 Playwright Inspector:') console.log(' - 在控制台输入: await page.pause()') console.log(' - 使用 Inspector 的元素选择工具') console.log() console.log('建议定位的特征元素:') console.log('- 主界面顶部导航栏') console.log('- 侧边菜单栏') console.log('- 主内容区域的唯一标识') console.log('- 用户信息显示区域') console.log('- 任何登录后独有的界面元素') console.log() console.log('按 Ctrl+C 退出脚本') console.log('='.repeat(60)) // 保持浏览器打开,等待用户调试 // 使用 pause 可以让用户手动恢复或使用 Inspector await page.pause() } catch (error: any) { console.error() console.error('='.repeat(60)) console.error('错误:', error.message) console.error('='.repeat(60)) console.error() console.error('调试提示:') console.error('1. 检查 ERP_CONFIG 配置是否正确') console.error('2. 检查网络连接') console.error('3. 确认 ERP 系统可访问') console.error('4. 如果是元素找不到,可能需要更新 locators.ts') } finally { // 清理资源(给用户时间保存信息) console.log() console.log('等待 5 秒后关闭浏览器...') await new Promise((resolve) => setTimeout(resolve, 5000)) if (context) { await context.close() } if (browser) { await browser.close() } console.log('浏览器已关闭') process.exit(0) } } // 运行调试脚本 debugErpLogin().catch((err) => { console.error('脚本执行失败:', err) process.exit(1) })