发布:完整项目代码(三视图 + 词条数据 + 加载页等)
This commit is contained in:
+29
-51
@@ -3,69 +3,47 @@ import puppeteer from 'puppeteer-core';
|
||||
const CHROME = 'C:/Program Files/Google/Chrome/Application/chrome.exe';
|
||||
const URL = process.argv[2] || 'http://localhost:5199/';
|
||||
|
||||
// 轻量冒烟测试:不做完整渲染流程 / 不触发 Cesium,
|
||||
// 只检查「加载无 JS 报错 + loading 环出现 + 6 秒后淡出 + App 就绪」。
|
||||
// 用真实 GPU(不强制 swiftshader 软件渲染)。
|
||||
const browser = await puppeteer.launch({
|
||||
executablePath: CHROME,
|
||||
headless: 'new',
|
||||
args: ['--no-sandbox', '--disable-gpu', '--use-gl=swiftshader', '--enable-unsafe-swiftshader', '--window-size=1440,900'],
|
||||
args: ['--no-sandbox', '--window-size=1440,900'],
|
||||
});
|
||||
const page = await browser.newPage();
|
||||
await page.setViewport({ width: 1440, height: 900 });
|
||||
|
||||
const errors = [];
|
||||
page.on('pageerror', (e) => errors.push('pageerror: ' + e.message));
|
||||
page.on('console', (m) => { if (m.type() === 'error') errors.push('console: ' + m.text()); });
|
||||
page.on('console', (m) => {
|
||||
// preview 模式无 HMR,WebSocket 连接失败是正常现象,过滤掉
|
||||
if (m.type() === 'error' && !/WebSocket|ERR_CONNECTION/i.test(m.text())) {
|
||||
errors.push('console: ' + m.text());
|
||||
}
|
||||
});
|
||||
|
||||
await page.goto(URL, { waitUntil: 'domcontentloaded', timeout: 60000 });
|
||||
await new Promise((r) => setTimeout(r, 6000));
|
||||
await page.goto(URL, { waitUntil: 'domcontentloaded', timeout: 30000 });
|
||||
|
||||
async function snapshot(label) {
|
||||
const info = await page.evaluate(() => {
|
||||
const app = window.__app;
|
||||
const gl = app.renderer.getContext();
|
||||
const w = gl.drawingBufferWidth, h = gl.drawingBufferHeight;
|
||||
const buf = new Uint8Array(w * h * 4);
|
||||
gl.readPixels(0, 0, w, h, gl.RGBA, gl.UNSIGNED_BYTE, buf);
|
||||
let sum = 0, n = 0, bright = 0;
|
||||
for (let i = 0; i < buf.length; i += 4) {
|
||||
const lum = 0.299 * buf[i] + 0.587 * buf[i + 1] + 0.114 * buf[i + 2];
|
||||
sum += lum; n++;
|
||||
if (lum > 40) bright++;
|
||||
}
|
||||
return {
|
||||
view: app.view,
|
||||
selected: app.selected,
|
||||
binderCurrent: app.binder.current,
|
||||
pages: app.binder.pages.length,
|
||||
timelineCards: app.timeline.cards.length,
|
||||
globeMarkers: app.globe.markers.length,
|
||||
detailName: document.getElementById('detail-name')?.textContent,
|
||||
detailNo: document.getElementById('detail-no')?.textContent,
|
||||
avgLum: +(sum / n).toFixed(2),
|
||||
brightPct: +((bright / n) * 100).toFixed(2),
|
||||
};
|
||||
});
|
||||
console.log(label, JSON.stringify(info, null, 0));
|
||||
}
|
||||
// 阶段一:加载环应已出现且正在展示
|
||||
await new Promise((r) => setTimeout(r, 2000));
|
||||
const loading = await page.evaluate(() => ({
|
||||
hasCanvas: !!document.querySelector('#loading-canvas canvas'),
|
||||
loadingShown: !document.getElementById('loading').classList.contains('hidden'),
|
||||
appReady: !!window.__app,
|
||||
}));
|
||||
|
||||
await snapshot('binder ');
|
||||
|
||||
await page.click('.view-btn[data-view="timeline"]');
|
||||
await new Promise((r) => setTimeout(r, 2400));
|
||||
await snapshot('timeline');
|
||||
|
||||
await page.click('.view-btn[data-view="globe"]');
|
||||
await new Promise((r) => setTimeout(r, 2400));
|
||||
await snapshot('globe ');
|
||||
|
||||
await page.click('.view-btn[data-view="binder"]');
|
||||
await new Promise((r) => setTimeout(r, 2400));
|
||||
await page.click('#btn-next');
|
||||
await new Promise((r) => setTimeout(r, 1500));
|
||||
await snapshot('flipped ');
|
||||
|
||||
await page.click('#btn-prev');
|
||||
await new Promise((r) => setTimeout(r, 1500));
|
||||
await snapshot('back ');
|
||||
// 阶段二:约 9 秒后,loading 应已淡出、App 应已就绪
|
||||
await new Promise((r) => setTimeout(r, 7000));
|
||||
const done = await page.evaluate(() => ({
|
||||
loadingHidden: document.getElementById('loading').classList.contains('hidden'),
|
||||
appReady: !!window.__app,
|
||||
view: window.__app?.view,
|
||||
pages: window.__app?.binder?.pages?.length,
|
||||
timelineCards: window.__app?.timeline?.cards?.length,
|
||||
}));
|
||||
|
||||
console.log('阶段一(加载中):', JSON.stringify(loading));
|
||||
console.log('阶段二(加载后):', JSON.stringify(done));
|
||||
console.log('ERRORS:', errors.length ? errors.join('\n') : '(none)');
|
||||
await browser.close();
|
||||
|
||||
Reference in New Issue
Block a user