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(); }