import { TIMEOUTS } from '../../utils/timeouts'; import { test, expect } from '../../utils/test-setup'; import { EnterpriseMiniPage } from '../../pages/mini/enterprise-mini.page'; import { AdminLoginPage } from '../../pages/admin/login.page'; import { ORDER_STATUS } from '../../pages/admin/order-management.page'; /** * 订单列表页完整验证 E2E 测试 (Story 13.8) * * 测试目标:验证企业小程序订单列表页的完整功能 * * 测试流程: * 1. 企业用户登录小程序 * 2. 导航到订单列表页 * 3. 验证订单列表显示 * 4. 验证筛选功能 * 5. 验证搜索功能 * 6. 验证订单卡片交互(查看详情) * * Playwright MCP 探索结果 (2026-01-14): * - 小程序订单列表页没有 data-testid 属性 * - 使用 Taro 组件 (taro-view-core, taro-text-core) * - 需要使用文本选择器和 CSS 类选择器 * - 订单卡片包含:订单名称、创建日期、状态、人数、日期、统计信息 * - 点击"查看详情"成功导航到订单详情页 */ // 测试常量 const TEST_USER_PHONE = '13800001111'; // 小程序登录手机号 const TEST_USER_PASSWORD = process.env.TEST_ENTERPRISE_PASSWORD || 'password123'; // 小程序登录密码 // 测试用户的平台和公司信息(从数据库查询获取) // 用户 13800001111 的 company_id = 1663,对应的公司关联的 platform_id = 1545 const TEST_PLATFORM_NAME = '测试平台_1768346782302'; // platform_id = 1545 const TEST_COMPANY_NAME = '测试公司_1768346782396'; // company_id = 1663 /** * 订单列表页常量(基于 Playwright MCP 探索) */ const ORDER_LIST_SELECTORS = { // 页面 pageUrl: '/mini/#/mini/pages/yongren/order/list/index', pageTitle: '订单列表', // 筛选标签(文本选择器) filterTabs: { all: '全部订单', inProgress: '进行中', completed: '已完成', cancelled: '已取消', }, // 搜索 searchPlaceholder: '按订单号、人才姓名搜索', searchButton: '搜索', // 订单卡片 orderCard: '.bg-white', // CSS 类选择器 viewDetailButton: '查看详情', // 文本选择器 // 底部导航 bottomNav: { home: '首页', talent: '人才', order: '订单', data: '数据', settings: '设置', }, } as const; test.describe('订单列表页完整验证 - Story 13.8', () => { // 每个测试使用独立的浏览器上下文 test.use({ storageState: undefined }); /** * 测试场景:订单列表基础功能验证 (AC1) */ test.describe.serial('订单列表基础功能测试 (AC1)', () => { test.use({ storageState: undefined }); test('应该成功加载订单列表并显示订单卡片', async ({ enterpriseMiniPage: miniPage }) => { // 1. 登录小程序 await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); // 2. 导航到订单列表页 await miniPage.page.goto(`http://localhost:8080${ORDER_LIST_SELECTORS.pageUrl}`); await miniPage.page.waitForTimeout(TIMEOUTS.LONG); // 3. 验证页面标题 const pageTitle = await miniPage.page.title(); expect(pageTitle).toBe(ORDER_LIST_SELECTORS.pageTitle); // 4. 验证订单卡片显示 // 注意:小程序订单列表页没有 data-testid,使用 CSS 类选择器 const orderCards = miniPage.page.locator(ORDER_LIST_SELECTORS.orderCard); const cardCount = await orderCards.count(); // 验证至少有一个订单卡片(排除导航栏等元素) expect(cardCount).toBeGreaterThan(0); console.debug(`[订单列表] 找到 ${cardCount} 个订单卡片`); // 5. 验证筛选区域可见 const filterTabs = miniPage.page.getByText(ORDER_LIST_SELECTORS.filterTabs.all); await expect(filterTabs).toBeVisible(); console.debug('[订单列表] 筛选标签可见'); }); test('订单卡片应该显示所有必填字段', async ({ enterpriseMiniPage: miniPage }) => { // 1. 登录并导航到订单列表 await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.goto(`http://localhost:8080${ORDER_LIST_SELECTORS.pageUrl}`); await miniPage.page.waitForTimeout(TIMEOUTS.LONG); // 2. 获取页面内容验证订单信息显示 // 基于实际探索,订单列表页包含订单名称、状态、人数等信息 const pageText = await miniPage.page.textContent('body'); // 3. 验证页面包含订单相关信息 expect(pageText).toBeDefined(); expect(pageText!.length).toBeGreaterThan(0); // 4. 验证包含状态关键词(基于实际探索:草稿/进行中/已完成/已取消) const hasStatus = pageText!.match(/草稿|进行中|已完成|已取消/); expect(hasStatus).toBeTruthy(); // 5. 验证包含人数信息(基于实际探索:0人) expect(pageText).toContain('人'); // 6. 验证包含日期信息(基于实际探索:YYYY-MM-DD 格式或 "未设置") const hasDate = pageText!.match(/\d{4}-\d{2}-\d{2}|未设置/); expect(hasDate).toBeTruthy(); console.debug('[订单列表] 订单卡片字段验证通过'); }); test('订单状态徽章应该正确显示', async ({ enterpriseMiniPage: miniPage }) => { // 1. 登录并导航到订单列表 await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.goto(`http://localhost:8080${ORDER_LIST_SELECTORS.pageUrl}`); await miniPage.page.waitForTimeout(TIMEOUTS.LONG); // 2. 验证订单状态显示 // 检查页面包含至少一个订单状态 const statusText = await miniPage.page.textContent('body'); const hasOrderStatus = statusText?.match(/草稿|进行中|已完成|已取消/); expect(hasOrderStatus).toBeTruthy(); console.debug('[订单列表] 订单状态徽章显示正确'); }); test('订单人数和日期信息应该正确显示', async ({ enterpriseMiniPage: miniPage }) => { // 1. 登录并导航到订单列表 await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.goto(`http://localhost:8080${ORDER_LIST_SELECTORS.pageUrl}`); await miniPage.page.waitForTimeout(TIMEOUTS.LONG); // 2. 验证人数信息显示 const pageText = await miniPage.page.textContent('body'); expect(pageText).toContain('人'); console.debug('[订单列表] 订单人数显示正确'); // 3. 验证日期信息显示(格式:YYYY-MM-DD 或 "未设置") const hasDate = pageText?.match(/\d{4}-\d{2}-\d{2}|未设置/); expect(hasDate).toBeTruthy(); console.debug('[订单列表] 订单日期显示正确'); }); }); /** * 测试场景:订单列表交互功能验证 (AC7) */ test.describe.serial('订单列表交互功能测试 (AC7)', () => { test.use({ storageState: undefined }); test('应该点击订单卡片跳转到订单详情页', async ({ enterpriseMiniPage: miniPage }) => { // 1. 登录并导航到订单列表 await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.goto(`http://localhost:8080${ORDER_LIST_SELECTORS.pageUrl}`); await miniPage.page.waitForTimeout(TIMEOUTS.LONG); // 2. 记录当前 URL const beforeUrl = miniPage.page.url(); console.debug(`[详情页] 当前 URL: ${beforeUrl}`); // 3. 点击"查看详情"按钮 // 使用 evaluate 直接点击,避免被其他元素阻挡 await miniPage.page.evaluate((buttonText) => { const buttons = Array.from(document.querySelectorAll('*')); const targetButton = buttons.find(el => el.textContent?.includes(buttonText) && el.textContent?.trim() === buttonText ); if (targetButton) { (targetButton as HTMLElement).click(); } }, ORDER_LIST_SELECTORS.viewDetailButton); // 4. 等待导航完成 await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); // 5. 验证 URL 已改变(包含订单详情页路径) const afterUrl = miniPage.page.url(); console.debug(`[详情页] 导航后 URL: ${afterUrl}`); expect(afterUrl).toContain('/mini/pages/yongren/order/detail/index'); expect(afterUrl).toContain('id='); console.debug('[详情页] 成功导航到订单详情页'); }); test('应该可以从详情页返回列表页', async ({ enterpriseMiniPage: miniPage }) => { // 1. 登录并导航到订单列表 await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.goto(`http://localhost:8080${ORDER_LIST_SELECTORS.pageUrl}`); await miniPage.page.waitForTimeout(TIMEOUTS.LONG); // 2. 点击"查看详情"进入订单详情页 await miniPage.page.evaluate((buttonText) => { const buttons = Array.from(document.querySelectorAll('*')); const targetButton = buttons.find(el => el.textContent?.includes(buttonText) && el.textContent?.trim() === buttonText ); if (targetButton) { (targetButton as HTMLElement).click(); } }, ORDER_LIST_SELECTORS.viewDetailButton); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); // 3. 验证在详情页 const detailUrl = miniPage.page.url(); expect(detailUrl).toContain('/mini/pages/yongren/order/detail/index'); // 4. 返回列表页(使用 EnterpriseMiniPage 的 clickBottomNav 方法) await miniPage.clickBottomNav('order'); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); // 5. 验证返回到列表页 const listUrl = miniPage.page.url(); expect(listUrl).toContain('/mini/pages/yongren/order/list'); console.debug('[详情页] 成功返回到订单列表页'); }); }); /** * 测试场景:订单状态筛选功能验证 (AC2) */ test.describe.serial('订单状态筛选功能测试 (AC2)', () => { test.use({ storageState: undefined }); test('应该显示所有筛选标签', async ({ enterpriseMiniPage: miniPage }) => { // 1. 登录并导航到订单列表 await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.goto(`http://localhost:8080${ORDER_LIST_SELECTORS.pageUrl}`); await miniPage.page.waitForTimeout(TIMEOUTS.LONG); // 2. 验证所有筛选标签可见 const { filterTabs } = ORDER_LIST_SELECTORS; // 使用 .first() 避免 strict mode violation await expect(miniPage.page.getByText(filterTabs.all).first()).toBeVisible(); await expect(miniPage.page.getByText(filterTabs.inProgress).first()).toBeVisible(); await expect(miniPage.page.getByText(filterTabs.completed).first()).toBeVisible(); await expect(miniPage.page.getByText(filterTabs.cancelled).first()).toBeVisible(); console.debug('[筛选] 所有筛选标签可见'); }); test('应该可以按订单状态筛选 - 进行中', async ({ enterpriseMiniPage: miniPage }) => { // 1. 登录并导航到订单列表 await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.goto(`http://localhost:8080${ORDER_LIST_SELECTORS.pageUrl}`); await miniPage.page.waitForTimeout(TIMEOUTS.LONG); // 2. 点击"进行中"筛选标签 await miniPage.page.evaluate((tabText) => { const tabs = Array.from(document.querySelectorAll('*')); const targetTab = tabs.find(el => el.textContent?.includes(tabText) && el.textContent?.trim() === tabText ); if (targetTab) { (targetTab as HTMLElement).click(); } }, ORDER_LIST_SELECTORS.filterTabs.inProgress); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); // 3. 验证筛选结果:检查页面包含"进行中"状态 const pageText = await miniPage.page.textContent('body'); const hasInProgressStatus = pageText?.includes('进行中'); expect(hasInProgressStatus).toBe(true); // 4. 验证筛选后的订单列表 const filteredCards = miniPage.page.locator(ORDER_LIST_SELECTORS.orderCard); const filteredCount = await filteredCards.count(); // 验证筛选后有订单显示(至少有进行中状态的订单) expect(filteredCount).toBeGreaterThan(0); console.debug(`[筛选] 筛选后订单数量: ${filteredCount}`); // 5. 进一步验证:检查筛选结果确实包含"进行中"状态的订单 let foundMatchingOrder = false; for (let i = 0; i < Math.min(filteredCount, 3); i++) { const cardText = await filteredCards.nth(i).textContent(); if (cardText?.includes('进行中')) { foundMatchingOrder = true; console.debug(`[筛选] 订单 ${i + 1} 包含"进行中"状态`); break; } } expect(foundMatchingOrder).toBe(true); console.debug('[筛选] 筛选功能验证通过'); }); }); /** * 测试场景:订单搜索功能验证 (AC4) */ test.describe.serial('订单搜索功能测试 (AC4)', () => { test.use({ storageState: undefined }); test('应该显示搜索框和搜索按钮', async ({ enterpriseMiniPage: miniPage }) => { // 1. 登录并导航到订单列表 await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.goto(`http://localhost:8080${ORDER_LIST_SELECTORS.pageUrl}`); await miniPage.page.waitForTimeout(TIMEOUTS.LONG); // 2. 验证搜索框可见 // 使用 .first() 避免 strict mode violation(有多个搜索框) const searchInput = miniPage.page.getByPlaceholder(ORDER_LIST_SELECTORS.searchPlaceholder).first(); await expect(searchInput).toBeVisible(); // 3. 验证搜索按钮可见 const searchButton = miniPage.page.getByText(ORDER_LIST_SELECTORS.searchButton); await expect(searchButton).toBeVisible(); console.debug('[搜索] 搜索框和搜索按钮可见'); }); test('应该可以按订单名称搜索并显示筛选结果', async ({ enterpriseMiniPage: miniPage }) => { // 1. 登录并导航到订单列表 await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.goto(`http://localhost:8080${ORDER_LIST_SELECTORS.pageUrl}`); await miniPage.page.waitForTimeout(TIMEOUTS.LONG); // 2. 记录初始订单数量 const initialCards = miniPage.page.locator(ORDER_LIST_SELECTORS.orderCard); const initialCount = await initialCards.count(); console.debug(`[搜索] 初始订单数量: ${initialCount}`); // 3. 在搜索框输入已知存在的订单关键词 // 基于实际探索:搜索 "Epic13" 应该能找到匹配的订单 const searchInput = miniPage.page.getByPlaceholder(ORDER_LIST_SELECTORS.searchPlaceholder).first(); const searchKeyword = 'Epic13'; await searchInput.type(searchKeyword); // 4. 等待搜索自动触发(基于探索:搜索是自动触发的) await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); // 5. 验证搜索输入成功 const inputValue = await searchInput.evaluate((el: any) => el.value || el.textContent); expect(inputValue).toContain(searchKeyword); console.debug(`[搜索] 搜索关键词已输入: ${searchKeyword}`); // 6. 验证搜索结果:检查页面包含搜索关键词 const pageText = await miniPage.page.textContent('body'); const hasKeyword = pageText?.includes(searchKeyword); expect(hasKeyword).toBe(true); // 7. 验证搜索结果只包含匹配的订单 const searchResults = miniPage.page.locator(ORDER_LIST_SELECTORS.orderCard); const resultCount = await searchResults.count(); // 验证有搜索结果 expect(resultCount).toBeGreaterThan(0); console.debug(`[搜索] 搜索结果数量: ${resultCount}`); // 8. 验证搜索结果确实包含搜索关键词 let foundMatchingResult = false; for (let i = 0; i < Math.min(resultCount, 3); i++) { const cardText = await searchResults.nth(i).textContent(); if (cardText?.includes(searchKeyword)) { foundMatchingResult = true; console.debug(`[搜索] 搜索结果 ${i + 1} 包含关键词 "${searchKeyword}"`); break; } } expect(foundMatchingResult).toBe(true); console.debug('[搜索] 搜索功能验证通过'); }); }); /** * 测试场景:后台编辑后订单列表同步验证 (AC3, AC5) * * 测试流程: * 1. 后台登录并创建/编辑订单 * 2. 小程序验证订单信息同步 * 3. 验证数据同步时间(≤ 10 秒) */ test.describe.serial('后台编辑后订单列表同步测试 (AC3, AC5)', () => { test.use({ storageState: undefined }); // 管理员登录凭据 const ADMIN_USERNAME = 'admin'; const ADMIN_PASSWORD = process.env.TEST_ADMIN_PASSWORD || 'admin123'; /** * 辅助函数:执行管理员登录 * @param adminLoginPage 管理员登录页面对象 */ async function adminLogin(adminLoginPage: AdminLoginPage): Promise { await adminLoginPage.goto(); await adminLoginPage.login(ADMIN_USERNAME, ADMIN_PASSWORD); // 验证登录成功 await adminLoginPage.page.waitForURL('/admin/dashboard', { timeout: TIMEOUTS.PAGE_LOAD }); } /** * 辅助函数:等待订单在小程序列表中更新 * @param miniPage 小程序页面 * @param orderName 订单名称 * @param timeout 超时时间(毫秒) * @returns 是否在超时时间内检测到更新 */ async function waitForOrderUpdate(miniPage: EnterpriseMiniPage, orderName: string, timeout: number = 10000): Promise { const startTime = Date.now(); while (Date.now() - startTime < timeout) { // 刷新页面 await miniPage.page.reload({ waitUntil: 'domcontentloaded', timeout: TIMEOUTS.PAGE_LOAD }); await miniPage.page.waitForTimeout(TIMEOUTS.SHORT); // 检查订单是否出现 const pageText = await miniPage.page.textContent('body'); if (pageText && pageText.includes(orderName)) { return true; } await miniPage.page.waitForTimeout(500); } return false; } /** * 辅助函数:在小程序订单列表中查找订单 * @param miniPage 小程序页面 * @param orderName 订单名称 * @returns 是否找到订单 */ async function findOrderInList(miniPage: EnterpriseMiniPage, orderName: string): Promise { const pageText = await miniPage.page.textContent('body'); if (!pageText) return false; // 检查是否包含订单名称 const hasOrderName = pageText.includes(orderName); return hasOrderName; } test('后台修改订单名称后小程序同步', async ({ enterpriseMiniPage: miniPage, orderManagementPage: adminPage, adminLoginPage }) => { // 测试数据 const originalName = `E2E测试_名称同步_${Date.now()}`; const updatedName = `${originalName}_已更新`; // 1. 后台登录并创建订单(需要关联到测试用户的平台和公司) await adminLogin(adminLoginPage); await adminPage.goto(); const createResult = await adminPage.createOrder({ name: originalName, platformName: TEST_PLATFORM_NAME, companyName: TEST_COMPANY_NAME, expectedStartDate: '2026-02-01', }); expect(createResult.success).toBe(true); console.debug(`[跨端同步] 后台创建订单成功: ${originalName}`); // 2. 小程序验证订单显示 await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.navigateToOrderList(); // 等待订单出现 const found = await waitForOrderUpdate(miniPage, originalName, TIMEOUTS.OPERATION); expect(found).toBe(true); console.debug(`[跨端同步] 小程序显示订单: ${originalName}`); // 3. 后台修改订单名称 await adminLogin(adminLoginPage); await adminPage.goto(); const editResult = await adminPage.editOrder(originalName, { name: updatedName, // 编辑时需要提供 name }); expect(editResult.success).toBe(true); console.debug(`[跨端同步] 后台修改订单名称: ${originalName} → ${updatedName}`); // 4. 小程序验证订单名称更新 await miniPage.navigateToOrderList(); const updated = await waitForOrderUpdate(miniPage, updatedName, TIMEOUTS.OPERATION); expect(updated).toBe(true); // 验证旧名称不再存在 const oldNameExists = await findOrderInList(miniPage, originalName); expect(oldNameExists).toBe(false); console.debug(`[跨端同步] 小程序订单名称已更新: ${updatedName}`); }); test('后台修改订单状态后小程序同步', async ({ enterpriseMiniPage: miniPage, orderManagementPage: adminPage, adminLoginPage }) => { // 测试数据 const orderName = `E2E测试_状态同步_${Date.now()}`; // 1. 后台登录并创建订单(需要关联到测试用户的平台和公司) await adminLogin(adminLoginPage); await adminPage.goto(); const createResult = await adminPage.createOrder({ name: orderName, platformName: TEST_PLATFORM_NAME, companyName: TEST_COMPANY_NAME, status: ORDER_STATUS.DRAFT, expectedStartDate: '2026-02-01', }); expect(createResult.success).toBe(true); console.debug(`[跨端同步] 后台创建订单: ${orderName}, 状态: 草稿`); // 2. 小程序验证订单显示 await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.navigateToOrderList(); const found = await waitForOrderUpdate(miniPage, orderName, TIMEOUTS.OPERATION); expect(found).toBe(true); console.debug(`[跨端同步] 小程序显示订单: ${orderName}`); // 3. 后台修改订单状态为"进行中" await adminLogin(adminLoginPage); await adminPage.goto(); const editResult = await adminPage.editOrder(orderName, { name: orderName, // 编辑时需要提供 name status: ORDER_STATUS.IN_PROGRESS, }); expect(editResult.success).toBe(true); console.debug(`[跨端同步] 后台修改订单状态: 草稿 → 进行中`); // 4. 小程序验证订单状态更新 await miniPage.navigateToOrderList(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); // 检查页面包含"进行中"状态 const pageText = await miniPage.page.textContent('body'); expect(pageText).toContain('进行中'); console.debug(`[跨端同步] 小程序订单状态已更新: 进行中`); }); test('后台修改日期后小程序同步', async ({ enterpriseMiniPage: miniPage, orderManagementPage: adminPage, adminLoginPage }) => { // 测试数据 const orderName = `E2E测试_日期同步_${Date.now()}`; const originalDate = '2026-02-01'; const updatedDate = '2026-03-15'; // 1. 后台登录并创建订单(需要关联到测试用户的平台和公司) await adminLogin(adminLoginPage); await adminPage.goto(); const createResult = await adminPage.createOrder({ name: orderName, platformName: TEST_PLATFORM_NAME, companyName: TEST_COMPANY_NAME, expectedStartDate: originalDate, }); expect(createResult.success).toBe(true); console.debug(`[跨端同步] 后台创建订单: ${orderName}, 开始日期: ${originalDate}`); // 2. 小程序验证订单显示 await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.navigateToOrderList(); const found = await waitForOrderUpdate(miniPage, orderName, TIMEOUTS.OPERATION); expect(found).toBe(true); // 验证日期显示 const initialPageText = await miniPage.page.textContent('body'); expect(initialPageText).toContain(originalDate); console.debug(`[跨端同步] 小程序显示日期: ${originalDate}`); // 3. 后台修改预计开始日期 await adminLogin(adminLoginPage); await adminPage.goto(); const editResult = await adminPage.editOrder(orderName, { name: orderName, // 编辑时需要提供 name expectedStartDate: updatedDate, }); expect(editResult.success).toBe(true); console.debug(`[跨端同步] 后台修改日期: ${originalDate} → ${updatedDate}`); // 4. 小程序验证日期更新 await miniPage.navigateToOrderList(); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); // 检查更新后的日期 const updatedPageText = await miniPage.page.textContent('body'); expect(updatedPageText).toContain(updatedDate); console.debug(`[跨端同步] 小程序日期已更新: ${updatedDate}`); }); test('验证数据同步时间(≤ 10 秒)', async ({ enterpriseMiniPage: miniPage, orderManagementPage: adminPage, adminLoginPage }) => { // 测试数据 const orderName = `E2E测试_同步时间_${Date.now()}`; const SYNC_TIMEOUT = 10000; // 10 秒 // 1. 后台登录并创建订单(需要关联到测试用户的平台和公司) await adminLogin(adminLoginPage); await adminPage.goto(); const createResult = await adminPage.createOrder({ name: orderName, platformName: TEST_PLATFORM_NAME, companyName: TEST_COMPANY_NAME, expectedStartDate: '2026-02-01', }); expect(createResult.success).toBe(true); console.debug(`[跨端同步] 后台创建订单: ${orderName}`); // 2. 记录开始时间并等待小程序显示 const startTime = Date.now(); await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.navigateToOrderList(); // 等待订单出现,最多等待 10 秒 const found = await waitForOrderUpdate(miniPage, orderName, SYNC_TIMEOUT); const syncTime = Date.now() - startTime; console.debug(`[跨端同步] 数据同步耗时: ${syncTime}ms`); // 验证订单在 10 秒内同步 expect(found).toBe(true); expect(syncTime).toBeLessThanOrEqual(SYNC_TIMEOUT); console.debug(`[跨端同步] 数据同步时间验证通过: ${syncTime}ms ≤ ${SYNC_TIMEOUT}ms`); }); }); /** * 测试场景:底部导航验证 (AC7) */ test.describe.serial('底部导航功能测试', () => { test.use({ storageState: undefined }); test('应该显示底部导航栏', async ({ enterpriseMiniPage: miniPage }) => { // 1. 登录并导航到订单列表 await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.goto(`http://localhost:8080${ORDER_LIST_SELECTORS.pageUrl}`); await miniPage.page.waitForTimeout(TIMEOUTS.LONG); // 2. 验证底部导航栏可见 const { bottomNav } = ORDER_LIST_SELECTORS; // 使用 .nth() 或 CSS 类选择器避免 strict mode violation // 底部导航栏在页面底部,使用更具体的选择器 await expect(miniPage.page.getByText(bottomNav.home)).toBeVisible(); await expect(miniPage.page.getByText(bottomNav.talent)).toBeVisible(); // "订单"文本出现在多个位置,使用 exact: true 精确匹配底部导航 await expect(miniPage.page.getByText(bottomNav.order, { exact: true })).toBeVisible(); await expect(miniPage.page.getByText(bottomNav.data, { exact: true })).toBeVisible(); await expect(miniPage.page.getByText(bottomNav.settings, { exact: true })).toBeVisible(); console.debug('[导航] 底部导航栏可见'); }); test('应该可以通过底部导航返回首页', async ({ enterpriseMiniPage: miniPage }) => { // 1. 登录并导航到订单列表 await miniPage.goto(); await miniPage.login(TEST_USER_PHONE, TEST_USER_PASSWORD); await miniPage.expectLoginSuccess(); await miniPage.page.goto(`http://localhost:8080${ORDER_LIST_SELECTORS.pageUrl}`); await miniPage.page.waitForTimeout(TIMEOUTS.LONG); // 2. 点击"首页"导航(使用 EnterpriseMiniPage 的 clickBottomNav 方法) await miniPage.clickBottomNav('home'); await miniPage.page.waitForTimeout(TIMEOUTS.MEDIUM); // 3. 验证导航到首页 const currentUrl = miniPage.page.url(); expect(currentUrl).toContain('/mini/pages/yongren/dashboard'); console.debug('[导航] 成功返回首页'); }); }); });