bank-name-delete.spec.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import { test, expect } from '../../utils/test-setup';
  2. import { readFileSync } from 'fs';
  3. import { join, dirname } from 'path';
  4. import { fileURLToPath } from 'url';
  5. const __filename = fileURLToPath(import.meta.url);
  6. const __dirname = dirname(__filename);
  7. const testUsers = JSON.parse(readFileSync(join(__dirname, '../../fixtures/test-users.json'), 'utf-8'));
  8. /**
  9. * 验证银行名称删除功能的 E2E 测试
  10. */
  11. test.describe.serial('银行名称删除功能验证', () => {
  12. test.beforeEach(async ({ adminLoginPage }) => {
  13. // 以管理员身份登录后台
  14. await adminLoginPage.goto();
  15. await adminLoginPage.login(testUsers.admin.username, testUsers.admin.password);
  16. await adminLoginPage.expectLoginSuccess();
  17. });
  18. test('应该能够成功删除银行名称', async ({ page }) => {
  19. console.log('1. 导航到银行名称管理页面...');
  20. // 监听网络请求
  21. const deleteRequests: any[] = [];
  22. page.on('request', (request) => {
  23. if (request.url().includes('/bank-names')) {
  24. console.log(' 网络请求: ' + request.method() + ' ' + request.url());
  25. deleteRequests.push({ method: request.method(), url: request.url() });
  26. }
  27. });
  28. page.on('response', async (response) => {
  29. if (response.url().includes('/bank-names')) {
  30. const status = response.status();
  31. console.log(' 网络响应: ' + status + ' ' + response.url());
  32. if (status >= 400) {
  33. try {
  34. const body = await response.text();
  35. console.log(' 错误响应体: ' + body);
  36. } catch (e) {
  37. // ignore
  38. }
  39. }
  40. }
  41. });
  42. // 监听控制台消息
  43. page.on('console', (msg) => {
  44. if (msg.type() === 'error') {
  45. console.log(' 控制台错误: ' + msg.text());
  46. }
  47. });
  48. await page.goto('/admin/bank-names');
  49. await page.waitForLoadState('domcontentloaded');
  50. await page.waitForTimeout(2000);
  51. // 截图初始状态
  52. await page.screenshot({ path: 'test-results/bank-delete-1-initial.png' });
  53. console.log(' 初始页面截图已保存');
  54. // 查找银行记录和删除按钮
  55. console.log('2. 查找银行记录和删除按钮...');
  56. // 查找所有包含 data-testid 的删除按钮
  57. const deleteButtons = await page.locator('[data-testid^="delete-button-"]').all();
  58. console.log(' 找到 ' + deleteButtons.length + ' 个删除按钮');
  59. expect(deleteButtons.length, '应该找到至少一个删除按钮').toBeGreaterThan(0);
  60. // 获取第一个删除按钮
  61. const firstButton = deleteButtons[0];
  62. const firstTestId = await firstButton.getAttribute('data-testid');
  63. console.log(' 使用删除按钮: ' + firstTestId);
  64. // 获取删除前的记录数量
  65. const initialRows = await page.locator('[data-testid^="type-row-"]').all();
  66. console.log(' 删除前有 ' + initialRows.length + ' 条银行名称记录');
  67. // 点击删除按钮
  68. console.log('3. 点击删除按钮...');
  69. await firstButton.click();
  70. await page.waitForTimeout(1500);
  71. await page.screenshot({ path: 'test-results/bank-delete-2-confirm.png' });
  72. console.log(' 确认对话框截图已保存');
  73. // 验证删除对话框出现
  74. console.log('4. 验证删除对话框...');
  75. const deleteDialog = page.locator('[data-testid="delete-dialog"]');
  76. await expect(deleteDialog, '删除对话框应该出现').toBeVisible({ timeout: 5000 });
  77. console.log(' ✓ 删除对话框已出现');
  78. // 查找确认按钮
  79. const confirmButton = page.locator('[data-testid="delete-confirm-button"]');
  80. await expect(confirmButton, '确认删除按钮应该存在').toBeVisible();
  81. console.log(' ✓ 找到确认删除按钮');
  82. // 点击确认删除
  83. console.log('5. 点击确认删除...');
  84. await confirmButton.click();
  85. // 等待删除完成 - 等待更长时间
  86. console.log(' 等待删除完成...');
  87. await page.waitForTimeout(5000);
  88. await page.screenshot({ path: 'test-results/bank-delete-3-after.png' });
  89. console.log(' 删除后页面截图已保存');
  90. // 检查是否有错误提示
  91. console.log('6. 检查删除结果...');
  92. const errorToast = page.locator('[data-sonner-toast][data-type="error"]');
  93. const hasError = await errorToast.isVisible({ timeout: 1000 }).catch(() => false);
  94. if (hasError) {
  95. const errorText = await errorToast.innerText();
  96. console.log(' ✗ 错误提示: "' + errorText + '"');
  97. }
  98. // 检查是否有成功 toast
  99. const successToast = page.locator('[data-sonner-toast][data-type="success"]');
  100. const hasSuccess = await successToast.isVisible({ timeout: 1000 }).catch(() => false);
  101. if (hasSuccess) {
  102. const toastText = await successToast.innerText();
  103. console.log(' ✓ 成功提示: "' + toastText + '"');
  104. }
  105. // 验证删除对话框状态
  106. const dialogStillVisible = await deleteDialog.isVisible().catch(() => false);
  107. console.log(' 删除对话框是否仍可见: ' + dialogStillVisible);
  108. if (dialogStillVisible) {
  109. console.log(' ✗ 删除对话框未关闭,删除可能失败');
  110. // 检查删除按钮状态
  111. const confirmButtonDisabled = await confirmButton.isDisabled();
  112. console.log(' 确认按钮是否禁用: ' + confirmButtonDisabled);
  113. }
  114. // 如果对话框关闭了,验证记录数量
  115. if (!dialogStillVisible) {
  116. console.log(' ✓ 删除对话框已关闭');
  117. const finalRows = await page.locator('[data-testid^="type-row-"]').all();
  118. console.log(' 删除后有 ' + finalRows.length + ' 条银行名称记录');
  119. if (finalRows.length < initialRows.length) {
  120. console.log(' ✓ 记录数量已减少');
  121. } else {
  122. console.log(' ? 记录数量未减少');
  123. }
  124. }
  125. console.log('7. 测试完成');
  126. console.log(' 网络请求数量: ' + deleteRequests.length);
  127. });
  128. });