/** * 综合视觉对比:生产 vs 本地,多个关键位置 * 收集决定性证据,让用户指出"logo 原本是书法体但生产不是"指的具体位置 */ import { chromium } from 'playwright'; import fs from 'node:fs'; import path from 'node:path'; const OUT = path.join(process.cwd(), 'dogfood-ui-audit', 'logo-compare'); fs.mkdirSync(OUT, { recursive: true }); const PAGES = [ { name: 'home', url: '/' }, { name: 'about-brand', url: '/about/brand' }, { name: 'about', url: '/about' }, ]; const TARGETS = [ { tag: 'prod', base: 'https://www.novalon.cn' }, { tag: 'local', base: 'http://127.0.0.1:3000' }, ]; const browser = await chromium.launch(); for (const t of TARGETS) { const ctx = await browser.newContext({ viewport: { width: 1440, height: 900 }, deviceScaleFactor: 2, }); const page = await ctx.newPage(); for (const p of PAGES) { const url = t.base + p.url; try { await page.goto(url, { waitUntil: 'networkidle', timeout: 60000 }); await page.waitForTimeout(1500); // 截首屏(Hero + header 区域) await page.screenshot({ path: path.join(OUT, `${t.tag}-${p.name}-fold.png`), clip: { x: 0, y: 0, width: 1440, height: 900 }, }); console.log(`[${t.tag}] ${p.name} OK`); } catch (e) { console.log(`[${t.tag}] ${p.name} FAILED ${e.message.slice(0, 100)}`); } } await ctx.close(); } await browser.close(); console.log('\n✓ 输出:' + OUT);