playwright/controllers/TestController.js
2025-03-07 09:42:48 +08:00

160 lines
5.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;