verify-status-consistency.mjs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/env node
  2. /**
  3. * 顶栏状态一致性验证(2026-11-10)
  4. *
  5. * 验证点:容器空闲几分钟后,顶栏**不再**显示「状态未同步」,
  6. * 而是与侧栏/通讯录一致的正常态(空闲 / 已完成)。
  7. */
  8. import { chromium } from 'playwright';
  9. import { mkdir } from 'node:fs/promises';
  10. import { dirname, resolve } from 'node:path';
  11. import { fileURLToPath } from 'node:url';
  12. const here = dirname(fileURLToPath(import.meta.url));
  13. const outDir = resolve(here, '..', 'test-results', 'status-consistency');
  14. const BASE = process.env.BASE_URL || 'http://127.0.0.1:4300';
  15. await mkdir(outDir, { recursive: true });
  16. const browser = await chromium.launch({ channel: 'chrome' });
  17. const page = await browser.newPage({ viewport: { width: 1440, height: 900 } });
  18. const errors = [];
  19. page.on('pageerror', (e) => errors.push(String(e)));
  20. await page.goto(`${BASE}/desktop/chat`, { waitUntil: 'domcontentloaded' });
  21. await page.waitForTimeout(8000);
  22. const s = page.locator('text=使用HTML根据我这个').first();
  23. if (await s.count()) {
  24. await s.click();
  25. await page.waitForTimeout(6000);
  26. }
  27. const snap = await page.evaluate(() => {
  28. const task = document.querySelector('.task-text')?.textContent?.trim() ?? '';
  29. const sub = document.querySelector('[class*="chat-sub"], .chat-subtitle, header')?.textContent?.trim() ?? '';
  30. return { task, header: sub.slice(0, 80) };
  31. });
  32. await page.screenshot({ path: `${outDir}/header.png` });
  33. const bad = /状态未同步/.test(snap.task);
  34. console.log(`顶栏任务行:${snap.task || '(空)'}`);
  35. console.log(`匹配到「状态未同步」:${bad ? '是 ← 不通过' : '否'}`);
  36. console.log(`页面错误:${errors.length ? errors.join(' | ') : '无'}`);
  37. const pass = !bad && errors.length === 0;
  38. console.log(`\n${pass ? '✓ PASS' : '✗ FAIL'}:顶栏不再误报状态未同步`);
  39. await browser.close();
  40. process.exit(pass ? 0 : 1);