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