/** * ================================================================ * 场景:积分系统全流程 E2E 测试 * ================================================================ * 用户故事: * - 家长/孩子:查看积分余额、积分流水 * - 家长:手动调整孩子积分 * * 流程步骤: * 1. 查看积分余额 * 2. 查看积分流水 * 3. 按分类查看流水 * 4. 手动调整积分 * * 关键里程碑: * - [Milestone-1] 返回积分余额 * - [Milestone-2] 积分调整成功 * ================================================================ * * 运行:npx playwright test tests/e2e/points-system.spec.js */ const { test, expect } = require('@playwright/test'); test.describe('【场景流程】积分系统全流程', () => { // ===== 场景1:查看积分余额 ===== test('[场景1] 查看积分余额 - 期望返回余额信息', async ({ page }) => { // ========== Given:进入积分页面 ========== await page.goto('/#/pages/profile/points'); await page.waitForLoadState('networkidle'); // ========== When:查看余额 ========== await page.waitForSelector('.points-card, .balance-card', { timeout: 10000 }); // ========== Then:Milestone-1 - 返回余额 ======== const balanceCard = page.locator('.balance-card, .points-balance'); if (await balanceCard.isVisible()) { const balanceText = await balanceCard.textContent(); expect(balanceText).toBeTruthy(); } // 验证积分数值显示 const pointsValue = page.locator('.points-value, .balance-num'); if (await pointsValue.isVisible()) { const valueText = await pointsValue.textContent(); expect(valueText).toMatch(/\d+/); } }); // ===== 场景2:查看积分流水 ===== test('[场景2] 查看积分流水 - 期望返回流水列表', async ({ page }) => { // ========== Given:进入积分流水页 ========== await page.goto('/#/pages/profile/points-detail'); await page.waitForLoadState('networkidle'); // ========== When:查看流水 ========== await page.waitForSelector('.flow-list, .points-log, .transaction-list', { timeout: 10000 }); // ========== Then:返回流水列表 ======== const flowItems = page.locator('.flow-item, .log-item, .transaction-item'); const count = await flowItems.count(); expect(count).toBeGreaterThanOrEqual(0); if (count > 0) { // 验证流水包含关键信息 const firstItem = flowItems.first(); expect(await firstItem.isVisible()).toBeTruthy(); // 验证包含金额信息 const amountTag = firstItem.locator('.amount, .points-change'); if (await amountTag.isVisible()) { const amountText = await amountTag.textContent(); expect(amountText).toBeTruthy(); } } }); // ===== 场景3:按分类查看流水 ===== test('[场景3] 按分类查看流水 - 期望返回筛选后流水', async ({ page }) => { // ========== Given:进入积分流水页 ========== await page.goto('/#/pages/profile/points-detail'); await page.waitForLoadState('networkidle'); // ========== When:选择分类筛选 ========== const categoryPicker = page.locator('.category-picker, .filter-btn'); if (await categoryPicker.isVisible()) { await categoryPicker.click(); await page.waitForSelector('.option-item, .filter-option', { timeout: 3000 }); await page.locator('.option-item').nth(1).click(); } // ========== Then:返回筛选后流水 ======== await page.waitForTimeout(500); const flowItems = page.locator('.flow-item, .log-item'); const count = await flowItems.count(); // 验证筛选生效(可能有0条或多条) expect(count).toBeGreaterThanOrEqual(0); }); // ===== 场景4:家长手动调整积分 ===== test('[场景4] 家长手动调整积分 - 期望调整成功', async ({ page }) => { // ========== Given:进入积分调整页 ========== await page.goto('/#/pages/profile/points-adjust'); await page.waitForLoadState('networkidle'); // ========== When:调整积分 ========== // 选择孩子 const childSelect = page.locator('.child-picker'); if (await childSelect.isVisible()) { await childSelect.click(); await page.waitForSelector('.child-option', { timeout: 3000 }); await page.locator('.child-option').first().click(); } // 输入调整值 const amountInput = page.locator('input[name="amount"], .amount-input'); if (await amountInput.isVisible()) { await amountInput.fill('10'); } // 输入原因 const reasonInput = page.locator('textarea[name="reason"], .reason-input'); if (await reasonInput.isVisible()) { await reasonInput.fill('表现优秀,额外奖励'); } // 提交 await page.click('.submit-btn, .adjust-btn'); // ========== Then:Milestone-2 - 调整成功 ======== await page.waitForSelector('.success-tip, .adjust-success, .toast-success', { timeout: 10000 }); expect(await page.locator('.success-tip, .adjust-success').isVisible()).toBeTruthy(); }); });