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 context = await browser.newContext({ viewport: { width: 1440, height: 900 } }); const page = await context.newPage(); const errors = []; page.on("pageerror", (error) => errors.push(error.message)); try { const start = Date.now(); await page.goto(url, { waitUntil: "domcontentloaded" }); await page.waitForSelector("#loading[hidden]", { state: "attached", timeout: 60000 }); const firstReadyMs = Date.now() - start; await page.locator('[data-technology="thermal"]').click(); await page.waitForTimeout(500); assert.ok(await page.locator("#thermal-overlay").isVisible()); const startup = await page.evaluate(() => performance.getEntriesByType("resource").map((r) => ({ name: r.name, bytes: r.transferSize }))); assert.ok(!startup.some((r) => /print-job\.(bin|gcode)|full\.bin|commands\.json/.test(r.name))); await page.waitForSelector('#prepare-talk[data-ready="true"]', { timeout: 240000 }); const fullReadyMs = Date.now() - start; await page.locator('[data-technology="model"]').click(); await context.setOffline(true); const offlineReady = Date.now(); await page.locator("#layer").fill("714"); await page.waitForFunction(() => document.querySelector("#current-layer").textContent === "714"); assert.ok((await page.locator("#raw-command").textContent()).startsWith("G")); await page.locator("#layer").fill("300"); await page.waitForFunction(() => document.querySelector("#current-layer").textContent === "300"); const layerSwitchMs = Date.now() - offlineReady; await page.locator("#play").click(); const previous = await page.locator("#timeline").inputValue(); await page.waitForTimeout(700); 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.ok((await page.locator("#melt-status").textContent()).includes("偏高")); const before = await page.locator("#scene").getAttribute("data-thermal"); await page.waitForTimeout(400); assert.notEqual(await page.locator("#scene").getAttribute("data-thermal"), before); await page.screenshot({ path: "artifacts/stream-background.png", fullPage: true }); assert.deepEqual(errors, []); const report = { url, firstReadyMs, fullReadyMs, layerSwitchMs, startup, loadedPageOfflinePlayback: true, errors }; await writeFile("artifacts/stream-report.json", JSON.stringify(report, null, 2)); console.log(JSON.stringify(report, null, 2)); } finally { await browser.close(); }