mine-all-menu.spec.ts 2.0 KB

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