| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- /**
- * ================================================================
- * 场景:联系人管理全流程 E2E 测试
- * ================================================================
- * 用户故事:家长管理社会联系人(朋友/同事/合作伙伴)
- *
- * 流程步骤:
- * 1. 创建联系人
- * 2. 通讯录导入
- * 3. 记录互动
- * 4. 编辑/删除联系人
- *
- * 关键里程碑:
- * - [Milestone-1] 联系人创建成功
- * ================================================================
- *
- * 运行:npx playwright test tests/e2e/contact-management.spec.js
- */
- const { test, expect } = require('@playwright/test');
- test.describe('【场景流程】联系人管理全流程', () => {
- // ===== 场景1:创建联系人 =====
- test('[场景1] 创建联系人 - 期望创建成功', async ({ page }) => {
- // ========== Given:进入联系人页 ==========
- await page.goto('/#/pages/action/contact-detail');
- await page.waitForLoadState('networkidle');
- // ========== When:创建联系人 ==========
- const addBtn = page.locator('.add-btn, .add-contact-btn');
- if (await addBtn.isVisible()) {
- await addBtn.click();
- }
- await page.waitForSelector('.contact-form', { timeout: 5000 });
- // 填写姓名
- const nameInput = page.locator('input[name="name"], .name-input');
- if (await nameInput.isVisible()) {
- await nameInput.fill('测试联系人_' + Date.now());
- }
- // 填写手机号
- const phoneInput = page.locator('input[name="phone"], .phone-input');
- if (await phoneInput.isVisible()) {
- await phoneInput.fill('138' + String(Date.now()).slice(-8));
- }
- // 选择关系类型
- const relationSelect = page.locator('.relation-picker, select[name="relationshipType"]');
- if (await relationSelect.isVisible()) {
- await relationSelect.selectOption('friend');
- }
- // 提交
- await page.click('.submit-btn, .save-btn');
- // ========== Then:Milestone-1 - 创建成功 ========
- await page.waitForSelector('.success-tip, .contact-added, .toast-success', { timeout: 10000 });
- expect(await page.locator('.success-tip, .contact-added').isVisible()).toBeTruthy();
- });
- // ===== 场景2:通讯录导入 =====
- test('[场景2] 通讯录导入 - 期望导入成功', async ({ page }) => {
- // ========== Given:进入联系人导入页 ==========
- await page.goto('/#/pages/action/contact-import');
- await page.waitForLoadState('networkidle');
- // ========== When:导入通讯录 ==========
- const importBtn = page.locator('.import-btn, .import-contacts-btn');
- if (await importBtn.isVisible()) {
- await importBtn.click();
- }
- // 选择导入方式
- const selectBtn = page.locator('.select-contacts-btn');
- if (await selectBtn.isVisible()) {
- await selectBtn.click();
- }
- // 选择要导入的联系人
- await page.waitForSelector('.contact-item', { timeout: 5000 });
- await page.locator('.contact-item').first().click();
- // 确认导入
- await page.click('.confirm-import-btn, .submit-btn');
- // ========== Then:导入成功 ========
- await page.waitForSelector('.success-tip, .import-success, .toast-success', { timeout: 15000 });
- expect(await page.locator('.success-tip, .import-success').isVisible()).toBeTruthy();
- });
- // ===== 场景3:记录互动 =====
- test('[场景3] 记录互动 - 期望记录成功', async ({ page }) => {
- // ========== Given:进入联系人详情 ==========
- await page.goto('/#/pages/action/contact-detail');
- await page.waitForLoadState('networkidle');
- // 选择一个联系人
- await page.waitForSelector('.contact-item', { timeout: 5000 });
- await page.locator('.contact-item').first().click();
- // ========== When:记录互动 ==========
- const interactBtn = page.locator('.interact-btn, .add-interaction');
- if (await interactBtn.isVisible()) {
- await interactBtn.click();
- }
- await page.waitForSelector('.interaction-form', { timeout: 5000 });
- // 填写互动内容
- const noteInput = page.locator('textarea[name="note"], .note-input');
- if (await noteInput.isVisible()) {
- await noteInput.fill('今天一起吃饭,讨论了合作事宜。');
- }
- await page.click('.submit-btn, .save-btn');
- // ========== Then:记录成功 ========
- await page.waitForSelector('.success-tip, .interaction-added', { timeout: 10000 });
- expect(await page.locator('.success-tip, .interaction-added').isVisible()).toBeTruthy();
- });
- // ===== 场景4:编辑/删除联系人 =====
- test('[场景4] 编辑/删除联系人 - 期望操作成功', async ({ page }) => {
- // ========== Given:进入联系人列表 ==========
- await page.goto('/#/pages/action/contact-detail');
- await page.waitForLoadState('networkidle');
- // ========== When:编辑联系人 ==========
- await page.waitForSelector('.contact-item', { timeout: 5000 });
- const firstContact = page.locator('.contact-item').first();
- const editBtn = firstContact.locator('.edit-btn');
- if (await editBtn.isVisible()) {
- await editBtn.click();
- } else {
- await firstContact.click();
- }
- await page.waitForSelector('.edit-form, .contact-form', { timeout: 5000 });
- // 修改姓名
- const nameInput = page.locator('input[name="name"], .name-input');
- if (await nameInput.isVisible()) {
- await nameInput.fill('已更新联系人_' + Date.now());
- }
- await page.click('.save-btn, .submit-btn');
- // ========== Then:操作成功 ========
- await page.waitForSelector('.success-tip, .update-success', { timeout: 10000 });
- expect(await page.locator('.success-tip, .update-success').isVisible()).toBeTruthy();
- });
- });
|