kindergarten_java/lesingle-edu-reading-platform-frontend/tests/e2e/school/04-students.spec.ts
En 40589f59e7 chore: 重命名项目目录
前后端目录重命名:
- 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 文档中的路径引用
2026-03-26 11:31:47 +08:00

192 lines
6.6 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 学校端 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: '未找到分配家长按钮',
});
}
});
});