Files
canvas-bot 8d85a4c3ea
build-and-publish / test (push) Has been cancelled
build-and-publish / image (push) Has been cancelled
fix(login): do not block login completion on EA2 scenario fetch
If buildLiveScenariosFromApi hangs or errors on any EA2 read,
loginAs would await it forever, leaving the user stuck on
'VERIFYING...' even after auth+identity succeed. Make refreshLive
fire-and-forget after the toast; the Mission scene re-fetches
on mount and surfaces failures via liveError.
2026-06-15 19:13:13 +04:00

47 lines
1.9 KiB
JavaScript

import { chromium } from "playwright";
const b = await chromium.launch({ headless: true });
const ctx = await b.newContext({ viewport: { width: 1440, height: 900 } });
const p = await ctx.newPage();
const calls = [];
p.on("response", async (r) => {
const u = r.url();
if (u.includes("/api/")) {
calls.push({ status: r.status(), method: r.request().method(), url: u.replace("https://canvas.flow-master.ai", "") });
}
});
p.on("console", (m) => { if (m.type() === "error") console.log("CONSOLE-ERR:", m.text().slice(0, 200)); });
p.on("pageerror", (e) => console.log("PAGE-ERR:", e.message.slice(0, 200)));
await ctx.addInitScript(() => localStorage.setItem("fm.canvas.tour.seen", String(Date.now())));
await p.goto("https://canvas.flow-master.ai/", { waitUntil: "domcontentloaded" });
await p.waitForTimeout(2500);
await p.locator(".persona-chip").filter({ hasText: /Mariana/ }).click();
// Live auth can take 6-10s; wait for shell to flip
await p.waitForFunction(() => !document.querySelector("[class*='shell-login']"), null, { timeout: 30000 }).catch(() => {});
await p.waitForTimeout(3000);
const state = await p.evaluate(() => {
const shell = document.querySelector("[class*='shell-']")?.className;
const topbar = document.querySelector("header.topbar");
const tabs = Array.from(document.querySelectorAll(".tab")).map(t => t.textContent?.trim());
const headerByTag = document.querySelector("header")?.outerHTML?.slice(0, 200);
return {
shell,
hasTopbar: !!topbar,
headerByTag,
tabCount: tabs.length,
tabs,
sceneText: document.querySelector(".scene")?.innerText?.slice(0, 300) || null,
};
});
console.log(JSON.stringify(state, null, 2));
await p.screenshot({ path: "/tmp/canvas-evidence/measure.png", fullPage: false });
console.log("screenshot /tmp/canvas-evidence/measure.png");
console.log("\n=== api calls ===");
for (const c of calls) console.log(` ${c.status} ${c.method} ${c.url.slice(0, 100)}`);
await b.close();