Comparisons
Most comparisons in this space put tools side by side that are not actually comparable: a page-level script against a patched binary, a Chromium tool against a Firefox one. These pages try not to do that. Each one names the layer the comparison actually happens at, states plainly where the other tool covers more, and does not claim an advantage it could not verify against the other project’s own source or documentation.
Start with Three ways to make Playwright undetected if you want the map before the individual matchups - it’s the frame every comparison below sits inside.
Concepts and the map
- Three ways to make Playwright undetected - The three levels stealth tools work at - page, driver, engine - and what each reaches.
- Firefox or Chromium for anti-detect automation - No CDP surface and one identity, traded against Firefox’s smaller traffic share.
- Chromium is not Chrome, and detectors know the difference - Chrome for Testing plays H.264 but fails a Widevine DRM check no patch closes.
- WebDriver BiDi vs CDP: does the new protocol hide you - BiDi standardizes the control wire, but automation leaks live in the page, not the protocol.
- Do I need an anti-detect browser or just Playwright? - What a paid anti-detect GUI adds over stock Playwright driving a patched Firefox.
- Migrating from Puppeteer to Playwright for stealth - The near one-to-one API mapping, and what changes for detection off the CDP stack.
- Migrating from Selenium to Playwright for stealth - Map driver.get and find_element to page.goto and locators, dropping the WebDriver server.
Patched-engine, driver-patch and stealth-plugin tools
- invisible_playwright vs Camoufox: two patched Firefoxes - Both patch Firefox in C++; how each builds its fingerprint and whether a run replays.
- invisible_playwright vs Patchright: driver vs engine - Patchright patches the Playwright driver on Chromium; this patches Firefox itself. Often you need both.
- invisible_playwright vs rebrowser-patches: the same CDP fix - Fixes the Runtime.enable CDP leak on Chromium; reaches neither Firefox nor fonts, GPU, canvas, audio.
- undetected-playwright vs a patched Firefox binary - Hides Playwright’s init-script and bindings tells; a patched Firefox closes the fingerprint layer.
- invisible_playwright vs playwright-stealth: page vs engine - playwright-stealth patches the page in about four lines; this rebuilds the engine.
- playwright-extra stealth plugins vs a patched browser - Applies stealth plugins as injected JavaScript a detector reads back; a patched engine compiles them in.
- invisible_playwright vs fingerprint-suite: injection vs engine - fingerprint-suite injects a generated fingerprint into a page; this sets it in the engine.
- invisible_playwright vs playwright-with-fingerprints - Injects remote-service fingerprints into a Windows-only, ageing Chromium build, and what that trade costs.
- puppeteer-real-browser vs invisible_playwright - Node plus real Chrome with runtime property patches vs Python plus Firefox with compiled spoofs.
CDP and driverless Chrome tools
- invisible_playwright vs nodriver and undetected-chromedriver - Chrome-only tools, not Playwright forks; neither hides IP or fingerprint, by their own docs.
- pydoll vs invisible_playwright: CDP without a driver - pydoll drives Chrome over CDP with no chromedriver; this ships seed-consistent Firefox surfaces.
- zendriver vs invisible_playwright: Chrome CDP vs Firefox - zendriver drives Chrome over CDP; this drives a patched Firefox with cross-checked surfaces.
- selenium-driverless vs invisible_playwright stealth - Drops chromedriver by driving Chrome over raw CDP but leaves rendering and TLS stock.
- invisible_playwright vs SeleniumBase UC Mode - UC Mode detaches chromedriver but never changes the engine, GPU, fonts, canvas or TLS.
- undetected-chromedriver vs a patched Firefox browser - Strips the driver’s cdc_ and webdriver leaks but ships a stock Chromium fingerprint.
- invisible_playwright vs Ulixee Hero - Replayed emulation on stock Chromium vs a fingerprint decided natively in patched Firefox.
Non-Playwright frameworks and HTTP-client libraries
- botasaurus vs invisible_playwright: framework vs library - Batteries-included Chrome scraping framework vs a patched-Firefox engine driven with stock Playwright.
- invisible_playwright vs Scrapling - Scrapling is an adaptive parser, not a stealth engine; its ceiling is whichever browser it wraps.
- scrapy-playwright vs a patched Firefox for stealth - Runs stock Playwright inside Scrapy; point the handler at a patched Firefox and keep the scheduler.
- invisible_playwright vs DrissionPage - Fuses an HTTP session mode and a CDP browser mode, each failing a different check half.
- curl_cffi vs invisible_playwright: TLS client vs browser - Replays a browser’s TLS and HTTP/2 at byte level but runs no JavaScript.
- invisible_playwright vs hrequests - A hybrid TLS-impersonating HTTP client plus a browser mode with injected fingerprints.
- tls-client vs a real browser: when TLS is enough - When JA3/HTTP2 socket spoofing suffices on JSON and HTML, and where JS forces a full browser.
Unmaintained tools
- puppeteer-extra-plugin-stealth: unmaintained since 2024 - No real update since mid-2024; old patches still work but the checklist froze.
- pyppeteer’s own maintainer says to switch to Playwright - Its README calls it unmaintained and points to playwright-python; what switching does not fix.
- selenium-stealth hasn’t been updated since December 2021 - Last commit December 2021; what its property patches still do and what to check today.
- Splash is unmaintained, and it was never a real browser - A QtWebKit render service reporting an engine no real browser ships, which no spoof reaches.
Table of contents
- Playwright stealth in Python: three levels that work
- Firefox or Chromium for anti-detect automation
- Chromium is not Chrome, and detectors know the difference
- Playwright stealth vs Camoufox: two patched Firefoxes
- Playwright stealth vs Patchright: driver vs engine
- Playwright stealth vs undetected-chromedriver and nodriver
- playwright-stealth vs a patched engine: page vs browser
- puppeteer-extra-plugin-stealth: unmaintained since 2024
- selenium-stealth hasn't been updated since December 2021
- pyppeteer's own maintainer says to switch to Playwright
- invisible_playwright vs rebrowser-patches: the same CDP fix
- invisible_playwright vs fingerprint-suite: injection vs engine
- invisible_playwright vs playwright-with-fingerprints
- invisible_playwright vs Scrapling
- invisible_playwright vs Ulixee Hero
- invisible_playwright vs SeleniumBase UC Mode
- Splash is unmaintained, and it was never a real browser
- invisible_playwright vs DrissionPage
- WebDriver BiDi vs CDP: does the new protocol hide you
- invisible_playwright vs hrequests
- zendriver vs invisible_playwright: Chrome CDP vs Firefox
- botasaurus vs invisible_playwright: framework vs library
- curl_cffi vs invisible_playwright: TLS client vs browser
- pydoll vs invisible_playwright: CDP without a driver
- selenium-driverless vs invisible_playwright stealth
- puppeteer-real-browser vs invisible_playwright
- Migrating from Selenium to Playwright for stealth
- Migrating from Puppeteer to Playwright for stealth
- undetected-chromedriver vs a patched Firefox browser
- scrapy-playwright vs a patched Firefox for stealth
- playwright-extra stealth plugins vs a patched browser
- tls-client vs a real browser: when TLS is enough
- Anti-detect browser or Playwright stealth: which you need
- undetected-playwright vs a patched Firefox binary