kindergarten_java/reading-platform-frontend/tests/e2e/schedule/schedule-real.spec.ts
Claude Opus 4.6 bd244a7c7d test: 修复排课功能冲突检测API测试并完成全面测试
- 修复冲突检测API测试参数错误(使用正确的classId/scheduledDate/scheduledTime)
- 新增全面API测试脚本 (test_all_apis.sh)
- 新增Python Playwright浏览器自动化测试 (test_schedule_page.py)
- 新增前端E2E测试用例 (schedule-comprehensive.spec.ts, schedule-real.spec.ts)
- 更新测试报告,所有API测试通过

测试覆盖:
- 登录认证 
- 课程套餐列表(两层结构)
- 排课列表/课表/日历视图 
- 班级/教师列表 
- 冲突检测API  (已修复)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 20:34:41 +08:00

104 lines
3.6 KiB
TypeScript

import { test, expect } from '@playwright/test';
/**
* 学校端排课功能实际测试
* 使用真实登录流程和等待策略
*/
const BASE_URL = 'http://localhost:5174';
test.describe('学校端排课功能 - 真实流程测试', () => {
test.beforeEach(async ({ page }) => {
// 每个测试前先登录
await page.goto(`${BASE_URL}/login`);
await page.waitForTimeout(2000);
// 先选择学校角色
await page.click('.role-btn:has-text("学校")');
await page.waitForTimeout(500);
// 填写登录表单
await page.fill('input[placeholder*="账号"]', 'school1');
await page.fill('input[placeholder*="密码"]', '123456');
// 点击登录按钮
await page.click('button:has-text("登录")');
// 等待登录成功
await page.waitForURL(/\/school/, { timeout: 15000 });
await page.waitForTimeout(2000);
});
test('应该能访问排课页面', async ({ page }) => {
// 通过侧边栏导航到排课页面
const scheduleLink = page.locator('a:has-text("课程排期"), .menu-item:has-text("课程排期")').first();
const count = await scheduleLink.count();
if (count > 0) {
await scheduleLink.click();
await page.waitForTimeout(2000);
} else {
// 直接访问URL
await page.goto(`${BASE_URL}/school/schedule`);
await page.waitForLoadState('networkidle', { timeout: 10000 });
}
// 截图
await page.screenshot({ path: 'screenshots/schedule-page.png' });
// 检查页面标题
const title = await page.locator('h1, h2, .page-header').first().textContent();
console.log('✅ 页面标题:', title);
});
test('应该能查看列表视图', async ({ page }) => {
await page.goto(`${BASE_URL}/school/schedule`);
await page.waitForLoadState('domcontentloaded', { timeout: 10000 });
await page.waitForTimeout(3000);
// 截图
await page.screenshot({ path: 'screenshots/schedule-list-view.png' });
// 检查是否有Tab
const tabs = page.locator('.ant-tabs-tab, [role="tab"]');
const tabCount = await tabs.count();
console.log(`✅ 找到 ${tabCount} 个Tab`);
// 检查是否有表格
const table = page.locator('.ant-table');
const hasTable = await table.count() > 0;
console.log(`✅ 有表格: ${hasTable}`);
});
test('应该能测试后端API', async ({ page }) => {
// 先登录获取token
await page.goto(`${BASE_URL}/login`);
await page.fill('input[placeholder*="账号"], input[name="username"]', 'school1');
await page.fill('input[placeholder*="密码"], input[name="password"]', '123456');
await page.click('button[type="submit"]');
await page.waitForURL(/\/school/, { timeout: 10000 });
// 从localStorage获取token
const token = await page.evaluate(() => localStorage.getItem('token'));
// 测试课程套餐API
const packagesResponse = await page.request.get(`${BASE_URL}/api/v1/school/packages`, {
headers: { 'Authorization': `Bearer ${token}` }
});
console.log('✅ 课程套餐API状态:', packagesResponse.status());
expect(packagesResponse.ok()).toBeTruthy();
const packagesData = await packagesResponse.json();
console.log('✅ 课程套餐数据:', JSON.stringify(packagesData).substring(0, 200));
// 测试排课列表API
const schedulesResponse = await page.request.get(`${BASE_URL}/api/v1/school/schedules?pageNum=1&pageSize=10`, {
headers: { 'Authorization': `Bearer ${token}` }
});
console.log('✅ 排课列表API状态:', schedulesResponse.status());
expect(schedulesResponse.ok()).toBeTruthy();
});
});