Skip to content

Instantly share code, notes, and snippets.

@staylor
Created May 10, 2026 14:38
Show Gist options
  • Select an option

  • Save staylor/af9ab08ad850646dc2ca63bf4001df23 to your computer and use it in GitHub Desktop.

Select an option

Save staylor/af9ab08ad850646dc2ca63bf4001df23 to your computer and use it in GitHub Desktop.
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 {}
}
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 {}
}
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