platform-delivery-presentation.mjs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import assert from 'node:assert/strict';
  2. import { mkdir, readFile, writeFile } from 'node:fs/promises';
  3. import { chromium } from 'playwright';
  4. // 由真实业务与 TLS 接收器准备记录;仅从公开页面检查所选投递及详情滚动。
  5. const data = JSON.parse(await readFile(process.env.DELIVERY_CASE_FILE, 'utf8'));
  6. const base = process.env.FRONTEND_URL || 'http://127.0.0.1:18765';
  7. const browser = await chromium.launch({ headless: true, executablePath: process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE || 'C:/Users/Administrator/AppData/Local/ms-playwright/chromium-1228/chrome-win64/chrome.exe' });
  8. const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } });
  9. const errors = [];
  10. page.on('pageerror', error => errors.push(error.message));
  11. try {
  12. await page.goto(`${base}/#/platform/login`);
  13. await page.getByLabel('员工账户', { exact: true }).fill(data.username);
  14. await page.getByLabel('密码', { exact: true }).fill(data.password);
  15. await page.getByRole('button', { name: '登录', exact: true }).click();
  16. await page.waitForURL(url => !url.hash.endsWith('/login'));
  17. await page.goto(`${base}/#/platform/deliveries`);
  18. await page.locator('.platform-pages > [role="status"]').waitFor({ state: 'hidden' });
  19. for (const size of [{ width: 1440, height: 1000 }, { width: 390, height: 844 }]) {
  20. await page.setViewportSize(size);
  21. for (const delivery of data.deliveries) {
  22. const row = page.locator('.platform-pages tr').filter({ has: page.locator('.platform-identifier').filter({ hasText: delivery.event }) });
  23. await row.getByRole('button', { name: '查看详情', exact: true }).click();
  24. const dialog = page.getByRole('dialog', { name: '投递详情', exact: true });
  25. await dialog.getByText(delivery.id, { exact: true }).waitFor();
  26. await dialog.getByText(delivery.event, { exact: true }).waitFor();
  27. await dialog.getByText(delivery.eventType, { exact: true }).waitFor();
  28. await dialog.getByText('接收端已确认 HTTP 204', { exact: true }).waitFor();
  29. const details = dialog.locator('.platform-delivery-detail');
  30. const height = (await details.boundingBox()).height;
  31. assert.ok(height <= Math.min(560, size.height * 0.6) + 1);
  32. const receipt = dialog.getByText(delivery.result, { exact: true });
  33. await receipt.scrollIntoViewIfNeeded();
  34. const geometry = await receipt.boundingBox();
  35. assert.ok(geometry.y >= 0 && geometry.y + geometry.height <= size.height + 1);
  36. await dialog.getByRole('button', { name: '关闭详情', exact: true }).click();
  37. await dialog.waitFor({ state: 'hidden' });
  38. }
  39. }
  40. assert.deepEqual(errors, []);
  41. const report = { records: data.deliveries.length, widths: [1440, 390], realTlsReceipts: data.deliveries.length, browserErrors: errors, generatedModelCalls: 0, screenshots: 0 };
  42. await mkdir(new URL('../../.work/frontend-verification/', import.meta.url), { recursive: true });
  43. await writeFile(new URL('../../.work/frontend-verification/platform-delivery-presentation.json', import.meta.url), JSON.stringify(report, null, 2));
  44. console.log(JSON.stringify(report));
  45. } finally {
  46. await browser.close();
  47. }