contact-management.spec.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /**
  2. * ================================================================
  3. * 场景:联系人管理全流程 E2E 测试
  4. * ================================================================
  5. * 用户故事:家长管理社会联系人(朋友/同事/合作伙伴)
  6. *
  7. * 流程步骤:
  8. * 1. 创建联系人
  9. * 2. 通讯录导入
  10. * 3. 记录互动
  11. * 4. 编辑/删除联系人
  12. *
  13. * 关键里程碑:
  14. * - [Milestone-1] 联系人创建成功
  15. * ================================================================
  16. *
  17. * 运行:npx playwright test tests/e2e/contact-management.spec.js
  18. */
  19. const { test, expect } = require('@playwright/test');
  20. test.describe('【场景流程】联系人管理全流程', () => {
  21. // ===== 场景1:创建联系人 =====
  22. test('[场景1] 创建联系人 - 期望创建成功', async ({ page }) => {
  23. // ========== Given:进入联系人页 ==========
  24. await page.goto('/#/pages/action/contact-detail');
  25. await page.waitForLoadState('networkidle');
  26. // ========== When:创建联系人 ==========
  27. const addBtn = page.locator('.add-btn, .add-contact-btn');
  28. if (await addBtn.isVisible()) {
  29. await addBtn.click();
  30. }
  31. await page.waitForSelector('.contact-form', { timeout: 5000 });
  32. // 填写姓名
  33. const nameInput = page.locator('input[name="name"], .name-input');
  34. if (await nameInput.isVisible()) {
  35. await nameInput.fill('测试联系人_' + Date.now());
  36. }
  37. // 填写手机号
  38. const phoneInput = page.locator('input[name="phone"], .phone-input');
  39. if (await phoneInput.isVisible()) {
  40. await phoneInput.fill('138' + String(Date.now()).slice(-8));
  41. }
  42. // 选择关系类型
  43. const relationSelect = page.locator('.relation-picker, select[name="relationshipType"]');
  44. if (await relationSelect.isVisible()) {
  45. await relationSelect.selectOption('friend');
  46. }
  47. // 提交
  48. await page.click('.submit-btn, .save-btn');
  49. // ========== Then:Milestone-1 - 创建成功 ========
  50. await page.waitForSelector('.success-tip, .contact-added, .toast-success', { timeout: 10000 });
  51. expect(await page.locator('.success-tip, .contact-added').isVisible()).toBeTruthy();
  52. });
  53. // ===== 场景2:通讯录导入 =====
  54. test('[场景2] 通讯录导入 - 期望导入成功', async ({ page }) => {
  55. // ========== Given:进入联系人导入页 ==========
  56. await page.goto('/#/pages/action/contact-import');
  57. await page.waitForLoadState('networkidle');
  58. // ========== When:导入通讯录 ==========
  59. const importBtn = page.locator('.import-btn, .import-contacts-btn');
  60. if (await importBtn.isVisible()) {
  61. await importBtn.click();
  62. }
  63. // 选择导入方式
  64. const selectBtn = page.locator('.select-contacts-btn');
  65. if (await selectBtn.isVisible()) {
  66. await selectBtn.click();
  67. }
  68. // 选择要导入的联系人
  69. await page.waitForSelector('.contact-item', { timeout: 5000 });
  70. await page.locator('.contact-item').first().click();
  71. // 确认导入
  72. await page.click('.confirm-import-btn, .submit-btn');
  73. // ========== Then:导入成功 ========
  74. await page.waitForSelector('.success-tip, .import-success, .toast-success', { timeout: 15000 });
  75. expect(await page.locator('.success-tip, .import-success').isVisible()).toBeTruthy();
  76. });
  77. // ===== 场景3:记录互动 =====
  78. test('[场景3] 记录互动 - 期望记录成功', async ({ page }) => {
  79. // ========== Given:进入联系人详情 ==========
  80. await page.goto('/#/pages/action/contact-detail');
  81. await page.waitForLoadState('networkidle');
  82. // 选择一个联系人
  83. await page.waitForSelector('.contact-item', { timeout: 5000 });
  84. await page.locator('.contact-item').first().click();
  85. // ========== When:记录互动 ==========
  86. const interactBtn = page.locator('.interact-btn, .add-interaction');
  87. if (await interactBtn.isVisible()) {
  88. await interactBtn.click();
  89. }
  90. await page.waitForSelector('.interaction-form', { timeout: 5000 });
  91. // 填写互动内容
  92. const noteInput = page.locator('textarea[name="note"], .note-input');
  93. if (await noteInput.isVisible()) {
  94. await noteInput.fill('今天一起吃饭,讨论了合作事宜。');
  95. }
  96. await page.click('.submit-btn, .save-btn');
  97. // ========== Then:记录成功 ========
  98. await page.waitForSelector('.success-tip, .interaction-added', { timeout: 10000 });
  99. expect(await page.locator('.success-tip, .interaction-added').isVisible()).toBeTruthy();
  100. });
  101. // ===== 场景4:编辑/删除联系人 =====
  102. test('[场景4] 编辑/删除联系人 - 期望操作成功', async ({ page }) => {
  103. // ========== Given:进入联系人列表 ==========
  104. await page.goto('/#/pages/action/contact-detail');
  105. await page.waitForLoadState('networkidle');
  106. // ========== When:编辑联系人 ==========
  107. await page.waitForSelector('.contact-item', { timeout: 5000 });
  108. const firstContact = page.locator('.contact-item').first();
  109. const editBtn = firstContact.locator('.edit-btn');
  110. if (await editBtn.isVisible()) {
  111. await editBtn.click();
  112. } else {
  113. await firstContact.click();
  114. }
  115. await page.waitForSelector('.edit-form, .contact-form', { timeout: 5000 });
  116. // 修改姓名
  117. const nameInput = page.locator('input[name="name"], .name-input');
  118. if (await nameInput.isVisible()) {
  119. await nameInput.fill('已更新联系人_' + Date.now());
  120. }
  121. await page.click('.save-btn, .submit-btn');
  122. // ========== Then:操作成功 ========
  123. await page.waitForSelector('.success-tip, .update-success', { timeout: 10000 });
  124. expect(await page.locator('.success-tip, .update-success').isVisible()).toBeTruthy();
  125. });
  126. });