Created
May 10, 2026 14:38
-
-
Save staylor/af9ab08ad850646dc2ca63bf4001df23 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import { chromium } from 'playwright-core'; | |
| const URL = process.env.URL || 'https://www.allbirds.com/products/mens-wool-runners'; | |
| const CDP = process.env.CDP || 'http://127.0.0.1:9222'; | |
| const WAIT = process.env.WAIT || 'load'; // 'load' | 'domcontentloaded' | 'commit' | 'networkidle' | |
| const TIMEOUT = +(process.env.TIMEOUT_MS || '30000'); | |
| console.log(`[repro] CDP=${CDP} URL=${URL} waitUntil=${WAIT} timeout=${TIMEOUT}`); | |
| const browser = await chromium.connectOverCDP(CDP); | |
| const ctx = browser.contexts()[0] ?? await browser.newContext(); | |
| const page = ctx.pages()[0] ?? await ctx.newPage(); | |
| page.on('pageerror', (e) => console.log(`[pageerror] ${e.message}`)); | |
| page.on('crash', () => console.log(`[crash]`)); | |
| page.on('framenavigated', (f) => console.log(`[framenavigated] url=${f.url()} main=${f === page.mainFrame()}`)); | |
| page.on('load', () => console.log(`[event:load]`)); | |
| page.on('domcontentloaded', () => console.log(`[event:domcontentloaded]`)); | |
| page.on('response', (r) => { | |
| // log only main doc | |
| if (r.url() === URL || r.request().resourceType() === 'document') { | |
| console.log(`[response:doc] status=${r.status()} url=${r.url().slice(0, 120)}`); | |
| } | |
| }); | |
| page.on('requestfailed', (r) => console.log(`[requestfailed] ${r.url().slice(0, 120)} ${r.failure()?.errorText}`)); | |
| const t0 = Date.now(); | |
| try { | |
| const resp = await page.goto(URL, { waitUntil: WAIT, timeout: TIMEOUT }); | |
| console.log(`[ok] status=${resp?.status()} elapsed_ms=${Date.now() - t0}`); | |
| console.log(`[ok] title=${JSON.stringify(await page.title())}`); | |
| } catch (err) { | |
| console.log(`[ERR] ${err?.name}: ${err?.message?.split('\n')[0]} (after ${Date.now() - t0}ms)`); | |
| } finally { | |
| try { await browser.close(); } catch {} | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import puppeteer from 'puppeteer-core'; | |
| const URL = process.env.URL || 'https://www.allbirds.com/products/mens-wool-runners'; | |
| const CDP = process.env.CDP || 'ws://127.0.0.1:9222'; | |
| console.log(`[pup] connect ${CDP}`); | |
| const browser = await puppeteer.connect({ browserWSEndpoint: CDP }); | |
| console.log(`[pup] connected`); | |
| const ctx = await browser.createBrowserContext(); | |
| console.log(`[pup] created context`); | |
| const page = await ctx.newPage(); | |
| console.log(`[pup] new page`); | |
| page.on('pageerror', (e) => console.log(`[pageerror] ${e.message}`)); | |
| page.on('console', (m) => { | |
| const t = m.type(); | |
| if (t === 'error' || t === 'warning') console.log(`[console:${t}] ${m.text().slice(0, 160)}`); | |
| }); | |
| const t0 = Date.now(); | |
| try { | |
| const resp = await page.goto(URL, { waitUntil: 'load', timeout: 60_000 }); | |
| console.log(`[ok] status=${resp?.status?.()} elapsed_ms=${Date.now() - t0}`); | |
| console.log(`[ok] title=${JSON.stringify(await page.title())}`); | |
| const bodyLen = await page.evaluate(() => document.body?.innerHTML?.length ?? 0); | |
| console.log(`[ok] body_len=${bodyLen}`); | |
| } catch (err) { | |
| console.log(`[ERR] ${err?.name}: ${err?.message?.split('\n')[0]} (after ${Date.now() - t0}ms)`); | |
| } finally { | |
| try { await page.close(); } catch {} | |
| try { await ctx.close(); } catch {} | |
| try { await browser.disconnect(); } catch {} | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| kill $(cat /tmp/lp-server.pid) 2>/dev/null; sleep 1 | |
| cd /Users/scott/src/lightpanda-browser | |
| nohup ./zig-out/bin/lightpanda serve --host 127.0.0.1 --port 9222 --log-level warn > /tmp/lp-server.log 2>&1 & | |
| SPID=$!; echo $SPID > /tmp/lp-server.pid | |
| for i in $(seq 1 20); do | |
| if curl -sf http://127.0.0.1:9222/json/version >/dev/null 2>&1; then break; fi; sleep 0.5 | |
| done | |
| echo "server ready, PID=$SPID" | |
| ok=0; crash=0 | |
| for i in $(seq 1 25); do | |
| if ! kill -0 $SPID 2>/dev/null; then echo "*** SERVER CRASHED before run $i ***"; crash=1; break; fi | |
| cd /tmp/lp-cdp-test | |
| ( node repro-puppeteer.mjs > /tmp/G-$i.out 2>&1 ) & | |
| PID=$! | |
| for s in $(seq 1 60); do if ! kill -0 $PID 2>/dev/null; then break; fi; sleep 1; done | |
| if kill -0 $PID 2>/dev/null; then kill -9 $PID; fi | |
| wait $PID 2>/dev/null | |
| alive="alive"; kill -0 $SPID 2>/dev/null || alive="DEAD" | |
| status=$(grep -E '\[(ok|ERR)\]' /tmp/G-$i.out | head -1 | tr '\n' ' ' | head -c 100) | |
| echo "run $i: server=$alive client=$status" | |
| if [ "$alive" = "DEAD" ]; then crash=1; break; fi | |
| if echo "$status" | grep -q '\[ok\]'; then ok=$((ok+1)); fi | |
| done | |
| echo | |
| if [ $crash -eq 0 ]; then echo "✅ NO CRASH after 25 runs ($ok OK)"; else echo "❌ CRASHED on run $i"; fi | |
| echo "fatals/crashes in log: $(grep -cE 'Fatal error|Segmentation|Abort|Trace/BPT|panic' /tmp/lp-server.log)" | |
| kill $SPID 2>/dev/null |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment