/** * 超管端 E2E 测试 - 套餐管理 */ import { test, expect } from '@playwright/test'; import { loginAsAdmin, waitForTable, waitForSuccess, waitForModal } from './helpers'; import { TEST_DATA } from './fixtures'; test.describe('套餐管理', () => { test.beforeEach(async ({ page }) => { await loginAsAdmin(page); // 导航到套餐列表页面 await page.goto('/admin/packages'); }); test.describe('列表页面', () => { test('访问套餐列表页面', async ({ page }) => { // 验证页面 URL await expect(page).toHaveURL(/\/admin\/packages/); }); test('验证列表加载', async ({ page }) => { // 等待表格加载 await waitForTable(page); // 验证表格存在 const table = page.locator('table, .ant-table'); await expect(table).toBeVisible(); // 验证新建按钮存在 const createButton = page.getByText(/新建套餐 | 创建套餐/); await expect(createButton).toBeVisible(); }); test('验证套餐列表数据', async ({ page }) => { await waitForTable(page); // 验证表格列头 const headers = page.locator('table .ant-table-thead th'); await expect(headers.first()).toBeVisible(); }); }); test.describe('创建套餐', () => { test('点击创建按钮', async ({ page }) => { // 点击新建套餐按钮 const createButton = page.getByText(/新建套餐 | 创建套餐/); await createButton.click(); // 验证跳转到创建页面 await page.waitForURL(/\/admin\/packages\/create|\/admin\/packages\/new/); }); test('填写套餐信息', async ({ page }) => { // 导航到创建页面 await page.goto('/admin/packages/create'); await page.waitForTimeout(500); // 填写套餐名称 const nameInput = page.locator('input[placeholder*="套餐名称"]'); if (await nameInput.isVisible()) { await nameInput.fill(TEST_DATA.package.name); } // 选择套餐类型 const typeSelect = page.locator('[placeholder*="套餐类型"]'); if (await typeSelect.isVisible()) { await typeSelect.click(); await page.getByText('标准版').click(); } // 填写价格 const priceInput = page.locator('input[placeholder*="价格"]'); if (await priceInput.isVisible()) { await priceInput.fill(String(TEST_DATA.package.price)); } }); test('设置配额', async ({ page }) => { // 导航到创建页面 await page.goto('/admin/packages/create'); await page.waitForTimeout(500); // 填写套餐名称 const nameInput = page.locator('input[placeholder*="套餐名称"]'); if (await nameInput.isVisible()) { await nameInput.fill(TEST_DATA.package.name); } // 设置教师配额 const teacherQuotaInput = page.locator('input[placeholder*="教师"]'); if (await teacherQuotaInput.isVisible()) { await teacherQuotaInput.fill(String(TEST_DATA.package.teacherQuota)); } // 设置学生配额 const studentQuotaInput = page.locator('input[placeholder*="学生"]'); if (await studentQuotaInput.isVisible()) { await studentQuotaInput.fill(String(TEST_DATA.package.studentQuota)); } }); test('保存套餐', async ({ page }) => { // 导航到创建页面 await page.goto('/admin/packages/create'); await page.waitForTimeout(500); // 填写套餐名称 const nameInput = page.locator('input[placeholder*="套餐名称"]'); if (await nameInput.isVisible()) { await nameInput.fill(TEST_DATA.package.name); } // 选择套餐类型 const typeSelect = page.locator('[placeholder*="套餐类型"]'); if (await typeSelect.isVisible()) { await typeSelect.click(); await page.waitForTimeout(200); await page.getByText('标准版').click(); } // 填写价格 const priceInput = page.locator('input[placeholder*="价格"]'); if (await priceInput.isVisible()) { await priceInput.fill(String(TEST_DATA.package.price)); } // 设置教师配额 const teacherQuotaInput = page.locator('input[placeholder*="教师"]'); if (await teacherQuotaInput.isVisible()) { await teacherQuotaInput.fill(String(TEST_DATA.package.teacherQuota)); } // 设置学生配额 const studentQuotaInput = page.locator('input[placeholder*="学生"]'); if (await studentQuotaInput.isVisible()) { await studentQuotaInput.fill(String(TEST_DATA.package.studentQuota)); } // 点击保存按钮 const saveButton = page.getByText(/保存 | 提交/); if (await saveButton.isVisible()) { await saveButton.click(); // 等待保存成功提示或页面跳转 await page.waitForTimeout(2000); } }); }); test.describe('编辑套餐', () => { test('点击编辑按钮', async ({ page }) => { await waitForTable(page); // 查找第一个套餐的编辑按钮 const editButton = page.locator('button:has-text("编辑")').first(); if (await editButton.isVisible()) { await editButton.click(); // 验证跳转到编辑页面 await page.waitForURL(/\/admin\/packages\/\d+\/edit|\/admin\/packages\/\d+/); } }); test('修改套餐信息', async ({ page }) => { await waitForTable(page); // 查找第一个套餐的编辑按钮 const editButton = page.locator('button:has-text("编辑")').first(); if (await editButton.isVisible()) { await editButton.click(); await page.waitForTimeout(1000); // 修改套餐名称 const nameInput = page.locator('input[placeholder*="套餐名称"]'); if (await nameInput.isVisible()) { const originalName = await nameInput.inputValue(); await nameInput.fill(`${originalName}_已修改`); } // 点击保存按钮 const saveButton = page.getByText(/保存/); if (await saveButton.isVisible()) { await saveButton.click(); // 等待保存成功提示 await page.waitForTimeout(1000); } } }); }); test.describe('删除套餐', () => { test('点击删除按钮', async ({ page }) => { await waitForTable(page); // 查找第一个套餐的删除按钮 const deleteButton = page.locator('button:has-text("删除")').first(); if (await deleteButton.isVisible()) { await expect(deleteButton).toBeVisible(); } }); test('确认删除弹窗', async ({ page }) => { await waitForTable(page); // 查找第一个套餐的删除按钮 const deleteButton = page.locator('button:has-text("删除")').first(); if (await deleteButton.isVisible()) { await deleteButton.click(); // 等待确认弹窗 const confirmDialog = page.locator('.ant-modal-confirm'); await expect(confirmDialog).toBeVisible({ timeout: 5000 }); // 点击取消,不实际删除 const cancelButton = page.locator('.ant-modal-confirm button:has-text("取消")'); if (await cancelButton.isVisible()) { await cancelButton.click(); } } }); }); });