前后端目录重命名: - reading-platform-java/ → lesingle-edu-reading-platform-backend/ - reading-platform-frontend/ → lesingle-edu-reading-platform-frontend/ 更新相关文件: - 所有 shell 脚本中的目录引用 - pom.xml 和 application.yml 中的项目名称 - package.json 中的项目名称 - .claude/CLAUDE.md 中的路径引用 - README 文档中的路径引用
192 lines
6.6 KiB
TypeScript
192 lines
6.6 KiB
TypeScript
/**
|
||
* 学校端 E2E 测试 - 学生管理功能
|
||
*/
|
||
|
||
import { test, expect } from '@playwright/test';
|
||
import { loginAsSchool, clickSubMenu } from './helpers';
|
||
import { SCHOOL_CONFIG } from './fixtures';
|
||
|
||
test.describe('学校端学生管理功能', () => {
|
||
test.beforeEach(async ({ page }) => {
|
||
await loginAsSchool(page);
|
||
});
|
||
|
||
test('测试 1: 访问学生管理页面', async ({ page }) => {
|
||
// 1. 点击人员管理 → 学生管理
|
||
await clickSubMenu(page, '人员管理', '学生管理');
|
||
await page.waitForURL('**/school/students*', { timeout: 10000 });
|
||
|
||
// 2. 验证页面标题(使用 first 避免 strict mode violation)
|
||
await expect(page.getByRole('heading', { name: '学生管理' }).first()).toBeVisible({ timeout: 5000 });
|
||
|
||
// 3. 验证表格加载
|
||
const tableExists = await page.locator('table, .ant-table').count() > 0;
|
||
test.info().annotations.push({
|
||
type: 'info',
|
||
description: `学生表格:${tableExists ? '存在' : '不存在'}`,
|
||
});
|
||
|
||
// 截图
|
||
await page.screenshot({ path: 'test-results/school-students-list.png' });
|
||
});
|
||
|
||
test('测试 2: 创建学生', async ({ page }) => {
|
||
test.slow();
|
||
|
||
// 1. 进入学生管理页面
|
||
await clickSubMenu(page, '人员管理', '学生管理');
|
||
await page.waitForURL('**/school/students*', { timeout: 10000 });
|
||
await page.waitForTimeout(1000);
|
||
|
||
// 2. 点击新建按钮
|
||
const createBtn = page.locator('button:has-text("新建")').or(page.locator('button:has-text("创建")')).or(page.locator('button:has-text("新增")'));
|
||
if (await createBtn.count() > 0) {
|
||
await createBtn.first().click();
|
||
await page.waitForTimeout(500);
|
||
|
||
// 3. 验证弹窗显示
|
||
await expect(page.locator('.ant-modal')).toBeVisible({ timeout: 5000 });
|
||
|
||
// 4. 填写学生信息
|
||
const studentName = `测试学生_${Date.now()}`;
|
||
const nameInput = page.locator('input[placeholder*="学生姓名"]').or(page.locator('input[formitemlabel*="姓名"]'));
|
||
if (await nameInput.count() > 0) {
|
||
await nameInput.first().fill(studentName);
|
||
}
|
||
|
||
// 5. 点击确定按钮
|
||
const okBtn = page.locator('button:has-text("确定")').or(page.locator('button:has-text("确认")')).or(page.locator('button:has-text("保存")'));
|
||
if (await okBtn.count() > 0) {
|
||
await okBtn.first().click();
|
||
await page.waitForTimeout(2000);
|
||
|
||
// 6. 验证创建成功
|
||
const successMsg = await page.locator('.ant-message-success').count() > 0;
|
||
test.info().annotations.push({
|
||
type: successMsg ? 'success' : 'info',
|
||
description: `创建学生:${successMsg ? '成功' : '完成'}`,
|
||
});
|
||
}
|
||
} else {
|
||
test.info().annotations.push({
|
||
type: 'warning',
|
||
description: '未找到新建学生按钮',
|
||
});
|
||
}
|
||
});
|
||
|
||
test('测试 3: 查看学生详情', async ({ page }) => {
|
||
// 1. 进入学生管理页面
|
||
await clickSubMenu(page, '人员管理', '学生管理');
|
||
await page.waitForURL('**/school/students*', { timeout: 10000 });
|
||
await page.waitForTimeout(1000);
|
||
|
||
// 2. 查找查看按钮
|
||
const viewBtn = page.locator('button:has-text("查看")').or(page.locator('a:has-text("查看")')).first();
|
||
if (await viewBtn.count() > 0) {
|
||
await viewBtn.click();
|
||
await page.waitForTimeout(2000);
|
||
|
||
// 3. 验证详情显示
|
||
const modalExists = await page.locator('.ant-modal').count() > 0;
|
||
test.info().annotations.push({
|
||
type: 'info',
|
||
description: `学生详情:${modalExists ? '弹窗显示' : '页面显示'}`,
|
||
});
|
||
} else {
|
||
test.info().annotations.push({
|
||
type: 'warning',
|
||
description: '未找到查看按钮',
|
||
});
|
||
}
|
||
});
|
||
|
||
test('测试 4: 编辑学生', async ({ page }) => {
|
||
test.slow();
|
||
|
||
// 1. 进入学生管理页面
|
||
await clickSubMenu(page, '人员管理', '学生管理');
|
||
await page.waitForURL('**/school/students*', { timeout: 10000 });
|
||
await page.waitForTimeout(1000);
|
||
|
||
// 2. 查找编辑按钮
|
||
const editBtn = page.locator('button:has-text("编辑")').first();
|
||
if (await editBtn.count() > 0) {
|
||
await editBtn.click();
|
||
await page.waitForTimeout(1000);
|
||
|
||
// 3. 验证弹窗显示
|
||
await expect(page.locator('.ant-modal')).toBeVisible({ timeout: 5000 });
|
||
|
||
// 4. 保存修改
|
||
const saveBtn = page.locator('button:has-text("确定")').or(page.locator('button:has-text("保存")'));
|
||
if (await saveBtn.count() > 0) {
|
||
await saveBtn.first().click();
|
||
await page.waitForTimeout(2000);
|
||
|
||
const successMsg = await page.locator('.ant-message-success').count() > 0;
|
||
test.info().annotations.push({
|
||
type: successMsg ? 'success' : 'info',
|
||
description: `编辑学生:${successMsg ? '成功' : '完成'}`,
|
||
});
|
||
}
|
||
} else {
|
||
test.info().annotations.push({
|
||
type: 'warning',
|
||
description: '未找到编辑按钮',
|
||
});
|
||
}
|
||
});
|
||
|
||
test('测试 5: 学生筛选功能', async ({ page }) => {
|
||
// 1. 进入学生管理页面
|
||
await clickSubMenu(page, '人员管理', '学生管理');
|
||
await page.waitForURL('**/school/students*', { timeout: 10000 });
|
||
await page.waitForTimeout(1000);
|
||
|
||
// 2. 查找筛选器
|
||
const searchInput = page.locator('input[placeholder*="搜索"]').or(page.locator('input[placeholder*="学生姓名"]'));
|
||
if (await searchInput.count() > 0) {
|
||
await searchInput.first().fill('测试');
|
||
await page.waitForTimeout(1000);
|
||
|
||
test.info().annotations.push({
|
||
type: 'success',
|
||
description: '筛选功能:可用',
|
||
});
|
||
}
|
||
|
||
// 截图
|
||
await page.screenshot({ path: 'test-results/school-students-filter.png' });
|
||
});
|
||
|
||
test('测试 6: 分配家长', async ({ page }) => {
|
||
test.slow();
|
||
|
||
// 1. 进入学生管理页面
|
||
await clickSubMenu(page, '人员管理', '学生管理');
|
||
await page.waitForURL('**/school/students*', { timeout: 10000 });
|
||
await page.waitForTimeout(1000);
|
||
|
||
// 2. 查找分配家长按钮
|
||
const assignBtn = page.locator('button:has-text("分配家长")').or(page.locator('button:has-text("绑定家长")')).first();
|
||
if (await assignBtn.count() > 0) {
|
||
await assignBtn.click();
|
||
await page.waitForTimeout(1000);
|
||
|
||
// 3. 验证弹窗显示
|
||
await expect(page.locator('.ant-modal')).toBeVisible({ timeout: 5000 });
|
||
|
||
test.info().annotations.push({
|
||
type: 'success',
|
||
description: '分配家长功能:可用',
|
||
});
|
||
} else {
|
||
test.info().annotations.push({
|
||
type: 'warning',
|
||
description: '未找到分配家长按钮',
|
||
});
|
||
}
|
||
});
|
||
});
|