const { chromium } = require('playwright-core'); const http = require('http'); const BASE = 'http://127.0.0.1:8010'; const UI = 'http://127.0.0.1:5175'; function apiPost(path, body) { return new Promise((resolve, reject) => { const data = JSON.stringify(body); const req = http.request(BASE + path, { method:'POST', headers:{'Content-Type':'application/json','Content-Length':Buffer.byteLength(data)} }, res => { let b=''; res.on('data',c=>b+=c); res.on('end',()=>resolve({status:res.statusCode, body:b})); }); req.on('error', reject); req.write(data); req.end(); }); } (async () => { const login = await apiPost('/api/auth/login', {phone:'13943441149', password:'Test1234'}); const tok = JSON.parse(login.body).access_token; console.log('token:', tok ? 'yes' : 'NO'); const browser = await chromium.launch({ executablePath:'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', headless:true }); const ctx = await browser.newContext({ viewport:{width:1440,height:900} }); const page = await ctx.newPage(); const errors = []; page.on('console', m => { if (m.type()==='error') errors.push('CONSOLE: '+m.text().slice(0,150)); }); page.on('pageerror', e => errors.push('PAGEERR: '+e.message.slice(0,150))); // inject token await page.goto(UI + '/', { waitUntil:'networkidle' }); await page.evaluate((t) => { localStorage.setItem('access_token', t); localStorage.setItem('token', t); }, tok); const views = ['/', '/animation', '/exercise', '/mindmap', '/lesson-plan', '/exam', '/essay-grade', '/courseware/create', '/community', '/resources', '/classroom', '/assistant', '/profile', '/search']; for (let i=0;inull); const cnt = await page.locator('h1').count(); console.log(v, '| h1:', (h1||'').trim().slice(0,40), '| h1count:', cnt); await page.screenshot({ path:'audit_shots/v'+i+'.png', fullPage:false }); } catch(e){ console.log(v, 'NAV-ERR', e.message.slice(0,100)); } } console.log('=== ERRORS ('+errors.length+') ==='); errors.slice(0,15).forEach(e=>console.log(e)); await browser.close(); })();