
Playwright Bot Bypass
Compare standard Playwright vs stealth (rebrowser-playwright) on bot-detection pages before relying on automated browsing in production flows.
Overview
playwright-bot-bypass is an agent skill most often used in Ship (also Build integrations) that A/B tests standard Playwright against stealth rebrowser-playwright on bot-detection sites.
Install
npx skills add https://github.com/greekr4/playwright-bot-bypass --skill playwright-bot-bypassWhat is this skill?
- A/B script contrasts standard `playwright` Chromium vs `createStealthBrowser` from stealth-template
- Uses bot.sannysoft.com with table-row evaluation for webdriver and renderer signals
- Documents npm install for rebrowser-playwright and playwright plus `npx playwright install chromium`
- Headed Chrome channel launch with split window positioning for side-by-side comparison
- Graceful degrade when standard playwright package is missing (stealth-only path)
Adoption & trust: 552 installs on skills.sh; 148 GitHub stars; 1/3 security scanners passed (skills.sh audits).
What problem does it solve?
Your Playwright automation works locally but gets blocked because sites detect webdriver fingerprints you never measured.
Who is it for?
Indie developers adding Playwright to scrapers or E2E tests who need empirical before/after detection metrics.
Skip if: Teams prohibited from evading bot protection, pure unit-test workflows with no browser, or production compliance without legal review of target sites’ terms.
When should I use this skill?
You are adopting or debugging Playwright automation and need to compare detection on bot.sannysoft.com between standard and stealth browsers.
What do I get? / Deliverables
You run the A/B harness, compare detection signals on bot.sannysoft.com, and decide whether to adopt stealth launch defaults for downstream scripts.
- A/B console report of webdriver and renderer detection fields
- Decision on stealth-template defaults for follow-on automation scripts
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Canonical shelf is Ship → testing because the skill validates automation fingerprints via A/B checks on sannysoft-style detectors, though the same setup supports Build integrations that scrape or test gated UIs. Subphase testing matches the documented A/B harness, headless Chrome channel runs, and evaluation of webdriver/renderer signals—not shipping infra or SEO work.
Where it fits
Run ab-test.mjs before merging a PR that adds headless login checks.
Validate stealth defaults for a partner portal scraper that failed in CI.
Confirm headed Chrome channel launches do not regress startup before nightly E2E.
Prototype whether bot walls block your MVP’s automated onboarding demo.
How it compares
Diagnostic stealth comparison skill—not a hosted CAPTCHA solver or managed browser farm.
Common Questions / FAQ
Who is playwright-bot-bypass for?
Solo builders and agent operators wiring Node Playwright who need to see detection deltas before shipping automated browsers.
When should I use playwright-bot-bypass?
During Ship testing before release crawlers, in Build integrations when a third-party UI blocks headless Chrome, and when validating rebrowser-playwright after dependency upgrades.
Is playwright-bot-bypass safe to install?
It launches real browsers to third-party test URLs; review the Security Audits panel on this page and restrict network permissions if your policy requires it.
SKILL.md
READMESKILL.md - Playwright Bot Bypass
#!/usr/bin/env node /** * A/B Test: Detected vs Stealth * Compare bot detection between standard playwright and stealth mode * * Usage: node ab-test.mjs * Requires: npm install rebrowser-playwright playwright */ import { createStealthBrowser } from '../scripts/stealth-template.mjs'; let chromiumStandard; try { const pw = await import('playwright'); chromiumStandard = pw.chromium; } catch { console.error('Standard "playwright" package not installed.'); console.error('Run: npm install playwright && npx playwright install chromium'); console.error('\nSkipping A side — running stealth-only test.\n'); } console.log('='.repeat(45)); console.log(' A/B TEST: Detected vs Stealth '); console.log('='.repeat(45) + '\n'); let browserA, browserB; try { // A: Standard Playwright (will be detected) let resultA = { webdriver: 'skipped', renderer: 'skipped' }; if (chromiumStandard) { console.log('[A] Starting standard Playwright...'); browserA = await chromiumStandard.launch({ headless: false, channel: 'chrome', args: ['--window-position=0,0'] }); const contextA = await browserA.newContext({ viewport: { width: 640, height: 700 } }); const pageA = await contextA.newPage(); await pageA.goto('https://bot.sannysoft.com', { waitUntil: 'networkidle' }); await pageA.waitForSelector('table tr td', { timeout: 10000 }); resultA = await pageA.evaluate(() => { const get = (name) => { for (const row of document.querySelectorAll('table tr')) { if (row.textContent.includes(name)) { const cells = row.querySelectorAll('td'); return cells.length >= 2 ? cells[1].textContent.trim() : 'N/A'; } } return 'N/A'; }; return { webdriver: get('WebDriver'), renderer: get('WebGL Renderer') }; }); await pageA.screenshot({ path: '/tmp/ab-test-detected.png' }); } // B: Stealth mode (will bypass detection) console.log('[B] Starting stealth Rebrowser...'); const { browser, page: pageB } = await createStealthBrowser({ viewport: { width: 640, height: 700 } }); browserB = browser; await pageB.goto('https://bot.sannysoft.com', { waitUntil: 'networkidle' }); await pageB.waitForSelector('table tr td', { timeout: 10000 }); const resultB = await pageB.evaluate(() => { const get = (name) => { for (const row of document.querySelectorAll('table tr')) { if (row.textContent.includes(name)) { const cells = row.querySelectorAll('td'); return cells.length >= 2 ? cells[1].textContent.trim() : 'N/A'; } } return 'N/A'; }; return { webdriver: get('WebDriver'), renderer: get('WebGL Renderer') }; }); await pageB.screenshot({ path: '/tmp/ab-test-stealth.png' }); // Results console.log('\n' + '='.repeat(45)); console.log(' RESULTS '); console.log('='.repeat(45)); console.log(`[A] Standard: WebDriver=${resultA.webdriver}`); console.log(` Renderer=${resultA.renderer}`); console.log(`[B] Stealth: WebDriver=${resultB.webdriver}`); console.log(` Renderer=${resultB.renderer}`); console.log('='.repeat(45)); console.log('\nScreenshots: /tmp/ab-test-detected.png, /tmp/ab-test-stealth.png\n'); } catch (err) { console.error('Error:', err.message); } finally { await browserA?.close().catch(() => {}); await browserB?.close().catch(() => {}); } console.log('Done!'); #!/usr/bin/env node /** * Stealth Google Search Example * Demonstrates bot-detection-free Google search with human-like typing * * Usage: node stealth-google-search.mjs "search query" * Requires: npm install rebrowser-playwright */ import { createStealthBrowser, humanType, humanDelay, simulateMouseMovement } from '../scripts/stealth-template.mjs'; const searchQuery = process.argv[2] || 'Playwright automation'; async function stealthGoogleSearch(query) { console.log(`Search