travel-flow.spec.ts 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import { test, expect } from '@playwright/test'
  2. test.describe('完整出行流程E2E测试', () => {
  3. test('用户应该能够完成完整的出行查询流程', async ({ page }) => {
  4. // 1. 访问首页
  5. await page.goto('/')
  6. // 验证首页加载成功
  7. await expect(page.locator('text=便捷出行')).toBeVisible()
  8. await expect(page.locator('text=专业出行服务,安全舒适')).toBeVisible()
  9. // 2. 选择出行方式
  10. await page.click('text=商务车')
  11. await expect(page.locator('text=商务车').locator('..')).toHaveClass(/bg-blue-500/)
  12. // 3. 选择出发地区
  13. await page.click('text=请选择出发地区')
  14. await page.click('text=北京市')
  15. await expect(page.locator('text=北京市')).toBeVisible()
  16. // 4. 选择出发地点
  17. await page.fill('input[placeholder="搜索出发地点"]', '北京')
  18. await page.waitForTimeout(500) // 等待防抖
  19. await page.click('text=北京首都国际机场')
  20. await expect(page.locator('text=已选择: 北京首都国际机场')).toBeVisible()
  21. // 5. 选择目的地区
  22. await page.click('text=请选择目的地区')
  23. await page.click('text=上海市')
  24. await expect(page.locator('text=上海市')).toBeVisible()
  25. // 6. 选择目的地点
  26. await page.fill('input[placeholder="搜索目的地点"]', '上海')
  27. await page.waitForTimeout(500) // 等待防抖
  28. await page.click('text=上海虹桥机场')
  29. await expect(page.locator('text=已选择: 上海虹桥机场')).toBeVisible()
  30. // 7. 选择日期
  31. const tomorrow = new Date()
  32. tomorrow.setDate(tomorrow.getDate() + 1)
  33. const tomorrowStr = tomorrow.toISOString().split('T')[0]
  34. await page.fill('input[type="date"]', tomorrowStr)
  35. // 8. 查询路线
  36. await page.click('text=查询路线')
  37. // 9. 验证跳转到活动选择页面
  38. await page.waitForURL(/\/pages\/select-activity\/ActivitySelectPage/)
  39. await expect(page.locator('text=选择观看活动')).toBeVisible()
  40. await expect(page.locator('text=北京市 → 上海市')).toBeVisible()
  41. // 10. 选择活动
  42. await page.click('text=上海音乐节')
  43. // 11. 验证跳转到班次列表页面
  44. await page.waitForURL(/\/pages\/schedule-list\/ScheduleListPage/)
  45. await expect(page.locator('text=可选班次')).toBeVisible()
  46. await expect(page.locator('text=上海音乐节')).toBeVisible()
  47. // 12. 选择不同日期
  48. const dayAfterTomorrow = new Date()
  49. dayAfterTomorrow.setDate(dayAfterTomorrow.getDate() + 2)
  50. const dayAfterTomorrowStr = dayAfterTomorrow.toISOString().split('T')[0]
  51. await page.click(`text=${dayAfterTomorrowStr}`)
  52. // 13. 验证班次列表更新
  53. await expect(page.locator('text=选择出发日期')).toBeVisible()
  54. // 14. 选择班次(如果有可用班次)
  55. const availableSchedule = page.locator('text=立即购票').first()
  56. if (await availableSchedule.isVisible()) {
  57. await availableSchedule.click()
  58. // 这里可以继续验证预订流程
  59. }
  60. })
  61. test('省市区三级联动功能应该正常工作', async ({ page }) => {
  62. await page.goto('/')
  63. // 测试省份选择
  64. await page.click('text=请选择出发地区')
  65. await page.click('text=广东省')
  66. await expect(page.locator('text=广东省')).toBeVisible()
  67. // 验证城市列表加载
  68. await page.click('text=请选择城市')
  69. await expect(page.locator('text=广州市')).toBeVisible()
  70. await expect(page.locator('text=深圳市')).toBeVisible()
  71. // 选择城市
  72. await page.click('text=广州市')
  73. await expect(page.locator('text=广州市')).toBeVisible()
  74. // 验证区县列表加载
  75. await page.click('text=请选择区县')
  76. await expect(page.locator('text=天河区')).toBeVisible()
  77. await expect(page.locator('text=越秀区')).toBeVisible()
  78. // 选择区县
  79. await page.click('text=天河区')
  80. await expect(page.locator('text=广东省 广州市 天河区')).toBeVisible()
  81. })
  82. test('地点搜索功能应该正常工作', async ({ page }) => {
  83. await page.goto('/')
  84. // 测试地点搜索
  85. await page.fill('input[placeholder="搜索出发地点"]', '北京')
  86. await page.waitForTimeout(500)
  87. // 验证搜索结果
  88. await expect(page.locator('text=北京首都国际机场')).toBeVisible()
  89. await expect(page.locator('text=北京南站')).toBeVisible()
  90. // 选择地点
  91. await page.click('text=北京首都国际机场')
  92. await expect(page.locator('text=已选择: 北京首都国际机场')).toBeVisible()
  93. // 验证输入框值更新
  94. await expect(page.locator('input[placeholder="搜索出发地点"]')).toHaveValue('北京首都国际机场')
  95. })
  96. test('路线类型动态判断逻辑应该正确工作', async ({ page }) => {
  97. await page.goto('/')
  98. // 设置出发地和目的地
  99. await page.click('text=请选择出发地区')
  100. await page.click('text=北京市')
  101. await page.click('text=请选择目的地区')
  102. await page.click('text=上海市')
  103. // 搜索地点
  104. await page.fill('input[placeholder="搜索出发地点"]', '北京首都国际机场')
  105. await page.waitForTimeout(500)
  106. await page.click('text=北京首都国际机场')
  107. await page.fill('input[placeholder="搜索目的地点"]', '上海虹桥机场')
  108. await page.waitForTimeout(500)
  109. await page.click('text=上海虹桥机场')
  110. // 查询路线
  111. await page.click('text=查询路线')
  112. // 验证活动选择页面显示正确的路线类型
  113. await page.waitForURL(/\/pages\/select-activity\/ActivitySelectPage/)
  114. await expect(page.locator('text=去程活动')).toBeVisible()
  115. await expect(page.locator('text=返程活动')).toBeVisible()
  116. })
  117. test('边界场景:无数据时应该显示友好提示', async ({ page }) => {
  118. await page.goto('/')
  119. // 设置不存在的搜索条件
  120. await page.fill('input[placeholder="搜索出发地点"]', '不存在的城市')
  121. await page.waitForTimeout(500)
  122. // 验证显示无结果提示
  123. await expect(page.locator('text=未找到相关地点')).toBeVisible()
  124. // 查询无效路线
  125. await page.click('text=查询路线')
  126. // 验证活动页面显示无活动提示
  127. await page.waitForURL(/\/pages\/select-activity\/ActivitySelectPage/)
  128. await expect(page.locator('text=暂无相关活动')).toBeVisible()
  129. })
  130. test('并发查询应该正确处理', async ({ page }) => {
  131. await page.goto('/')
  132. // 快速连续操作
  133. await page.click('text=大巴拼车')
  134. await page.click('text=商务车')
  135. await page.click('text=包车')
  136. // 快速输入搜索
  137. await page.fill('input[placeholder="搜索出发地点"]', '北京')
  138. await page.fill('input[placeholder="搜索出发地点"]', '上海')
  139. await page.fill('input[placeholder="搜索出发地点"]', '广州')
  140. await page.waitForTimeout(500) // 等待防抖完成
  141. // 验证最终状态正确
  142. await expect(page.locator('text=包车').locator('..')).toHaveClass(/bg-blue-500/)
  143. await expect(page.locator('input[placeholder="搜索出发地点"]')).toHaveValue('广州')
  144. })
  145. })