Newer
Older
rpg / tools / smoke.mjs
/**
 * Смоук-тест игры в реальном браузере (системный Chromium).
 * Запуск: node tools/smoke.mjs [url] [файл-скриншота]
 * Открывает страницу, ждёт загрузки/меню, печатает консоль браузера и делает скриншот.
 */
import puppeteer from 'puppeteer-core';

const url = process.argv[2] ?? 'http://localhost:5199/';
const shot = process.argv[3] ?? '/tmp/rpg_smoke.png';

const browser = await puppeteer.launch({
    executablePath: '/usr/bin/chromium',
    headless: true,
    // autoplay-policy: в headless ctx.resume() без флага может не резолвиться,
    // и навигация, завязанная на звук, зависает.
    args: ['--no-sandbox', '--enable-unsafe-swiftshader', '--use-angle=swiftshader',
           '--autoplay-policy=no-user-gesture-required', '--window-size=960,540']
});
const page = await browser.newPage();
await page.setViewport({ width: 960, height: 540 });

page.on('console', (msg) => console.log(`[консоль] ${msg.text()}`));
page.on('pageerror', (err) => console.log(`[ошибка страницы] ${err.message}\n${err.stack ?? ''}`));

await page.goto(url, { waitUntil: 'networkidle2', timeout: 20000 });
await new Promise((r) => setTimeout(r, 4000));

// Клик в центр экрана: в меню это «Новая игра», в локации — шаг героя.
await page.mouse.click(480, 283);
await new Promise((r) => setTimeout(r, 2500));

// Клик по Ирвину (тайл (13,15), герой стоит в (14,14) в центре) — диалог.
await page.mouse.click(416, 270);
await new Promise((r) => setTimeout(r, 800));
await page.screenshot({ path: shot });
console.log(`Скриншот: ${shot}`);
await browser.close();