/** * 验证 mine 页面所有 menu-item 跳转是否正常 * 目的:发现类似 BUG-14 的路径错配 */ import { test, expect } from '@playwright/test'; import { loginAsTestUser } from '../helpers/login-helper'; const FRONTEND_URL = process.env.FRONTEND_URL || 'http://127.0.0.1:5173'; test.describe('mine 页面所有 menu-item 跳转验证 (发现 BUG-14 类问题)', () => { // 定义要验证的菜单项 const MENU_ITEMS = [ { name: '书籍生成', expectUrl: 'book-generator' }, { name: '会员中心', expectUrl: 'member' }, { name: '设置', expectUrl: 'settings' }, { name: '购买积分包', expectUrl: 'token-packs' }, { name: '邀请好友', expectUrl: 'invite' }, ]; for (const item of MENU_ITEMS) { test(`mine 页面"${item.name}"菜单应跳转到含 ${item.expectUrl} 的 URL`, async ({ page }) => { // 1) 登录 const { ok } = await loginAsTestUser(page); expect(ok, '登录应该成功').toBe(true); // 2) 访问 mine await page.goto(`${FRONTEND_URL}/#/pages/mine/index`, { waitUntil: 'networkidle', timeout: 30000 }); await page.waitForTimeout(3000); expect(page.url()).toContain('mine'); // 3) 找对应菜单项 const menuItem = page.locator('.menu-item').filter({ has: page.locator('.menu-text', { hasText: item.name }) }).first(); await expect(menuItem, `mine 页面应存在"${item.name}"菜单项`).toBeVisible({ timeout: 10000 }); // 4) 点击 const beforeUrl = page.url(); await menuItem.click(); await page.waitForTimeout(3000); // 5) 验证 URL 变化 const afterUrl = page.url(); console.log(`[${item.name}] ${beforeUrl} → ${afterUrl}`); if (afterUrl === beforeUrl) { throw new Error(`点击"${item.name}"后 URL 没变化!仍在 ${afterUrl}`); } if (!afterUrl.includes(item.expectUrl)) { throw new Error(`点击"${item.name}"后 URL 应包含 '${item.expectUrl}',但实际是: ${afterUrl}`); } }); } });