import assert from 'node:assert/strict'; import { mkdir, readFile, writeFile } from 'node:fs/promises'; import { chromium } from 'playwright'; // 由真实业务与 TLS 接收器准备记录;仅从公开页面检查所选投递及详情滚动。 const data = JSON.parse(await readFile(process.env.DELIVERY_CASE_FILE, 'utf8')); const base = process.env.FRONTEND_URL || 'http://127.0.0.1:18765'; 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' }); const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } }); const errors = []; page.on('pageerror', error => errors.push(error.message)); try { await page.goto(`${base}/#/platform/login`); await page.getByLabel('员工账户', { exact: true }).fill(data.username); await page.getByLabel('密码', { exact: true }).fill(data.password); await page.getByRole('button', { name: '登录', exact: true }).click(); await page.waitForURL(url => !url.hash.endsWith('/login')); await page.goto(`${base}/#/platform/deliveries`); await page.locator('.platform-pages > [role="status"]').waitFor({ state: 'hidden' }); for (const size of [{ width: 1440, height: 1000 }, { width: 390, height: 844 }]) { await page.setViewportSize(size); for (const delivery of data.deliveries) { const row = page.locator('.platform-pages tr').filter({ has: page.locator('.platform-identifier').filter({ hasText: delivery.event }) }); await row.getByRole('button', { name: '查看详情', exact: true }).click(); const dialog = page.getByRole('dialog', { name: '投递详情', exact: true }); await dialog.getByText(delivery.id, { exact: true }).waitFor(); await dialog.getByText(delivery.event, { exact: true }).waitFor(); await dialog.getByText(delivery.eventType, { exact: true }).waitFor(); await dialog.getByText('接收端已确认 HTTP 204', { exact: true }).waitFor(); const details = dialog.locator('.platform-delivery-detail'); const height = (await details.boundingBox()).height; assert.ok(height <= Math.min(560, size.height * 0.6) + 1); const receipt = dialog.getByText(delivery.result, { exact: true }); await receipt.scrollIntoViewIfNeeded(); const geometry = await receipt.boundingBox(); assert.ok(geometry.y >= 0 && geometry.y + geometry.height <= size.height + 1); await dialog.getByRole('button', { name: '关闭详情', exact: true }).click(); await dialog.waitFor({ state: 'hidden' }); } } assert.deepEqual(errors, []); const report = { records: data.deliveries.length, widths: [1440, 390], realTlsReceipts: data.deliveries.length, browserErrors: errors, generatedModelCalls: 0, screenshots: 0 }; await mkdir(new URL('../../.work/frontend-verification/', import.meta.url), { recursive: true }); await writeFile(new URL('../../.work/frontend-verification/platform-delivery-presentation.json', import.meta.url), JSON.stringify(report, null, 2)); console.log(JSON.stringify(report)); } finally { await browser.close(); }