// Capture portrait store screenshots from the running dev server (localhost:3025) // using the system Chrome. Output -> scripts/shots/*.png const { chromium } = require("playwright"); const fs = require("fs"); const path = require("path"); const OUT = path.join(__dirname, "shots"); fs.mkdirSync(OUT, { recursive: true }); const URL = process.env.SHOT_URL || "http://localhost:3025/"; const shot = async (page, name) => { await page.screenshot({ path: path.join(OUT, name + ".png") }); console.log("saved", name); }; const tap = async (page, text) => { const el = page.getByText(text, { exact: false }).first(); await el.click({ timeout: 6000 }); }; (async () => { const browser = await chromium.launch({ channel: "chrome" }); const ctx = await browser.newContext({ viewport: { width: 430, height: 932 }, deviceScaleFactor: 2, locale: "fa-IR", isMobile: true, hasTouch: true, }); const page = await ctx.newPage(); await page.goto(URL, { waitUntil: "networkidle" }).catch(() => {}); await page.waitForTimeout(3000); await shot(page, "01-home"); // nav-rail screens reachable from home for (const [label, name] of [ ["جدول امتیازات", "02-leaderboard"], ["دستاوردها", "03-achievements"], ["فروشگاه", "04-shop"], ["پروفایل", "05-profile"], ]) { try { await tap(page, label); await page.waitForTimeout(2200); await shot(page, name); // back to home for the next nav tap await page.goto(URL, { waitUntil: "networkidle" }).catch(() => {}); await page.waitForTimeout(1500); } catch (e) { console.log("skip", name, String(e).split("\n")[0]); await page.goto(URL, { waitUntil: "networkidle" }).catch(() => {}); await page.waitForTimeout(1500); } } // vs-computer game (cards on the table) try { await tap(page, "بازی با کامپیوتر"); await page.waitForTimeout(5000); await shot(page, "06-game"); } catch (e) { console.log("skip game", String(e).split("\n")[0]); } await browser.close(); console.log("DONE"); })().catch((e) => { console.error("FATAL", e); process.exit(1); });