244 lines
8.4 KiB
TypeScript
244 lines
8.4 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/growth*', { timeout: 10000 });
|
||
|
|
await page.waitForTimeout(1000);
|
||
|
|
|
||
|
|
// 2. 验证页面标题
|
||
|
|
await expect(page.locator('text=成长记录').or(page.locator('text=成长档案')).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-growth-list.png' });
|
||
|
|
});
|
||
|
|
|
||
|
|
test('测试 2: 创建成长记录', async ({ page }) => {
|
||
|
|
test.slow();
|
||
|
|
|
||
|
|
// 1. 进入成长记录页面
|
||
|
|
await clickSubMenu(page, '数据中心', '成长档案');
|
||
|
|
await page.waitForURL('**/school/growth*', { 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 descInput = page.locator('textarea[placeholder*="记录描述"]').or(page.locator('textarea[formitemlabel*="描述"]'));
|
||
|
|
if (await descInput.count() > 0) {
|
||
|
|
await descInput.first().fill(`测试成长记录_${Date.now()}`);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 选择记录类型
|
||
|
|
const typeSelect = page.locator('.ant-select').filter({ hasText: /记录类型/i }).first();
|
||
|
|
if (await typeSelect.count() > 0) {
|
||
|
|
await typeSelect.click();
|
||
|
|
await page.keyboard.press('ArrowDown');
|
||
|
|
await page.keyboard.press('Enter');
|
||
|
|
}
|
||
|
|
|
||
|
|
// 选择幼儿
|
||
|
|
const studentSelect = page.locator('.ant-select').filter({ hasText: /幼儿/i }).first();
|
||
|
|
if (await studentSelect.count() > 0) {
|
||
|
|
await studentSelect.click();
|
||
|
|
await page.keyboard.press('ArrowDown');
|
||
|
|
await page.keyboard.press('Enter');
|
||
|
|
}
|
||
|
|
|
||
|
|
// 评分
|
||
|
|
const scoreInput = page.locator('input[type="number"][placeholder*="评分"]').or(page.locator('input[formitemlabel*="评分"]'));
|
||
|
|
if (await scoreInput.count() > 0) {
|
||
|
|
await scoreInput.first().fill('5');
|
||
|
|
}
|
||
|
|
|
||
|
|
// 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/growth*', { 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/growth*', { 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/growth*', { 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-growth-filter.png' });
|
||
|
|
});
|
||
|
|
|
||
|
|
test('测试 6: 删除成长记录', async ({ page }) => {
|
||
|
|
test.slow();
|
||
|
|
|
||
|
|
// 1. 进入成长记录页面
|
||
|
|
await clickSubMenu(page, '数据中心', '成长档案');
|
||
|
|
await page.waitForURL('**/school/growth*', { timeout: 10000 });
|
||
|
|
await page.waitForTimeout(1000);
|
||
|
|
|
||
|
|
// 2. 查找删除按钮
|
||
|
|
const deleteBtn = page.locator('button:has-text("删除")').first();
|
||
|
|
if (await deleteBtn.count() > 0) {
|
||
|
|
await deleteBtn.click();
|
||
|
|
await page.waitForTimeout(500);
|
||
|
|
|
||
|
|
// 3. 确认删除
|
||
|
|
const confirmBtn = page.locator('button:has-text("确定")').or(page.locator('button:has-text("确认")'));
|
||
|
|
if (await confirmBtn.count() > 0) {
|
||
|
|
await confirmBtn.first().click();
|
||
|
|
await page.waitForTimeout(2000);
|
||
|
|
|
||
|
|
test.info().annotations.push({
|
||
|
|
type: 'success',
|
||
|
|
description: '删除成长记录:操作完成',
|
||
|
|
});
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
test.info().annotations.push({
|
||
|
|
type: 'warning',
|
||
|
|
description: '未找到删除按钮',
|
||
|
|
});
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
test('测试 7: 上传附件', async ({ page }) => {
|
||
|
|
test.slow();
|
||
|
|
|
||
|
|
// 1. 进入成长记录页面
|
||
|
|
await clickSubMenu(page, '数据中心', '成长档案');
|
||
|
|
await page.waitForURL('**/school/growth*', { timeout: 10000 });
|
||
|
|
await page.waitForTimeout(1000);
|
||
|
|
|
||
|
|
// 2. 查找上传按钮
|
||
|
|
const uploadBtn = page.locator('button:has-text("上传")').or(page.locator('button:has-text("添加附件")')).first();
|
||
|
|
if (await uploadBtn.count() > 0) {
|
||
|
|
await uploadBtn.click();
|
||
|
|
await page.waitForTimeout(1000);
|
||
|
|
|
||
|
|
test.info().annotations.push({
|
||
|
|
type: 'success',
|
||
|
|
description: '上传附件功能:可用',
|
||
|
|
});
|
||
|
|
} else {
|
||
|
|
test.info().annotations.push({
|
||
|
|
type: 'warning',
|
||
|
|
description: '未找到上传按钮',
|
||
|
|
});
|
||
|
|
}
|
||
|
|
});
|
||
|
|
});
|