const { chromium } = require('@playwright/test'); const LongiMainPage = require('../tests/pages/LongiMainPage'); const LongiLoginPage = require('../tests/pages/LongiLoginPage'); const menuDataService = require('../services/MenuDataService'); class TestController { constructor() { // 从环境变量获取配置 this.batchSize = parseInt(process.env.TEST_BATCH_SIZE || '5', 10); this.retryCount = parseInt(process.env.TEST_RETRY_COUNT || '3', 10); this.batchInterval = parseInt(process.env.TEST_BATCH_INTERVAL || '2000', 10); // 浏览器配置 this.browserConfig = { headless: false, // 使用有头模式 args: ['--start-maximized'], // 最大化窗口 slowMo: 50 // 放慢操作速度,便于观察 }; console.log('测试配置:', { batchSize: this.batchSize, retryCount: this.retryCount, batchInterval: this.batchInterval }); } /** * 执行登录操作 * @param {import('@playwright/test').Page} page - Playwright页面对象 * @returns {Promise} 登录是否成功 */ async performLogin(page) { const loginPage = new LongiLoginPage(page); // 导航到登录页面 await loginPage.navigateToLoginPage(); // 点击登录按钮 const loginSuccess = await loginPage.clickLoginButton(); if (!loginSuccess) { console.error('登录失败'); return false; } console.log('登录成功'); return true; } /** * 收集菜单数据 * @returns {Promise} - 处理后的菜单数据 */ async collectMenuData() { console.log('开始收集菜单数据...'); const browser = await chromium.launch(this.browserConfig); const page = await browser.newPage(); // 设置视窗大小 await page.setViewportSize({ width: 1920, height: 1080 }); const mainPage = new LongiMainPage(page); try { // 使用 LongiLoginPage 处理登录 const loginSuccess = await this.performLogin(page); if (!loginSuccess) { throw new Error('登录失败,无法收集菜单数据'); } console.log('登录成功,正在获取菜单项...'); const menuItems = await mainPage.checkAndLoadMenuItems(); console.log(`成功获取 ${menuItems.length} 个菜单项`); return menuDataService.saveMenuData(menuItems); } finally { await browser.close(); } } /** * 执行一批菜单的测试 * @param {Array} menuBatch - 要测试的菜单数组 */ async runBatchTest(menuBatch) { console.log(`开始执行批次测试,包含 ${menuBatch.length} 个菜单项:`); console.log(menuBatch.map(m => m.text).join(', ')); const browser = await chromium.launch(this.browserConfig); const page = await browser.newPage(); // 设置视窗大小 await page.setViewportSize({ width: 1920, height: 1080 }); const mainPage = new LongiMainPage(page); try { // 使用 LongiLoginPage 处理登录 const loginSuccess = await this.performLogin(page); if (!loginSuccess) { throw new Error('登录失败,无法执行菜单测试'); } console.log('登录成功,开始测试菜单项...'); // 使用 handleAllMenuClicks 方法处理所有菜单 await mainPage.handleAllMenuClicks(menuBatch); // 更新进度 const progress = menuDataService.getProgress(); const newProgress = [...progress]; for (const menuItem of menuBatch) { if (!newProgress.includes(menuItem.id)) { newProgress.push(menuItem.id); } } menuDataService.saveProgress(newProgress); } finally { await browser.close(); } } /** * 获取下一批要测试的菜单 * @returns {Array|null} - 下一批要测试的菜单,如果没有则返回null */ getNextBatch() { const menuData = menuDataService.getMenuData(); const progress = menuDataService.getProgress(); if (!menuData) return null; // 过滤出未测试的菜单 const remainingMenus = menuData.filter(menu => !progress.includes(menu.id)); if (remainingMenus.length === 0) return null; // 返回下一批要测试的菜单 return remainingMenus.slice(0, this.batchSize); } /** * 获取测试进度信息 * @returns {Object} - 进度信息 */ getTestProgress() { const menuData = menuDataService.getMenuData(); const progress = menuDataService.getProgress(); if (!menuData) { return { total: 0, completed: 0, remaining: 0 }; } return { total: menuData.length, completed: progress.length, remaining: menuData.length - progress.length }; } } module.exports = TestController;