| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- /**
- * ================================================================
- * 场景:积分系统全流程 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();
- });
- });
|