dashboard-navigation.spec.ts 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. import { TIMEOUTS } from '../../utils/timeouts';
  2. import { test, expect } from '../../utils/test-setup';
  3. /**
  4. * 首页导航和交互测试 (Story 13.7)
  5. *
  6. * 测试目标:验证企业小程序首页 dashboard 的导航和交互功能
  7. *
  8. * Playwright MCP 探索结果 (2026-01-14):
  9. * - 底部导航正常工作 (首页/人才/订单/数据/设置)
  10. * - 人才列表页人才卡片点击可导航到详情页
  11. * - 首页快捷操作按钮未触发跳转(可能为展示用途)
  12. * - 首页"查看全部"链接未触发跳转
  13. * - 首页人才卡片未触发跳转
  14. *
  15. * 运行时错误 (2026-01-14):
  16. * - 首页缺少 @d8d/yongren-dashboard-ui/pages/Dashboard/Dashboard 模块
  17. * - 这导致首页无法正常加载,影响相关测试
  18. *
  19. * 测试策略:
  20. * 1. 测试已实现的底部导航功能
  21. * 2. 跳过未实现的首页快捷操作、"查看全部"、首页人才卡片功能
  22. * 3. 测试人才列表页的卡片点击功能(已实现)
  23. *
  24. * Acceptance Criteria:
  25. * AC1: 快捷操作按钮导航测试(人才库、数据统计、订单管理、设置)- 跳过(未实现)
  26. * AC2: "查看全部"链接测试 - 跳过(未实现)
  27. * AC3: 人才卡片点击测试 - 部分实现(列表页可点击,首页不可点击)
  28. * AC4: 页面跳转验证 - 通过底部导航验证
  29. * AC5: 交互响应时间(2秒内)- 验证已实现功能
  30. * AC6: 代码质量标准(TIMEOUTS 常量、data-testid 选择器、TypeScript 类型安全)- 已遵守
  31. */
  32. // 测试数据常量
  33. const TEST_USER_PHONE = '13800001111';
  34. const TEST_USER_PASSWORD = 'password123';
  35. const TEST_TALENT_NAME = '测试残疾人_1768346782426_12_8219';
  36. // 导航超时阈值(AC5: 2秒内)
  37. const NAVIGATION_TIMEOUT_MS = 2000;
  38. // 使用 test.describe.serial 确保测试按顺序执行
  39. test.describe.serial('首页导航和交互测试 - Story 13.7', () => {
  40. // 每个测试使用独立的浏览器上下文
  41. test.use({ storageState: undefined });
  42. // ===== 底部导航测试(已实现功能) =====
  43. /**
  44. * AC4.1: 测试场景 - 底部导航跳转到人才页面
  45. */
  46. test('应该通过底部导航跳转到人才页面', async ({ enterpriseMiniPage: miniPage }) => {
  47. // 1. 登录
  48. await miniPage.goto();
  49. await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD);
  50. await miniPage.expectLoginSuccess();
  51. await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM);
  52. // 2. 点击底部导航"人才"按钮
  53. const startTime = Date.now();
  54. await miniPage.clickBottomNav('talent');
  55. const navigationTime = Date.now() - startTime;
  56. // 3. 验证 URL 正确
  57. await miniPage.expectUrl('/pages/yongren/talent/list/index');
  58. // 4. 验证响应时间(AC5: 2秒内)
  59. expect(navigationTime).toBeLessThanOrEqual(NAVIGATION_TIMEOUT_MS);
  60. console.debug(`[AC4.1] 底部导航跳转到人才页面 ✓ (耗时: ${navigationTime}ms)`);
  61. });
  62. /**
  63. * AC4.2: 测试场景 - 底部导航跳转到订单页面
  64. */
  65. test('应该通过底部导航跳转到订单页面', async ({ enterpriseMiniPage: miniPage }) => {
  66. // 1. 登录
  67. await miniPage.goto();
  68. await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD);
  69. await miniPage.expectLoginSuccess();
  70. await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM);
  71. // 2. 点击底部导航"订单"按钮
  72. const startTime = Date.now();
  73. await miniPage.clickBottomNav('order');
  74. const navigationTime = Date.now() - startTime;
  75. // 3. 验证 URL 正确
  76. await miniPage.expectUrl('/pages/yongren/order');
  77. // 4. 验证响应时间
  78. expect(navigationTime).toBeLessThanOrEqual(NAVIGATION_TIMEOUT_MS);
  79. console.debug(`[AC4.2] 底部导航跳转到订单页面 ✓ (耗时: ${navigationTime}ms)`);
  80. });
  81. /**
  82. * AC4.3: 测试场景 - 底部导航跳转到数据页面
  83. */
  84. test('应该通过底部导航跳转到数据页面', async ({ enterpriseMiniPage: miniPage }) => {
  85. // 1. 登录
  86. await miniPage.goto();
  87. await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD);
  88. await miniPage.expectLoginSuccess();
  89. await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM);
  90. // 2. 点击底部导航"数据"按钮
  91. const startTime = Date.now();
  92. await miniPage.clickBottomNav('data');
  93. const navigationTime = Date.now() - startTime;
  94. // 3. 验证 URL 正确
  95. await miniPage.expectUrl('/pages/yongren/statistics/index');
  96. console.debug(`[AC4.3] 底部导航跳转到数据页面 ✓ (耗时: ${navigationTime}ms)`);
  97. });
  98. /**
  99. * AC4.4: 测试场景 - 底部导航跳转到设置页面
  100. */
  101. test('应该通过底部导航跳转到设置页面', async ({ enterpriseMiniPage: miniPage }) => {
  102. // 1. 登录
  103. await miniPage.goto();
  104. await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD);
  105. await miniPage.expectLoginSuccess();
  106. await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM);
  107. // 2. 点击底部导航"设置"按钮
  108. const startTime = Date.now();
  109. await miniPage.clickBottomNav('settings');
  110. const navigationTime = Date.now() - startTime;
  111. // 3. 验证 URL 正确
  112. await miniPage.expectUrl('/pages/yongren/settings');
  113. console.debug(`[AC4.4] 底部导航跳转到设置页面 ✓ (耗时: ${navigationTime}ms)`);
  114. });
  115. /**
  116. * AC4.5: 测试场景 - 返回首页功能
  117. */
  118. test('应该可以通过底部导航首页按钮返回首页', async ({ enterpriseMiniPage: miniPage }) => {
  119. // 1. 登录
  120. await miniPage.goto();
  121. await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD);
  122. await miniPage.expectLoginSuccess();
  123. await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM);
  124. // 2. 先导航到其他页面(人才页面)
  125. await miniPage.clickBottomNav('talent');
  126. await miniPage.expectUrl('/pages/yongren/talent/list/index');
  127. // 3. 返回首页
  128. await miniPage.goBackToHome();
  129. // 4. 验证首页元素正确显示(注意:由于首页有运行时错误,只验证URL)
  130. await miniPage.expectUrl('/pages/yongren/dashboard/index');
  131. console.debug('[AC4.5] 返回首页功能 ✓');
  132. });
  133. // ===== AC3: 人才卡片点击测试(列表页功能已实现) =====
  134. /**
  135. * AC3: 测试场景 - 点击人才列表页的人才卡片跳转到人才详情
  136. * 注意:这是从人才列表页点击,不是从首页点击
  137. */
  138. test('应该点击人才列表页的人才卡片跳转到人才详情页', async ({ enterpriseMiniPage: miniPage }) => {
  139. // 1. 登录
  140. await miniPage.goto();
  141. await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD);
  142. await miniPage.expectLoginSuccess();
  143. await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM);
  144. // 2. 导航到人才列表页面
  145. await miniPage.clickBottomNav('talent');
  146. await miniPage.expectUrl('/pages/yongren/talent/list/index');
  147. // 3. 点击人才卡片
  148. const startTime = Date.now();
  149. await miniPage.clickTalentCardFromList(TEST_TALENT_NAME);
  150. const navigationTime = Date.now() - startTime;
  151. // 4. 验证跳转到详情页
  152. await miniPage.expectUrl('/pages/yongren/talent/detail/index');
  153. // 5. 验证详情页面显示正确的人才信息
  154. await miniPage.expectTalentDetailInfo(TEST_TALENT_NAME);
  155. // 6. 验证响应时间(AC5: 2秒内)
  156. expect(navigationTime).toBeLessThanOrEqual(NAVIGATION_TIMEOUT_MS);
  157. console.debug(`[AC3] 人才列表页卡片跳转到详情页 ✓ (耗时: ${navigationTime}ms)`);
  158. });
  159. // ===== 综合测试 =====
  160. /**
  161. * 测试场景:完整的导航流程
  162. * 验证首页 → 人才列表 → 人才详情 → 返回首页的完整流程
  163. */
  164. test('应该支持完整的导航流程:首页→人才列表→详情→首页', async ({ enterpriseMiniPage: miniPage }) => {
  165. // 1. 登录
  166. await miniPage.goto();
  167. await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD);
  168. await miniPage.expectLoginSuccess();
  169. await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM);
  170. // 2. 从首页导航到人才列表
  171. await miniPage.clickBottomNav('talent');
  172. await miniPage.page.waitForURL(
  173. url => url.hash.includes('/pages/yongren/talent/list/index'),
  174. { timeout: TIMEOUTS.PAGE_LOAD }
  175. );
  176. // 3. 点击人才卡片进入详情页
  177. await miniPage.clickTalentCardFromList(TEST_TALENT_NAME);
  178. await miniPage.expectUrl('/pages/yongren/talent/detail/index');
  179. // 4. 返回首页
  180. await miniPage.clickBottomNav('home');
  181. await miniPage.page.waitForURL(
  182. url => url.hash.includes('/pages/yongren/dashboard/index'),
  183. { timeout: TIMEOUTS.PAGE_LOAD }
  184. );
  185. console.debug('[综合测试] 完整导航流程 ✓');
  186. });
  187. // ===== 跳过的测试(未实现功能) =====
  188. /**
  189. * AC1.1: 快捷操作按钮 - 人才库按钮测试
  190. * 任务 3.1: 点击人才库按钮跳转到人才库页面
  191. *
  192. * 跳过原因:Playwright MCP 探索(2026-01-14)显示首页快捷操作按钮未触发跳转
  193. * 状态:功能未实现,需要开发团队实现首页快捷操作按钮的导航功能
  194. *
  195. * 测试步骤:
  196. * 1. 登录并进入首页
  197. * 2. 点击"人才库"快捷操作按钮
  198. * 3. 验证跳转到人才库页面(URL 和标题)
  199. * 4. 验证跳转在 2 秒内完成
  200. */
  201. test('应该通过快捷操作按钮跳转到人才库页面', async ({ enterpriseMiniPage: miniPage }) => {
  202. // 1. 登录
  203. await miniPage.goto();
  204. await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD);
  205. await miniPage.expectLoginSuccess();
  206. await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM);
  207. // 2. 点击快捷操作按钮"人才库"
  208. const startTime = Date.now();
  209. await miniPage.clickQuickAction('talentPool');
  210. const navigationTime = Date.now() - startTime;
  211. // 3. 验证 URL 正确
  212. await miniPage.expectUrl('/pages/yongren/talent/list/index');
  213. // 4. 验证页面标题
  214. await miniPage.expectPageTitle('人才');
  215. // 5. 验证响应时间(AC5: 2秒内)
  216. expect(navigationTime).toBeLessThanOrEqual(NAVIGATION_TIMEOUT_MS);
  217. console.debug(`[AC1.1] 快捷操作"人才库"跳转 ✓ (耗时: ${navigationTime}ms)`);
  218. });
  219. /**
  220. * AC1.2: 快捷操作按钮 - 数据统计按钮测试
  221. * 任务 3.2: 点击数据统计按钮跳转到数据统计页面
  222. *
  223. * 跳过原因:Playwright MCP 探索(2026-01-14)显示首页快捷操作按钮未触发跳转
  224. * 状态:功能未实现,需要开发团队实现首页快捷操作按钮的导航功能
  225. */
  226. test('应该通过快捷操作按钮跳转到数据统计页面', async ({ enterpriseMiniPage: miniPage }) => {
  227. // 1. 登录
  228. await miniPage.goto();
  229. await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD);
  230. await miniPage.expectLoginSuccess();
  231. await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM);
  232. // 2. 点击快捷操作按钮"数据统计"
  233. const startTime = Date.now();
  234. await miniPage.clickQuickAction('dataStats');
  235. const navigationTime = Date.now() - startTime;
  236. // 3. 验证 URL 正确
  237. await miniPage.expectUrl('/pages/yongren/statistics/index');
  238. // 4. 验证响应时间
  239. expect(navigationTime).toBeLessThanOrEqual(NAVIGATION_TIMEOUT_MS);
  240. console.debug(`[AC1.2] 快捷操作"数据统计"跳转 ✓ (耗时: ${navigationTime}ms)`);
  241. });
  242. /**
  243. * AC1.3: 快捷操作按钮 - 订单管理按钮测试
  244. * 任务 3.3: 点击订单管理按钮跳转到订单管理页面
  245. *
  246. * 跳过原因:Playwright MCP 探索(2026-01-14)显示首页快捷操作按钮未触发跳转
  247. * 状态:功能未实现,需要开发团队实现首页快捷操作按钮的导航功能
  248. */
  249. test('应该通过快捷操作按钮跳转到订单管理页面', async ({ enterpriseMiniPage: miniPage }) => {
  250. // 1. 登录
  251. await miniPage.goto();
  252. await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD);
  253. await miniPage.expectLoginSuccess();
  254. await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM);
  255. // 2. 点击快捷操作按钮"订单管理"
  256. const startTime = Date.now();
  257. await miniPage.clickQuickAction('orderManagement');
  258. const navigationTime = Date.now() - startTime;
  259. // 3. 验证 URL 正确
  260. await miniPage.expectUrl('/pages/yongren/order');
  261. // 4. 验证响应时间
  262. expect(navigationTime).toBeLessThanOrEqual(NAVIGATION_TIMEOUT_MS);
  263. console.debug(`[AC1.3] 快捷操作"订单管理"跳转 ✓ (耗时: ${navigationTime}ms)`);
  264. });
  265. /**
  266. * AC1.4: 快捷操作按钮 - 设置按钮测试
  267. * 任务 3.4: 点击设置按钮跳转到设置页面
  268. *
  269. * 跳过原因:Playwright MCP 探索(2026-01-14)显示首页快捷操作按钮未触发跳转
  270. * 状态:功能未实现,需要开发团队实现首页快捷操作按钮的导航功能
  271. */
  272. test('应该通过快捷操作按钮跳转到设置页面', async ({ enterpriseMiniPage: miniPage }) => {
  273. // 1. 登录
  274. await miniPage.goto();
  275. await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD);
  276. await miniPage.expectLoginSuccess();
  277. await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM);
  278. // 2. 点击快捷操作按钮"设置"
  279. const startTime = Date.now();
  280. await miniPage.clickQuickAction('settings');
  281. const navigationTime = Date.now() - startTime;
  282. // 3. 验证 URL 正确
  283. await miniPage.expectUrl('/pages/yongren/settings');
  284. // 4. 验证响应时间
  285. expect(navigationTime).toBeLessThanOrEqual(NAVIGATION_TIMEOUT_MS);
  286. console.debug(`[AC1.4] 快捷操作"设置"跳转 ✓ (耗时: ${navigationTime}ms)`);
  287. });
  288. /**
  289. * AC2: "查看全部"链接测试
  290. * 任务 4.1: 点击查看全部链接跳转到人才列表页面
  291. * 任务 4.2: 验证跳转后的页面 URL 正确
  292. * 任务 4.3: 验证跳转后的页面标题正确
  293. *
  294. * 跳过原因:Playwright MCP 探索(2026-01-14)显示首页"查看全部"链接未触发跳转
  295. * 状态:功能未实现,需要开发团队实现首页"查看全部"链接的导航功能
  296. */
  297. test('应该通过查看全部链接跳转到人才列表页面', async ({ enterpriseMiniPage: miniPage }) => {
  298. // 1. 登录
  299. await miniPage.goto();
  300. await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD);
  301. await miniPage.expectLoginSuccess();
  302. await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM);
  303. // 2. 点击"查看全部"链接
  304. const startTime = Date.now();
  305. await miniPage.clickViewAll();
  306. const navigationTime = Date.now() - startTime;
  307. // 3. 验证跳转到人才列表页面
  308. await miniPage.expectUrl('/pages/yongren/talent/list/index');
  309. // 4. 验证页面标题正确(AC4)
  310. await miniPage.expectPageTitle('人才');
  311. // 5. 验证响应时间(AC5: 2秒内)
  312. expect(navigationTime).toBeLessThanOrEqual(NAVIGATION_TIMEOUT_MS);
  313. console.debug(`[AC2] "查看全部"链接跳转 ✓ (耗时: ${navigationTime}ms)`);
  314. });
  315. /**
  316. * AC3: 首页人才卡片点击测试
  317. * 任务 3(来自人才卡片测试): 点击首页人才卡片跳转到人才详情页
  318. *
  319. * 跳过原因:Playwright MCP 探索(2026-01-14)显示首页人才卡片未触发跳转
  320. * 状态:功能未实现,需要开发团队实现首页人才卡片的导航功能
  321. * 注意:人才列表页的人才卡片点击功能已正常工作(见上面的测试)
  322. */
  323. test('应该点击首页人才卡片跳转到人才详情页', async ({ enterpriseMiniPage: miniPage }) => {
  324. // 1. 登录
  325. await miniPage.goto();
  326. await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD);
  327. await miniPage.expectLoginSuccess();
  328. await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM);
  329. // 2. 点击首页人才卡片
  330. const startTime = Date.now();
  331. await miniPage.clickTalentCardFromDashboard(TEST_TALENT_NAME);
  332. const navigationTime = Date.now() - startTime;
  333. // 3. 验证跳转到人才详情页
  334. await miniPage.expectUrl('/pages/yongren/talent/detail/index');
  335. // 4. 验证详情页面显示正确的人才信息
  336. await miniPage.expectTalentDetailInfo(TEST_TALENT_NAME);
  337. // 5. 验证响应时间(AC5: 2秒内)
  338. expect(navigationTime).toBeLessThanOrEqual(NAVIGATION_TIMEOUT_MS);
  339. console.debug(`[AC3] 首页人才卡片跳转 ✓ (耗时: ${navigationTime}ms)`);
  340. });
  341. });