import { TIMEOUTS } from '../../utils/timeouts'; import { test } from '../../utils/test-setup'; import { readFileSync } from 'fs'; import { join, dirname } from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const testUsers = JSON.parse(readFileSync(join(__dirname, '../../fixtures/test-users.json'), 'utf-8')); test.describe.serial('残疾人管理 - 参数错误调试测试', () => { test.beforeEach(async ({ adminLoginPage, disabilityPersonPage }) => { // 以管理员身份登录后台 await adminLoginPage.goto(); await adminLoginPage.login(testUsers.admin.username, testUsers.admin.password); await adminLoginPage.expectLoginSuccess(); await disabilityPersonPage.goto(); }); test('调试: 新增残疾人时的参数错误问题', async ({ disabilityPersonPage, page }) => { // 生成唯一的测试数据 - 使用数据库中实际存在的省份 const timestamp = Date.now(); const testData = { name: `调试测试_${timestamp}`, gender: '男', idCard: `11010119900101123${timestamp % 10}`, disabilityId: `5110011990010${timestamp % 10}`, disabilityType: '视力残疾', disabilityLevel: '一级', phone: `1380013800${timestamp % 10}`, idAddress: '湖北省武汉市测试街道1号', province: '湖北省', city: '武汉市' }; console.log('\n========== 开始调试测试 =========='); console.log('测试数据:', JSON.stringify(testData, null, 2)); // 1. 打开创建对话框 console.log('\n[步骤1] 打开新增残疾人对话框...'); await disabilityPersonPage.openCreateDialog(); console.log('✓ 对话框已打开'); // 2. 填写表单 - 简化版,只填必填项和能工作的字段 console.log('\n[步骤2] 填写表单...'); await disabilityPersonPage.page.waitForSelector('form#create-form', { state: 'visible', timeout: TIMEOUTS.DIALOG }); // 填写基本信息 - 使用键盘选择枚举字段 await disabilityPersonPage.page.getByLabel('姓名 *').fill(testData.name); // 性别默认是"男",跳过 await disabilityPersonPage.page.getByLabel('身份证号 *').fill(testData.idCard); await disabilityPersonPage.page.getByLabel('残疾证号 *').fill(testData.disabilityId); // 使用键盘选择残疾类型(第2个选项是"视力残疾") const disabilityTypeCombobox = disabilityPersonPage.page.getByRole('combobox', { name: '残疾类型 *' }); await disabilityTypeCombobox.click(); await disabilityPersonPage.page.keyboard.press('ArrowDown'); // 跳过"请选择残疾类型" await disabilityPersonPage.page.keyboard.press('ArrowDown'); // 选择"视力残疾" await disabilityPersonPage.page.keyboard.press('Enter'); // 使用键盘选择残疾等级(第2个选项是"一级") const disabilityLevelCombobox = disabilityPersonPage.page.getByRole('combobox', { name: '残疾等级 *' }); await disabilityLevelCombobox.click(); await disabilityPersonPage.page.keyboard.press('ArrowDown'); // 跳过"请选择残疾等级" await disabilityPersonPage.page.keyboard.press('ArrowDown'); // 选择"一级" await disabilityPersonPage.page.keyboard.press('Enter'); await disabilityPersonPage.page.getByLabel('联系电话 *').fill(testData.phone); await disabilityPersonPage.page.getByLabel('身份证地址 *').fill(testData.idAddress); // 居住地址 - 异步加载类型,能工作 await disabilityPersonPage.selectRadixOption('省份 *', testData.province); await disabilityPersonPage.page.waitForTimeout(TIMEOUTS.MEDIUM); await disabilityPersonPage.selectRadixOption('城市', testData.city); console.log('✓ 表单已填写'); // 3. 提交表单并捕获网络请求 console.log('\n[步骤3] 提交表单并监听网络请求...'); const result = await disabilityPersonPage.submitForm(); console.log('\n========== 网络请求分析 =========='); if (result.responses.length === 0) { console.log('⚠️ 没有捕获到任何相关网络请求!'); } else { result.responses.forEach((resp, index) => { console.log(`\n[请求 ${index + 1}]`); console.log(' URL:', resp.url); console.log(' 方法:', resp.method); console.log(' 状态码:', resp.status); console.log(' OK:', resp.ok); console.log(' 状态文本:', resp.statusText); if (resp.requestBody) { console.log(' 请求体:', JSON.stringify(resp.requestBody, null, 2)); } if (resp.responseBody) { console.log(' 响应体:', JSON.stringify(resp.responseBody, null, 2)); } // 关键检查:状态码与响应内容 console.log('\n 🔍 状态码分析:'); if (resp.status === 200) { console.log(' ✓ HTTP 状态码是 200 (成功)'); if (resp.responseBody) { if (resp.responseBody.message) { console.log(' 响应消息:', resp.responseBody.message); } if (resp.responseBody.error) { console.log(' ⚠️ 响应包含错误信息:', resp.responseBody.error); } } } else if (resp.status === 201) { console.log(' ✓ HTTP 状态码是 201 (已创建)'); } else if (resp.status >= 400) { console.log(' ✗ HTTP 错误状态码:', resp.status); } console.log('\n 响应头:', JSON.stringify(resp.responseHeaders, null, 2)); }); } console.log('\n========== UI 提示分析 =========='); console.log('有错误提示:', result.hasError); console.log('有成功提示:', result.hasSuccess); if (result.errorMessage) { console.log('❌ 错误消息:', result.errorMessage); } if (result.successMessage) { console.log('✅ 成功消息:', result.successMessage); } // 4. 验证数据是否真的创建成功 console.log('\n[步骤4] 验证数据是否创建成功...'); // 关闭对话框(如果还在) const dialogVisible = await page.locator('[role="dialog"]').isVisible().catch(() => false); if (dialogVisible) { await page.keyboard.press('Escape'); await page.waitForTimeout(TIMEOUTS.MEDIUM); } // 刷新页面 await page.reload(); await page.waitForLoadState('networkidle'); await disabilityPersonPage.goto(); // 搜索刚创建的残疾人 await disabilityPersonPage.searchByName(testData.name); await page.waitForTimeout(TIMEOUTS.LONG); const personExists = await disabilityPersonPage.personExists(testData.name); console.log('\n========== 最终结论 =========='); console.log('数据实际创建成功:', personExists); if (result.hasError && personExists) { console.log('\n🔴 问题确认!'); console.log(' - 前端显示:创建失败(参数错误)'); console.log(' - 实际情况:数据已成功创建到数据库'); console.log('\n 可能原因:'); console.log(' 1. 前端判断响应状态码的逻辑错误'); console.log(' 2. 后端返回 200 但前端期望 201'); console.log(' 3. 响应数据结构不符合前端预期'); console.log(' 4. 前端错误处理逻辑将成功误判为失败'); } else if (result.hasSuccess && personExists) { console.log('\n✅ 测试通过:前端显示成功,数据也创建成功'); } else if (!result.hasError && !result.hasSuccess) { console.log('\n⚠️ 没有任何提示消息'); } console.log('================================\n'); }); });