const { chromium } = require('playwright-core'); const fs = require('fs'); (async () => { const CHROME = String.raw`C:\Program Files\Google\Chrome\Application\chrome.exe`; const browser = await chromium.launch({ executablePath: CHROME, headless: true }); const page = await browser.newPage({ viewport: { width: 1366, height: 850 } }); const errors = []; page.on('console', m => { if (m.type() === 'error') errors.push(m.text()); }); page.on('pageerror', e => errors.push('PAGEERROR: ' + e.message)); const base = 'http://127.0.0.1:8010'; const loginRes = await fetch(base + '/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ phone: '13943441149', password: 'Test1234' }) }); const loginData = await loginRes.json(); const token = loginData.data?.access_token || loginData.access_token; await page.goto('http://127.0.0.1:5175/login'); await page.evaluate(t => { localStorage.setItem('access_token', t); localStorage.setItem('refresh_token', 'r'); }, token); await page.goto('http://127.0.0.1:5175/animation'); await page.waitForTimeout(2000); // open gallery via the tpl-btn await page.locator('.tpl-btn').first().click(); await page.waitForTimeout(1500); const cards = await page.locator('.tg-card').count(); console.log('gallery cards:', cards); const ours = ['勾股定理','单位圆','排序算法','DNA','牛顿第二','板块构造']; const results = []; const allCards = page.locator('.tg-card'); for (let i = 0; i < cards; i++) { await allCards.nth(i).click(); await page.waitForTimeout(700); const name = (await page.locator('.tg-main-head h3').textContent().catch(()=> '') || '').trim(); const isOurs = ours.some(k => name.includes(k)); if (isOurs) { const beforeErr = errors.length; const frame = page.frameLocator('.tg-preview-wrap iframe').first(); let stageOk = false; try { stageOk = (await frame.locator('body').innerHTML({ timeout: 3000 }).catch(()=> '')).length > 200; } catch(e) {} await page.waitForTimeout(300); const newErr = errors.length - beforeErr; results.push({ name, stageOk, newErr }); console.log(`[${name}] rendered=${stageOk} newErr=${newErr}`); } } await page.screenshot({ path: '../audit_shots/_tpl_gallery.png' }); console.log('TOTAL_CONSOLE_ERRORS:', errors.length); console.log('OURS_CHECKED:', results.length, 'ALL_RENDERED:', results.every(r => r.stageOk)); if (errors.length) console.log('ERR_SAMPLES:', errors.slice(0,5)); fs.writeFileSync('../audit_shots/_tpl_results.json', JSON.stringify({ totalCards: cards, errors: errors.slice(0,15), results }, null, 2)); await browser.close(); })();