160 lines
5.2 KiB
JavaScript
160 lines
5.2 KiB
JavaScript
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<boolean>} 登录是否成功
|
||
*/
|
||
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<Array>} - 处理后的菜单数据
|
||
*/
|
||
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;
|