/** * 超管端 E2E 测试 - 完整流程集成测试 * * 本测试用例从登录开始,依次测试所有主要功能模块, * 模拟真实用户的使用流程。 */ import { test, expect } from '@playwright/test'; import { loginAsAdmin, waitForTable } from './helpers'; import { TEST_DATA, ADMIN_CONFIG } from './fixtures'; test.describe('超管端完整流程集成测试', () => { test('超管端全功能流程测试', async ({ page }) => { // ==================== 1. 登录 ==================== console.log('步骤 1: 登录系统'); await loginAsAdmin(page); console.log('✓ 登录成功'); // ==================== 2. 数据看板 ==================== console.log('步骤 2: 验证数据看板'); await expect(page).toHaveURL(new RegExp(`${ADMIN_CONFIG.dashboardPath}`)); // 验证统计卡片 await page.waitForSelector('.ant-statistic, [class*="statistic"]', { timeout: 10000 }); const tenantCard = page.getByText(/租户数 | 租户总数 | 机构数/).first(); await expect(tenantCard).toBeVisible(); console.log('✓ 数据看板验证通过'); // ==================== 3. 租户管理 ==================== console.log('步骤 3: 测试租户管理'); await page.goto('/admin/tenants'); await waitForTable(page); // 验证租户列表加载 const table = page.locator('table, .ant-table'); await expect(table).toBeVisible(); console.log('✓ 租户列表加载成功'); // 点击添加租户 const addTenantButton = page.getByText(/添加租户 | 新建租户/); if (await addTenantButton.isVisible()) { await addTenantButton.click(); await page.waitForTimeout(500); // 填写租户信息 const nameInput = page.locator('input[placeholder*="学校名称"]'); if (await nameInput.isVisible()) { await nameInput.fill(TEST_DATA.tenant.name); } const accountInput = page.locator('input[placeholder*="登录账号"]'); if (await accountInput.isVisible()) { await accountInput.fill(TEST_DATA.tenant.account); } // 关闭弹窗,不实际创建 const cancelButton = page.locator('.ant-modal button:has-text("取消")'); if (await cancelButton.isVisible()) { await cancelButton.click(); } console.log('✓ 租户创建流程测试完成'); } // ==================== 4. 课程包管理 ==================== console.log('步骤 4: 测试课程包管理'); await page.goto('/admin/courses'); await waitForTable(page); // 验证课程包列表加载 const courseTable = page.locator('table, .ant-table'); await expect(courseTable).toBeVisible(); console.log('✓ 课程包列表加载成功'); // 点击创建课程包 const createCourseButton = page.getByText(/新建课程包 | 创建课程包/); if (await createCourseButton.isVisible()) { await createCourseButton.click(); await page.waitForURL(/\/admin\/courses\/create/); // 验证步骤导航存在 await expect(page.locator('.ant-steps')).toBeVisible(); // 填写基本信息 const nameInput = page.locator('input[placeholder*="课程包名称"]'); if (await nameInput.isVisible()) { await nameInput.fill(TEST_DATA.course.name); } // 返回课程包列表 await page.goto('/admin/courses'); console.log('✓ 课程包创建流程测试完成'); } // ==================== 5. 套餐管理 ==================== console.log('步骤 5: 测试套餐管理'); await page.goto('/admin/packages'); await waitForTable(page); // 验证套餐列表加载 const packageTable = page.locator('table, .ant-table'); await expect(packageTable).toBeVisible(); console.log('✓ 套餐列表加载成功'); // ==================== 6. 主题字典 ==================== console.log('步骤 6: 测试主题管理'); await page.goto('/admin/themes'); await waitForTable(page); // 验证主题列表加载 const themeTable = page.locator('table, .ant-table'); await expect(themeTable).toBeVisible(); console.log('✓ 主题列表加载成功'); // ==================== 7. 资源库 ==================== console.log('步骤 7: 测试资源库管理'); await page.goto('/admin/resources'); await waitForTable(page); // 验证资源列表加载 const resourceTable = page.locator('table, .ant-table'); await expect(resourceTable).toBeVisible(); console.log('✓ 资源列表加载成功'); // ==================== 8. 系统设置 ==================== console.log('步骤 8: 测试系统设置'); await page.goto('/admin/settings'); await page.waitForTimeout(500); // 验证基本设置标签页 const basicTab = page.locator('.ant-tabs-tab:has-text("基本设置")'); await expect(basicTab).toBeVisible(); // 切换到安全设置标签页 const securityTab = page.locator('.ant-tabs-tab:has-text("安全设置")'); await securityTab.click(); await page.waitForTimeout(200); await expect(page.getByText('密码强度')).toBeVisible(); // 切换到通知设置标签页 const notificationTab = page.locator('.ant-tabs-tab:has-text("通知设置")'); await notificationTab.click(); await page.waitForTimeout(200); await expect(page.getByText('邮件通知')).toBeVisible(); // 切换到存储设置标签页 const storageTab = page.locator('.ant-tabs-tab:has-text("存储设置")'); await storageTab.click(); await page.waitForTimeout(200); await expect(page.getByText('存储类型')).toBeVisible(); console.log('✓ 系统设置验证通过'); // ==================== 9. 退出登录 ==================== console.log('步骤 9: 退出登录'); const logoutButton = page.getByRole('button', { name: /退出登录 | 退出 | logout/i }); if (await logoutButton.isVisible()) { await logoutButton.click(); } else { const userMenu = page.locator('.ant-dropdown-trigger').or(page.locator('[class*="user"]')); if (await userMenu.isVisible()) { await userMenu.click(); await page.waitForTimeout(200); const dropdownLogout = page.getByText(/退出登录 | 退出/); if (await dropdownLogout.isVisible()) { await dropdownLogout.click(); } } } // 等待跳转到登录页 await page.waitForURL('**/login*'); await expect(page).toHaveURL(/\/login/); // 验证 token 已清除 const tokenAfterLogout = await page.evaluate(() => localStorage.getItem('token')); expect(tokenAfterLogout).toBeFalsy(); console.log('✓ 退出登录成功'); console.log('======================'); console.log('✓ 完整流程测试通过!'); console.log('======================'); }); });