fdm/scripts/verify-full.js

54 lines
3.0 KiB
JavaScript

import { chromium } from "@playwright/test";
import assert from "node:assert/strict";
import { writeFile } from "node:fs/promises";
const url = process.env.FDM_URL || "http://127.0.0.1:4178";
assert.ok((await fetch(url)).ok);
const browser = await chromium.launch({
executablePath: "C:/Users/ikun/AppData/Local/ms-playwright/chromium_headless_shell-1234/chrome-headless-shell-win64/chrome-headless-shell.exe",
args: ["--enable-webgl", "--use-angle=swiftshader", "--enable-unsafe-swiftshader"],
});
const errors = [];
const report = { url, runs: [], errors };
try {
const context = await browser.newContext({ viewport: { width: 1440, height: 900 } });
const page = await context.newPage();
page.on("pageerror", (error) => errors.push(error.message));
for (const run of ["cold", "warm"]) {
const start = Date.now();
await page.goto(url, { waitUntil: "domcontentloaded" });
await page.waitForFunction(() => document.querySelector("#loading").hidden || document.querySelector("#loading").textContent.includes("无法加载"), null, { timeout: 180000 });
assert.ok(await page.locator("#loading").evaluate((element) => element.hidden), await page.locator("#loading").textContent());
const readyMs = Date.now() - start;
assert.equal(await page.locator("#scene").getAttribute("data-loaded-segments"), "936561");
assert.equal(await page.locator("#scene").getAttribute("data-loaded-layers"), "714");
assert.equal(await page.locator("#prepare-talk").getAttribute("data-ready"), "true");
const resources = await page.evaluate(() => performance.getEntriesByType("resource").map((r) => r.name));
assert.ok(!resources.some((name) => /overview\.bin|\/stream\/|commands\.json/.test(name)));
report.runs.push({ run, readyMs, completeSegments: 936561, completeLayers: 714 });
await page.screenshot({ path: `artifacts/full-${run}.png` });
}
await context.setOffline(true);
for (const layer of [1, 300, 714]) {
await page.locator("#layer").fill(String(layer));
await page.waitForFunction((layer) => document.querySelector("#current-layer").textContent === String(layer), layer);
assert.match(await page.locator("#raw-command").textContent(), /^G/);
}
await page.locator("#layer").fill("300");
await page.locator("#slow-layer").click();
const previous = await page.locator("#timeline").inputValue();
await page.waitForTimeout(800);
assert.notEqual(await page.locator("#timeline").inputValue(), previous);
await page.locator('[data-technology="nozzle"]').click();
await page.locator("#disassemble").click();
await page.waitForTimeout(1200);
await page.locator('[data-technology="thermal"]').click();
await page.locator("#overheat-fault").click();
await page.waitForTimeout(400);
assert.match(await page.locator("#melt-status").textContent(), /偏高/);
assert.deepEqual(errors, []);
report.loadedPageOfflinePlayback = true;
await writeFile(`artifacts/full-report-${new URL(url).hostname}.json`, JSON.stringify(report, null, 2));
console.log(JSON.stringify(report, null, 2));
} finally { await browser.close(); }