/** * P1 - 课程预约流程测试: 搜索团课 → 查看详情 → 预约课程 → 查看我的课程 → 取消预约 * * 前置条件: * - 微信开发者工具已打开,CLI 端口 45869 * - 后端服务 http://192.168.110.64:8084 已启动 * - 存在可预约的团课数据 */ const { launchMiniProgram, connectMiniProgram, waitForPage, screenshot, switchTab, generateTestId } = require('../helpers/automator'); const SearchPage = require('../pages/SearchPage'); const CourseDetailPage = require('../pages/CourseDetailPage'); const MyCoursesPage = require('../pages/MyCoursesPage'); let miniProgram; const TEST_ID = generateTestId(); describe('P1 - 课程预约流程', () => { beforeAll(async () => { console.log(`[P1] 测试 ID: ${TEST_ID}`); try { miniProgram = await connectMiniProgram(); console.log('[P1] 已连接小程序'); } catch (e) { console.log('[P1] 连接失败,尝试启动小程序...'); miniProgram = await launchMiniProgram(); } await miniProgram.waitFor(3000); // 先切换到首页(确保在小程序中) try { const page = await miniProgram.currentPage(); if (page.path && page.path.includes('login')) { await miniProgram.reLaunch('/pages/index/index'); await miniProgram.waitFor(2000); } } catch (e) { // ignore } }, 60000); afterAll(async () => { if (miniProgram) { global.__MINI_PROGRAM__ = miniProgram; } }); test('TC-BOOK-001: 进入团课搜索页', async () => { let page; try { page = await miniProgram.currentPage(); if (!page.path || !page.path.includes('search')) { await switchTab(miniProgram, 1); await miniProgram.waitFor(2000); } } catch (e) { await switchTab(miniProgram, 1); await miniProgram.waitFor(2000); } const searchPage = new SearchPage(miniProgram); await searchPage.waitForLoad(); page = await miniProgram.currentPage(); expect(page.path).toContain('pages/search/search'); await screenshot(miniProgram, `member_booking_search_${TEST_ID}`); }); test('TC-BOOK-002: 查看课程列表', async () => { const searchPage = new SearchPage(miniProgram); const courseCount = await searchPage.getCourseCount(); console.log(`[TC-BOOK-002] 课程列表数量: ${courseCount}`); // 如果有课程,记录第一门课程信息 if (courseCount > 0) { console.log('[TC-BOOK-002] 课程列表不为空,可以进行后续测试'); expect(courseCount).toBeGreaterThan(0); } else { // 课程列表为空时,记录警告但不失败(可能是测试环境数据问题) console.warn('[TC-BOOK-002] 课程列表为空,后续预约测试可能无法完成'); // 尝试刷新 const page = await miniProgram.currentPage(); await miniProgram.callWxMethod('startPullDownRefresh', {}); await miniProgram.waitFor(2000); const refreshedCount = await searchPage.getCourseCount(); console.log(`[TC-BOOK-002] 刷新后课程列表数量: ${refreshedCount}`); } }); test('TC-BOOK-003: 点击课程进入详情页', async () => { const searchPage = new SearchPage(miniProgram); const courseCount = await searchPage.getCourseCount(); if (courseCount === 0) { console.warn('[TC-BOOK-003] 没有可点击的课程,跳过此测试'); return; } await searchPage.clickCourse(0); // 等待详情页加载 const detailPage = new CourseDetailPage(miniProgram); try { await detailPage.waitForLoad(); } catch (e) { // 可能导航方式不同,直接检查当前页 const page = await miniProgram.currentPage(); console.log(`[TC-BOOK-003] 当前页面: ${page.path}`); } const page = await miniProgram.currentPage(); console.log(`[TC-BOOK-003] 课程详情页: ${page.path}`); await screenshot(miniProgram, `member_booking_detail_${TEST_ID}`); }); test('TC-BOOK-004: 查看课程详情信息', async () => { const page = await miniProgram.currentPage(); if (!page.path || !page.path.includes('course-detail')) { console.warn('[TC-BOOK-004] 不在课程详情页,跳过测试'); return; } const detailPage = new CourseDetailPage(miniProgram); const courseInfo = await detailPage.getCourseInfo(); console.log('[TC-BOOK-004] 课程信息:', JSON.stringify(courseInfo)); await screenshot(miniProgram, `member_booking_detail_info_${TEST_ID}`); }); test('TC-BOOK-005: 预约课程', async () => { const page = await miniProgram.currentPage(); if (!page.path || !page.path.includes('course-detail')) { console.warn('[TC-BOOK-005] 不在课程详情页,跳过预约测试'); return; } const detailPage = new CourseDetailPage(miniProgram); const booked = await detailPage.bookCourse(); console.log(`[TC-BOOK-005] 预约结果: ${booked}`); await screenshot(miniProgram, `member_booking_result_${TEST_ID}`); // 验证预约成功提示 if (booked) { const success = await detailPage.verifyBookingSuccess(); console.log(`[TC-BOOK-005] 预约成功验证: ${success}`); } }); test('TC-BOOK-006: 查看我的课程', async () => { // 切换到我的课程 Tab await switchTab(miniProgram, 2); await miniProgram.waitFor(2000); const myCoursesPage = new MyCoursesPage(miniProgram); try { await myCoursesPage.waitForLoad(); } catch (e) { console.warn('[TC-BOOK-006] 等待页面加载异常:', e.message); } const page = await miniProgram.currentPage(); expect(page.path).toContain('pages/my-courses/my-courses'); const bookingCount = await myCoursesPage.getBookingCount(); console.log(`[TC-BOOK-006] 我的课程数量: ${bookingCount}`); await screenshot(miniProgram, `member_booking_my_courses_${TEST_ID}`); }); test('TC-BOOK-007: 取消预约', async () => { const myCoursesPage = new MyCoursesPage(miniProgram); const bookingCount = await myCoursesPage.getBookingCount(); if (bookingCount === 0) { console.warn('[TC-BOOK-007] 没有可取消的预约,跳过测试'); return; } const cancelled = await myCoursesPage.cancelBooking(0); console.log(`[TC-BOOK-007] 取消预约结果: ${cancelled}`); if (cancelled) { await miniProgram.waitFor(1500); // 验证取消后数量减少 const newCount = await myCoursesPage.getBookingCount(); console.log(`[TC-BOOK-007] 取消后课程数量: ${newCount}`); } await screenshot(miniProgram, `member_booking_cancelled_${TEST_ID}`); }); });