disability-person-debug.spec.ts 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import { TIMEOUTS } from '../../utils/timeouts';
  2. import { test } from '../../utils/test-setup';
  3. import { readFileSync } from 'fs';
  4. import { join, dirname } from 'path';
  5. import { fileURLToPath } from 'url';
  6. const __filename = fileURLToPath(import.meta.url);
  7. const __dirname = dirname(__filename);
  8. const testUsers = JSON.parse(readFileSync(join(__dirname, '../../fixtures/test-users.json'), 'utf-8'));
  9. test.describe.serial('残疾人管理 - 参数错误调试测试', () => {
  10. test.beforeEach(async ({ adminLoginPage, disabilityPersonPage }) => {
  11. // 以管理员身份登录后台
  12. await adminLoginPage.goto();
  13. await adminLoginPage.login(testUsers.admin.username, testUsers.admin.password);
  14. await adminLoginPage.expectLoginSuccess();
  15. await disabilityPersonPage.goto();
  16. });
  17. test('调试: 新增残疾人时的参数错误问题', async ({ disabilityPersonPage, page }) => {
  18. // 生成唯一的测试数据 - 使用数据库中实际存在的省份
  19. const timestamp = Date.now();
  20. const testData = {
  21. name: `调试测试_${timestamp}`,
  22. gender: '男',
  23. idCard: `11010119900101123${timestamp % 10}`,
  24. disabilityId: `5110011990010${timestamp % 10}`,
  25. disabilityType: '视力残疾',
  26. disabilityLevel: '一级',
  27. phone: `1380013800${timestamp % 10}`,
  28. idAddress: '湖北省武汉市测试街道1号',
  29. province: '湖北省',
  30. city: '武汉市'
  31. };
  32. console.log('\n========== 开始调试测试 ==========');
  33. console.log('测试数据:', JSON.stringify(testData, null, 2));
  34. // 1. 打开创建对话框
  35. console.log('\n[步骤1] 打开新增残疾人对话框...');
  36. await disabilityPersonPage.openCreateDialog();
  37. console.log('✓ 对话框已打开');
  38. // 2. 填写表单 - 简化版,只填必填项和能工作的字段
  39. console.log('\n[步骤2] 填写表单...');
  40. await disabilityPersonPage.page.waitForSelector('form#create-form', { state: 'visible', timeout: TIMEOUTS.DIALOG });
  41. // 填写基本信息 - 使用键盘选择枚举字段
  42. await disabilityPersonPage.page.getByLabel('姓名 *').fill(testData.name);
  43. // 性别默认是"男",跳过
  44. await disabilityPersonPage.page.getByLabel('身份证号 *').fill(testData.idCard);
  45. await disabilityPersonPage.page.getByLabel('残疾证号 *').fill(testData.disabilityId);
  46. // 使用键盘选择残疾类型(第2个选项是"视力残疾")
  47. const disabilityTypeCombobox = disabilityPersonPage.page.getByRole('combobox', { name: '残疾类型 *' });
  48. await disabilityTypeCombobox.click();
  49. await disabilityPersonPage.page.keyboard.press('ArrowDown'); // 跳过"请选择残疾类型"
  50. await disabilityPersonPage.page.keyboard.press('ArrowDown'); // 选择"视力残疾"
  51. await disabilityPersonPage.page.keyboard.press('Enter');
  52. // 使用键盘选择残疾等级(第2个选项是"一级")
  53. const disabilityLevelCombobox = disabilityPersonPage.page.getByRole('combobox', { name: '残疾等级 *' });
  54. await disabilityLevelCombobox.click();
  55. await disabilityPersonPage.page.keyboard.press('ArrowDown'); // 跳过"请选择残疾等级"
  56. await disabilityPersonPage.page.keyboard.press('ArrowDown'); // 选择"一级"
  57. await disabilityPersonPage.page.keyboard.press('Enter');
  58. await disabilityPersonPage.page.getByLabel('联系电话 *').fill(testData.phone);
  59. await disabilityPersonPage.page.getByLabel('身份证地址 *').fill(testData.idAddress);
  60. // 居住地址 - 异步加载类型,能工作
  61. await disabilityPersonPage.selectRadixOption('省份 *', testData.province);
  62. await disabilityPersonPage.page.waitForTimeout(TIMEOUTS.MEDIUM);
  63. await disabilityPersonPage.selectRadixOption('城市', testData.city);
  64. console.log('✓ 表单已填写');
  65. // 3. 提交表单并捕获网络请求
  66. console.log('\n[步骤3] 提交表单并监听网络请求...');
  67. const result = await disabilityPersonPage.submitForm();
  68. console.log('\n========== 网络请求分析 ==========');
  69. if (result.responses.length === 0) {
  70. console.log('⚠️ 没有捕获到任何相关网络请求!');
  71. } else {
  72. result.responses.forEach((resp, index) => {
  73. console.log(`\n[请求 ${index + 1}]`);
  74. console.log(' URL:', resp.url);
  75. console.log(' 方法:', resp.method);
  76. console.log(' 状态码:', resp.status);
  77. console.log(' OK:', resp.ok);
  78. console.log(' 状态文本:', resp.statusText);
  79. if (resp.requestBody) {
  80. console.log(' 请求体:', JSON.stringify(resp.requestBody, null, 2));
  81. }
  82. if (resp.responseBody) {
  83. console.log(' 响应体:', JSON.stringify(resp.responseBody, null, 2));
  84. }
  85. // 关键检查:状态码与响应内容
  86. console.log('\n 🔍 状态码分析:');
  87. if (resp.status === 200) {
  88. console.log(' ✓ HTTP 状态码是 200 (成功)');
  89. if (resp.responseBody) {
  90. if (resp.responseBody.message) {
  91. console.log(' 响应消息:', resp.responseBody.message);
  92. }
  93. if (resp.responseBody.error) {
  94. console.log(' ⚠️ 响应包含错误信息:', resp.responseBody.error);
  95. }
  96. }
  97. } else if (resp.status === 201) {
  98. console.log(' ✓ HTTP 状态码是 201 (已创建)');
  99. } else if (resp.status >= 400) {
  100. console.log(' ✗ HTTP 错误状态码:', resp.status);
  101. }
  102. console.log('\n 响应头:', JSON.stringify(resp.responseHeaders, null, 2));
  103. });
  104. }
  105. console.log('\n========== UI 提示分析 ==========');
  106. console.log('有错误提示:', result.hasError);
  107. console.log('有成功提示:', result.hasSuccess);
  108. if (result.errorMessage) {
  109. console.log('❌ 错误消息:', result.errorMessage);
  110. }
  111. if (result.successMessage) {
  112. console.log('✅ 成功消息:', result.successMessage);
  113. }
  114. // 4. 验证数据是否真的创建成功
  115. console.log('\n[步骤4] 验证数据是否创建成功...');
  116. // 关闭对话框(如果还在)
  117. const dialogVisible = await page.locator('[role="dialog"]').isVisible().catch(() => false);
  118. if (dialogVisible) {
  119. await page.keyboard.press('Escape');
  120. await page.waitForTimeout(TIMEOUTS.MEDIUM);
  121. }
  122. // 刷新页面
  123. await page.reload();
  124. await page.waitForLoadState('networkidle');
  125. await disabilityPersonPage.goto();
  126. // 搜索刚创建的残疾人
  127. await disabilityPersonPage.searchByName(testData.name);
  128. await page.waitForTimeout(TIMEOUTS.LONG);
  129. const personExists = await disabilityPersonPage.personExists(testData.name);
  130. console.log('\n========== 最终结论 ==========');
  131. console.log('数据实际创建成功:', personExists);
  132. if (result.hasError && personExists) {
  133. console.log('\n🔴 问题确认!');
  134. console.log(' - 前端显示:创建失败(参数错误)');
  135. console.log(' - 实际情况:数据已成功创建到数据库');
  136. console.log('\n 可能原因:');
  137. console.log(' 1. 前端判断响应状态码的逻辑错误');
  138. console.log(' 2. 后端返回 200 但前端期望 201');
  139. console.log(' 3. 响应数据结构不符合前端预期');
  140. console.log(' 4. 前端错误处理逻辑将成功误判为失败');
  141. } else if (result.hasSuccess && personExists) {
  142. console.log('\n✅ 测试通过:前端显示成功,数据也创建成功');
  143. } else if (!result.hasError && !result.hasSuccess) {
  144. console.log('\n⚠️ 没有任何提示消息');
  145. }
  146. console.log('================================\n');
  147. });
  148. });