| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 |
- import { test, expect } from '../../utils/test-setup';
- test.describe('组合查询流程 E2E 测试', () => {
- test.beforeEach(async ({ page }) => {
- // 确保数据库中有测试数据
- await page.goto('/');
- });
- test('完整组合查询流程 - 大巴拼车', async ({ page }) => {
- // 1. 访问首页
- await page.goto('/');
- await expect(page.locator('text=便捷出行')).toBeVisible();
- // 2. 验证默认选择大巴拼车
- const busOption = page.locator('text=大巴拼车').first();
- await expect(busOption).toBeVisible();
- await expect(busOption).toHaveClass(/bg-gradient-to-r/);
- // 3. 设置出发地
- const startLocationButton = page.locator('button:has-text("出发地")').first();
- await startLocationButton.click();
- // 等待地区选择器显示
- await expect(page.locator('text=选择出发地')).toBeVisible();
- // 选择地区(这里使用模拟的地区选择)
- const confirmButton = page.locator('button:has-text("确认")').first();
- await confirmButton.click();
- // 4. 设置目的地
- const endLocationButton = page.locator('button:has-text("目的地")').first();
- await endLocationButton.click();
- await expect(page.locator('text=选择目的地')).toBeVisible();
- await confirmButton.click();
- // 5. 验证地区选择成功
- await expect(page.locator('text=北京市 北京市 朝阳区')).toBeVisible();
- // 6. 点击查询按钮
- const searchButton = page.locator('button:has-text("查询路线")').first();
- await searchButton.click();
- // 7. 验证导航到活动选择页面
- await expect(page).toHaveURL(/.*pages\/select-activity\/ActivitySelectPage/);
- // 8. 验证查询参数传递正确
- const currentUrl = page.url();
- expect(currentUrl).toContain('vehicleType=bus');
- expect(currentUrl).toContain('travelMode=carpool');
- expect(currentUrl).toContain('startAreaIds=');
- expect(currentUrl).toContain('endAreaIds=');
- // 9. 验证活动选择页面显示
- await expect(page.locator('text=选择活动')).toBeVisible();
- // 10. 选择第一个活动
- const firstActivity = page.locator('[data-testid="activity-card"]').first();
- await firstActivity.click();
- // 11. 验证导航到班次列表页面
- await expect(page).toHaveURL(/.*pages\/schedule-list\/ScheduleListPage/);
- // 12. 验证班次列表页面显示
- await expect(page.locator('text=路线列表')).toBeVisible();
- // 13. 验证路线卡片显示车型和出行方式
- const routeCard = page.locator('[data-testid="route-card"]').first();
- await expect(routeCard).toBeVisible();
- // 验证包含车型信息
- await expect(routeCard).toContainText(/大巴|中巴|小车|商务车/);
- // 验证包含出行方式信息
- await expect(routeCard).toContainText(/拼车|包车/);
- });
- test('完整组合查询流程 - 商务车', async ({ page }) => {
- // 1. 访问首页
- await page.goto('/');
- await expect(page.locator('text=便捷出行')).toBeVisible();
- // 2. 选择商务车
- const businessOption = page.locator('text=商务车').first();
- await businessOption.click();
- await expect(businessOption).toHaveClass(/bg-gradient-to-r/);
- // 3. 设置出发地
- const startLocationButton = page.locator('button:has-text("出发地")').first();
- await startLocationButton.click();
- // 等待地区选择器显示
- await expect(page.locator('text=选择出发地')).toBeVisible();
- // 选择地区
- const confirmButton = page.locator('button:has-text("确认")').first();
- await confirmButton.click();
- // 4. 设置目的地
- const endLocationButton = page.locator('button:has-text("目的地")').first();
- await endLocationButton.click();
- await expect(page.locator('text=选择目的地')).toBeVisible();
- await confirmButton.click();
- // 5. 点击查询按钮
- const searchButton = page.locator('button:has-text("查询路线")').first();
- await searchButton.click();
- // 6. 验证导航到活动选择页面
- await expect(page).toHaveURL(/.*pages\/select-activity\/ActivitySelectPage/);
- // 7. 验证商务车组合查询参数
- const currentUrl = page.url();
- expect(currentUrl).toContain('vehicleType=business');
- expect(currentUrl).toContain('travelMode=carpool,charter');
- // 8. 选择第一个活动
- const firstActivity = page.locator('[data-testid="activity-card"]').first();
- await firstActivity.click();
- // 9. 验证导航到班次列表页面
- await expect(page).toHaveURL(/.*pages\/schedule-list\/ScheduleListPage/);
- // 10. 验证班次列表页面显示
- await expect(page.locator('text=路线列表')).toBeVisible();
- // 11. 验证路线卡片显示商务车信息
- const routeCard = page.locator('[data-testid="route-card"]').first();
- await expect(routeCard).toBeVisible();
- // 验证包含商务车型信息
- await expect(routeCard).toContainText(/商务车/);
- });
- test('完整组合查询流程 - 包车', async ({ page }) => {
- // 1. 访问首页
- await page.goto('/');
- await expect(page.locator('text=便捷出行')).toBeVisible();
- // 2. 选择包车
- const charterOption = page.locator('text=包车').first();
- await charterOption.click();
- await expect(charterOption).toHaveClass(/bg-gradient-to-r/);
- // 3. 设置出发地
- const startLocationButton = page.locator('button:has-text("出发地")').first();
- await startLocationButton.click();
- // 等待地区选择器显示
- await expect(page.locator('text=选择出发地')).toBeVisible();
- // 选择地区
- const confirmButton = page.locator('button:has-text("确认")').first();
- await confirmButton.click();
- // 4. 设置目的地
- const endLocationButton = page.locator('button:has-text("目的地")').first();
- await endLocationButton.click();
- await expect(page.locator('text=选择目的地')).toBeVisible();
- await confirmButton.click();
- // 5. 点击查询按钮
- const searchButton = page.locator('button:has-text("查询路线")').first();
- await searchButton.click();
- // 6. 验证导航到活动选择页面
- await expect(page).toHaveURL(/.*pages\/select-activity\/ActivitySelectPage/);
- // 7. 验证包车组合查询参数
- const currentUrl = page.url();
- expect(currentUrl).toContain('vehicleType=bus,business');
- expect(currentUrl).toContain('travelMode=charter');
- // 8. 选择第一个活动
- const firstActivity = page.locator('[data-testid="activity-card"]').first();
- await firstActivity.click();
- // 9. 验证导航到班次列表页面
- await expect(page).toHaveURL(/.*pages\/schedule-list\/ScheduleListPage/);
- // 10. 验证班次列表页面显示
- await expect(page.locator('text=路线列表')).toBeVisible();
- // 11. 验证路线卡片显示包车信息
- const routeCard = page.locator('[data-testid="route-card"]').first();
- await expect(routeCard).toBeVisible();
- // 验证包含包车出行方式信息
- await expect(routeCard).toContainText(/包车/);
- });
- test('组合查询选项切换', async ({ page }) => {
- // 1. 访问首页
- await page.goto('/');
- // 2. 验证默认选择大巴拼车
- const busOption = page.locator('text=大巴拼车').first();
- const businessOption = page.locator('text=商务车').first();
- const charterOption = page.locator('text=包车').first();
- await expect(busOption).toHaveClass(/bg-gradient-to-r/);
- await expect(businessOption).not.toHaveClass(/text-white/);
- await expect(charterOption).not.toHaveClass(/text-white/);
- // 3. 切换到商务车
- await businessOption.click();
- await expect(busOption).not.toHaveClass(/text-white/);
- await expect(businessOption).toHaveClass(/bg-gradient-to-r/);
- await expect(charterOption).not.toHaveClass(/text-white/);
- // 4. 切换到包车
- await charterOption.click();
- await expect(busOption).not.toHaveClass(/text-white/);
- await expect(businessOption).not.toHaveClass(/text-white/);
- await expect(charterOption).toHaveClass(/bg-gradient-to-r/);
- // 5. 切换回大巴拼车
- await busOption.click();
- await expect(busOption).toHaveClass(/bg-gradient-to-r/);
- await expect(businessOption).not.toHaveClass(/text-white/);
- await expect(charterOption).not.toHaveClass(/text-white/);
- });
- test('组合查询参数验证', async ({ page }) => {
- // 1. 访问首页
- await page.goto('/');
- // 2. 设置出发地和目的地
- const startLocationButton = page.locator('button:has-text("出发地")').first();
- await startLocationButton.click();
- const confirmButton = page.locator('button:has-text("确认")').first();
- await confirmButton.click();
- const endLocationButton = page.locator('button:has-text("目的地")').first();
- await endLocationButton.click();
- await confirmButton.click();
- // 3. 测试大巴拼车参数
- const busOption = page.locator('text=大巴拼车').first();
- await busOption.click();
- const searchButton = page.locator('button:has-text("查询路线")').first();
- await searchButton.click();
- let currentUrl = page.url();
- expect(currentUrl).toContain('vehicleType=bus');
- expect(currentUrl).toContain('travelMode=carpool');
- // 4. 返回首页测试商务车参数
- await page.goBack();
- const businessOption = page.locator('text=商务车').first();
- await businessOption.click();
- await searchButton.click();
- currentUrl = page.url();
- expect(currentUrl).toContain('vehicleType=business');
- expect(currentUrl).toContain('travelMode=carpool,charter');
- // 5. 返回首页测试包车参数
- await page.goBack();
- const charterOption = page.locator('text=包车').first();
- await charterOption.click();
- await searchButton.click();
- currentUrl = page.url();
- expect(currentUrl).toContain('vehicleType=bus,business');
- expect(currentUrl).toContain('travelMode=charter');
- });
- test('组合查询结果验证', async ({ page }) => {
- // 1. 访问首页并设置查询条件
- await page.goto('/');
- // 设置出发地和目的地
- const startLocationButton = page.locator('button:has-text("出发地")').first();
- await startLocationButton.click();
- const confirmButton = page.locator('button:has-text("确认")').first();
- await confirmButton.click();
- const endLocationButton = page.locator('button:has-text("目的地")').first();
- await endLocationButton.click();
- await confirmButton.click();
- // 2. 测试大巴拼车查询结果
- const busOption = page.locator('text=大巴拼车').first();
- await busOption.click();
- const searchButton = page.locator('button:has-text("查询路线")').first();
- await searchButton.click();
- // 等待活动选择页面加载
- await expect(page.locator('text=选择活动')).toBeVisible();
- // 验证活动列表显示
- const activityCards = page.locator('[data-testid="activity-card"]');
- await expect(activityCards.first()).toBeVisible();
- // 3. 选择活动并验证路线列表
- await activityCards.first().click();
- // 等待班次列表页面加载
- await expect(page.locator('text=路线列表')).toBeVisible();
- // 验证路线列表显示
- const routeCards = page.locator('[data-testid="route-card"]');
- await expect(routeCards.first()).toBeVisible();
- // 4. 验证路线信息包含车型和出行方式
- const firstRouteCard = routeCards.first();
- const routeText = await firstRouteCard.textContent();
- // 验证包含车型信息
- expect(routeText).toMatch(/大巴|中巴|小车|商务车/);
- // 验证包含出行方式信息
- expect(routeText).toMatch(/拼车|包车/);
- // 5. 验证路线详情显示完整信息
- await firstRouteCard.click();
- // 验证路线详情页面显示
- await expect(page.locator('text=路线详情')).toBeVisible();
- // 验证详情页面包含车型和出行方式信息
- const detailText = await page.textContent('body');
- expect(detailText).toMatch(/车型.*[大巴|中巴|小车|商务车]/);
- expect(detailText).toMatch(/出行方式.*[拼车|包车]/);
- });
- test('组合查询错误处理', async ({ page }) => {
- // 1. 访问首页
- await page.goto('/');
- // 2. 不设置出发地和目的地,直接点击查询
- const searchButton = page.locator('button:has-text("查询路线")').first();
- await searchButton.click();
- // 3. 验证页面没有跳转(应该停留在首页)
- await expect(page).toHaveURL(/\/$/);
- // 4. 验证错误提示显示(如果有的话)
- // 这里可以根据实际实现检查是否有错误提示
- // 5. 只设置出发地,不设置目的地
- const startLocationButton = page.locator('button:has-text("出发地")').first();
- await startLocationButton.click();
- const confirmButton = page.locator('button:has-text("确认")').first();
- await confirmButton.click();
- // 6. 再次点击查询
- await searchButton.click();
- // 7. 验证页面仍然没有跳转
- await expect(page).toHaveURL(/\/$/);
- // 8. 设置目的地
- const endLocationButton = page.locator('button:has-text("目的地")').first();
- await endLocationButton.click();
- await confirmButton.click();
- // 9. 现在应该可以正常查询
- await searchButton.click();
- // 10. 验证页面跳转到活动选择页面
- await expect(page).toHaveURL(/.*pages\/select-activity\/ActivitySelectPage/);
- });
- test('组合查询性能测试', async ({ page }) => {
- // 1. 访问首页
- await page.goto('/');
- // 2. 设置查询条件
- const startLocationButton = page.locator('button:has-text("出发地")').first();
- await startLocationButton.click();
- const confirmButton = page.locator('button:has-text("确认")').first();
- await confirmButton.click();
- const endLocationButton = page.locator('button:has-text("目的地")').first();
- await endLocationButton.click();
- await confirmButton.click();
- // 3. 测试不同组合查询的响应时间
- const travelOptions = [
- { name: '大巴拼车', expectedParams: { vehicleType: 'bus', travelMode: 'carpool' } },
- { name: '商务车', expectedParams: { vehicleType: 'business', travelMode: 'carpool,charter' } },
- { name: '包车', expectedParams: { vehicleType: 'bus,business', travelMode: 'charter' } }
- ];
- for (const option of travelOptions) {
- // 选择出行方式
- const optionElement = page.locator(`text=${option.name}`).first();
- await optionElement.click();
- // 记录开始时间
- const startTime = Date.now();
- // 点击查询
- const searchButton = page.locator('button:has-text("查询路线")').first();
- await searchButton.click();
- // 等待页面加载完成
- await expect(page).toHaveURL(/.*pages\/select-activity\/ActivitySelectPage/);
- // 记录结束时间
- const endTime = Date.now();
- const responseTime = endTime - startTime;
- // 验证响应时间在合理范围内(小于5秒)
- expect(responseTime).toBeLessThan(5000);
- // 验证查询参数正确
- const currentUrl = page.url();
- expect(currentUrl).toContain(`vehicleType=${option.expectedParams.vehicleType}`);
- expect(currentUrl).toContain(`travelMode=${option.expectedParams.travelMode}`);
- // 返回首页进行下一个测试
- await page.goBack();
- }
- });
- });
|