const { chromium } = require('playwright'); const fs = require('fs'); // All routes to test const routes = [ // Basic routes { path: '/login', name: 'Login Page', requiresAuth: false }, { path: '/', name: 'Home (redirect)', requiresAuth: true }, { path: '/home', name: 'Dashboard', requiresAuth: true }, { path: '/message/message_page', name: 'Message Center', requiresAuth: true }, // Telegram Account Management (10 routes) { path: '/tgAccountManage/tgAccountList', name: 'TG Account List', requiresAuth: true }, { path: '/tgAccountManage/telegramWeb', name: 'Telegram Web', requiresAuth: true }, { path: '/tgAccountManage/telegramChat', name: 'Telegram Chat', requiresAuth: true }, { path: '/tgAccountManage/telegramWebFull', name: 'Telegram Web Full', requiresAuth: true }, { path: '/tgAccountManage/telegramGuide', name: 'Telegram Guide', requiresAuth: true }, { path: '/tgAccountManage/telegramQuickAccess', name: 'Telegram Quick Access', requiresAuth: true }, { path: '/tgAccountManage/registerPhone', name: 'Register Phone', requiresAuth: true }, { path: '/tgAccountManage/autoRegister', name: 'Auto Register', requiresAuth: true }, { path: '/tgAccountManage/accountUsageList', name: 'Account Usage List', requiresAuth: true }, { path: '/pullMemberTask/pullMemberTaskList', name: 'Pull Member Task List', requiresAuth: true }, // Group Management (4 routes) { path: '/groupManage/groupList', name: 'Group List', requiresAuth: true }, { path: '/groupManage/groupMemberList', name: 'Group Member List', requiresAuth: true }, { path: '/groupManage/groupSet', name: 'Group Settings', requiresAuth: true }, { path: '/groupListenerManage/groupListenerList', name: 'Group Listener List', requiresAuth: true }, // Message Management (3 routes) { path: '/messageManage/messageList', name: 'Message List', requiresAuth: true }, { path: '/messageManage/messageSet', name: 'Message Settings', requiresAuth: true }, { path: '/exchangeManage/exchangeList', name: 'Exchange List', requiresAuth: true }, // Script Management (5 routes) { path: '/scriptManage/scriptList', name: 'Script List', requiresAuth: true }, { path: '/scriptManage/scriptProject', name: 'Script Project', requiresAuth: true }, { path: '/scriptTaskManage/scriptTaskList', name: 'Script Task List', requiresAuth: true }, { path: '/taskManage/groupTaskList', name: 'Group Task List', requiresAuth: true }, { path: '/taskManage/groupTaskWsLog', name: 'Group Task WS Log', requiresAuth: true }, // SMS Platform (7 routes) { path: '/sms_platform/sms_platform_list', name: 'SMS Platform List', requiresAuth: true }, { path: '/sms_platform/sms_dashboard', name: 'SMS Dashboard', requiresAuth: true }, { path: '/sms_platform/sms_records', name: 'SMS Records', requiresAuth: true }, { path: '/sms_platform/sms_statistics', name: 'SMS Statistics', requiresAuth: true }, { path: '/sms_platform/sms_price_compare', name: 'SMS Price Compare', requiresAuth: true }, { path: '/sms_platform/sms_quick_actions', name: 'SMS Quick Actions', requiresAuth: true }, { path: '/sms_platform/balanceAlert', name: 'Balance Alert', requiresAuth: true }, // Configuration Management (7 routes) { path: '/configManage/baseConfig', name: 'Base Config', requiresAuth: true }, { path: '/configManage/dcList', name: 'DC List', requiresAuth: true }, { path: '/configManage/paramConfig', name: 'Param Config', requiresAuth: true }, { path: '/nameManage/firstnameList', name: 'First Name List', requiresAuth: true }, { path: '/nameManage/lastnameList', name: 'Last Name List', requiresAuth: true }, { path: '/apiData/list', name: 'API Data List', requiresAuth: true }, { path: '/adminManage/modifyPwd', name: 'Modify Password', requiresAuth: true }, // Log Management (10 routes) { path: '/logManage/groupJoinLog', name: 'Group Join Log', requiresAuth: true }, { path: '/logManage/groupSendLog', name: 'Group Send Log', requiresAuth: true }, { path: '/logManage/loginLog', name: 'Login Log', requiresAuth: true }, { path: '/logManage/pullMemberLog', name: 'Pull Member Log', requiresAuth: true }, { path: '/logManage/pullMemberProjectStatistic', name: 'Pull Member Project Stats', requiresAuth: true }, { path: '/logManage/pullMemberStatistic', name: 'Pull Member Stats', requiresAuth: true }, { path: '/logManage/registerLog', name: 'Register Log', requiresAuth: true }, { path: '/logManage/tgLoginCodeLog', name: 'TG Login Code Log', requiresAuth: true }, { path: '/logManage/tgRegisterLog', name: 'TG Register Log', requiresAuth: true }, { path: '/error_logger/error_logger_page', name: 'Error Logger Page', requiresAuth: true }, // Error Pages (3 routes) { path: '/401', name: '401 Error Page', requiresAuth: false }, { path: '/404', name: '404 Error Page', requiresAuth: false }, { path: '/500', name: '500 Error Page', requiresAuth: false }, // Component Examples (11 routes) { path: '/components/tree_select_page', name: 'Tree Select', requiresAuth: true }, { path: '/components/count_to_page', name: 'Count To', requiresAuth: true }, { path: '/components/drag_list_page', name: 'Drag List', requiresAuth: true }, { path: '/components/drag_drawer_page', name: 'Drag Drawer', requiresAuth: true }, { path: '/components/org_tree_page', name: 'Org Tree', requiresAuth: true }, { path: '/components/tree_table_page', name: 'Tree Table', requiresAuth: true }, { path: '/components/cropper_page', name: 'Cropper', requiresAuth: true }, { path: '/components/tables_page', name: 'Tables', requiresAuth: true }, { path: '/components/split_pane_page', name: 'Split Pane', requiresAuth: true }, { path: '/components/editor_page', name: 'Editor', requiresAuth: true }, { path: '/components/icons_page', name: 'Icons', requiresAuth: true }, // Additional Features (11 routes) { path: '/update/update_table_page', name: 'Upload CSV', requiresAuth: true }, { path: '/update/update_paste_page', name: 'Paste Table Data', requiresAuth: true }, { path: '/excel/upload-excel', name: 'Upload Excel', requiresAuth: true }, { path: '/excel/export-excel', name: 'Export Excel', requiresAuth: true }, { path: '/tools_methods/tools_methods_page', name: 'Tools Methods', requiresAuth: true }, { path: '/i18n/i18n_page', name: 'i18n Page', requiresAuth: true }, { path: '/error_store/error_store_page', name: 'Error Store', requiresAuth: true }, { path: '/directive/directive_page', name: 'Directive', requiresAuth: true }, { path: '/multilevel/level_2_1', name: 'Multilevel 2-1', requiresAuth: true }, { path: '/multilevel/level_2_2/level_2_2_1', name: 'Multilevel 2-2-1', requiresAuth: true }, { path: '/multilevel/level_2_2/level_2_2_2', name: 'Multilevel 2-2-2', requiresAuth: true }, { path: '/multilevel/level_2_3', name: 'Multilevel 2-3', requiresAuth: true }, { path: '/argu/params/test123', name: 'Dynamic Route - Params', requiresAuth: true }, { path: '/argu/query?id=test123', name: 'Dynamic Route - Query', requiresAuth: true } ]; // Test results const testResults = []; async function testAllRoutes() { const browser = await chromium.launch({ headless: false, slowMo: 50 }); const context = await browser.newContext({ viewport: { width: 1920, height: 1080 } }); const page = await context.newPage(); // Enable console logging page.on('console', msg => { if (msg.type() === 'error') { console.error(`Console error: ${msg.text()}`); } }); page.on('pageerror', error => { console.error(`Page error: ${error.message}`); }); const baseUrl = 'http://localhost:8890'; console.log('Starting route testing...\n'); // First, test login console.log('Testing login functionality...'); try { await page.goto(`${baseUrl}/login`, { waitUntil: 'networkidle' }); // Check if login page loads await page.waitForSelector('form', { timeout: 5000 }); // Try to login with test credentials // Adjust selectors based on your login form structure const usernameInput = await page.locator('input[placeholder*="用户名"], input[placeholder*="username"], input[type="text"]').first(); const passwordInput = await page.locator('input[placeholder*="密码"], input[placeholder*="password"], input[type="password"]').first(); await usernameInput.fill('admin'); await passwordInput.fill('111111'); const submitButton = await page.locator('button[type="submit"], button:has-text("登录"), button:has-text("Login")').first(); await submitButton.click(); // Wait for navigation after login await page.waitForNavigation({ waitUntil: 'networkidle' }); // Check if we're redirected to home const currentUrl = page.url(); if (currentUrl.includes('/home')) { console.log('✅ Login successful!'); testResults.push({ path: '/login', name: 'Login', status: 'success', message: 'Login functionality working' }); } else { console.log('❌ Login failed!'); testResults.push({ path: '/login', name: 'Login', status: 'failed', message: 'Login failed - not redirected to home' }); } } catch (error) { console.error('❌ Login test failed:', error.message); testResults.push({ path: '/login', name: 'Login', status: 'error', message: error.message }); } // Test all other routes for (const route of routes) { if (route.path === '/login') continue; // Already tested console.log(`\nTesting: ${route.name} (${route.path})`); try { const response = await page.goto(`${baseUrl}${route.path}`, { waitUntil: 'networkidle', timeout: 30000 }); // Check response status const status = response.status(); // Wait a bit for Vue to render await page.waitForTimeout(1000); // Check for common error indicators const hasErrorPage = await page.$('.error-page') !== null; const has404 = await page.locator('text=/404/i').count() > 0; const has500 = await page.locator('text=/500/i').count() > 0; const hasConsoleErrors = await page.evaluate(() => { return window.__consoleErrors && window.__consoleErrors.length > 0; }); // Take screenshot for visual verification await page.screenshot({ path: `screenshots/route_${route.path.replace(/\//g, '_')}.png`, fullPage: true }); if (status === 200 && !hasErrorPage && !has404 && !has500) { console.log(`✅ ${route.name} - Success`); testResults.push({ path: route.path, name: route.name, status: 'success', httpStatus: status, hasConsoleErrors }); } else { console.log(`❌ ${route.name} - Failed (Status: ${status})`); testResults.push({ path: route.path, name: route.name, status: 'failed', httpStatus: status, hasErrorPage, has404, has500, hasConsoleErrors }); } } catch (error) { console.error(`❌ ${route.name} - Error: ${error.message}`); testResults.push({ path: route.path, name: route.name, status: 'error', message: error.message }); } } // Generate test report const report = { testDate: new Date().toISOString(), totalRoutes: routes.length, results: testResults, summary: { success: testResults.filter(r => r.status === 'success').length, failed: testResults.filter(r => r.status === 'failed').length, error: testResults.filter(r => r.status === 'error').length } }; // Save report fs.writeFileSync('route-test-report.json', JSON.stringify(report, null, 2)); console.log('\n========== TEST SUMMARY =========='); console.log(`Total Routes Tested: ${report.totalRoutes}`); console.log(`✅ Success: ${report.summary.success}`); console.log(`❌ Failed: ${report.summary.failed}`); console.log(`⚠️ Error: ${report.summary.error}`); console.log('==================================\n'); // Print failed routes const failedRoutes = testResults.filter(r => r.status !== 'success'); if (failedRoutes.length > 0) { console.log('Failed Routes:'); failedRoutes.forEach(route => { console.log(`- ${route.name} (${route.path}): ${route.message || 'Failed'}`); }); } await browser.close(); } // Create screenshots directory if (!fs.existsSync('screenshots')) { fs.mkdirSync('screenshots'); } // Inject console error tracking const setupScript = ` window.__consoleErrors = []; const originalError = console.error; console.error = function(...args) { window.__consoleErrors.push(args.join(' ')); originalError.apply(console, args); }; `; // Run the tests testAllRoutes().catch(console.error);