const { chromium } = require("playwright"); (async () => { const PAGES = ["leadforge","academy","consulting","ai-sdr","arsenal"]; const browser = await chromium.launch({ headless: true, args: ["--no-sandbox","--disable-gpu","--disable-dev-shm-usage"] }); const results = []; for (const name of PAGES) { let ctx; try { ctx = await browser.newContext({ viewport: { width: 1440, height: 900 } }); const pg = await ctx.newPage(); await pg.goto("https://weval-consulting.com/products/" + name + ".html", { waitUntil: "domcontentloaded", timeout: 15000 }); await pg.waitForTimeout(2500); const r = await pg.evaluate(() => { const fn = (x1,y1,x2,y2) => { const all = document.querySelectorAll("button,.btn,.toggle,.tab,[class*=btn],.chip,.badge,.fab"); let n = 0; for (const el of all) { const r = el.getBoundingClientRect(); if (r.width<2 || r.height<2) continue; const pos = getComputedStyle(el).position; if (pos !== "fixed" && pos !== "absolute") continue; const cx=r.x+r.width/2, cy=r.y+r.height/2; if (cx>=x1 && cx<=x2 && cy>=y1 && cy<=y2) n++; } return n; }; return { tr: fn(1040,0,1440,400), br: fn(1040,500,1440,900) }; }); results.push({ p: name, tr: r.tr, br: r.br }); await pg.close(); await ctx.close(); } catch (e) { results.push({ p: name, err: e.message.slice(0,60) }); try { await ctx.close(); } catch {} } } await browser.close(); console.log(JSON.stringify({ results })); })();