[{"data":1,"prerenderedAt":86},["ShallowReactive",2],{"$f950V7HbNN-fCWBwJnyj5THNq-TTf4fEktb-KM247TvQ":3},{"title":4,"date":5,"dateModified":6,"datePublished":7,"dateModifiedISO":7,"image":8,"content":9,"faq":10,"metaTitle":33,"metaDescription":34,"author":35,"authorBio":6,"authorLinkedin":6,"authorTitle":6,"authorPhoto":36,"lastReviewed":6,"researchBasis":6,"category":37,"readingTime":38,"related":39,"prev":57,"next":58,"toc":59,"takeaways":85},"Patchright vs Playwright: What Patchright Actually Patches (2026)","24 Sep 2026",null,"2026-09-24","/img/news/patchright-vs-playwright-2026.png","\u003Cp>\u003Cstrong>Short answer:\u003C/strong> if you are writing tests, use Playwright. If you are scraping a site that blocks you, use Patchright. It is a drop-in replacement for the same API, so the migration is an import change, and it removes three specific detection signals that vanilla Playwright leaks by design.\u003C/p>\n\u003Cp>The comparison is not really &quot;which browser automation library is better&quot;. Patchright \u003Cem>is\u003C/em> Playwright, with the headless tells patched out of the Chromium build. The real question is whether those three patches are enough for your target, and what you do when they are not.\u003C/p>\n\u003Ch2 id=\"choose-before-you-read\">Choose Before You Read\u003C/h2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Your situation\u003C/th>\n\u003Cth>Use\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Writing end-to-end tests for your own app\u003C/td>\n\u003Ctd>\u003Cstrong>Playwright\u003C/strong>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Scraping a site with no WAF\u003C/td>\n\u003Ctd>\u003Cstrong>Playwright\u003C/strong> — Patchright buys you nothing\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Getting blocked by Cloudflare on a Node.js stack\u003C/td>\n\u003Ctd>\u003Cstrong>Patchright\u003C/strong>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Already on playwright-extra and still blocked\u003C/td>\n\u003Ctd>\u003Cstrong>Patchright\u003C/strong>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Blocked by Akamai or PerimeterX behavioural scoring\u003C/td>\n\u003Ctd>\u003Ca href=\"#what-patchright-does-not-fix\">Neither is reliably enough\u003C/a>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>You want the data, not a stealth stack to maintain\u003C/td>\n\u003Ctd>\u003Ca href=\"#when-patching-stops-being-the-answer\">See the last section\u003C/a>\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Ch2 id=\"the-three-signals-patchright-removes\">The Three Signals Patchright Removes\u003C/h2>\n\u003Cp>Vanilla Playwright is not trying to hide. It is a testing tool, and it announces itself in ways that cost nothing in CI and everything in production scraping. \u003Ca href=\"https://github.com/Kaliiiiiiiiii-Vinyzu/patchright\">Patchright\u003C/a> patches the Chromium binary at build time to remove them.\u003C/p>\n\u003Cp>\u003Cstrong>1. The \u003Ccode>Runtime.enable\u003C/code> CDP leak.\u003C/strong> This is the one that matters most in 2026. Playwright calls \u003Ccode>Runtime.enable\u003C/code> over the Chrome DevTools Protocol to set up its execution-context bookkeeping. That call is observable from inside the page, and Cloudflare&#39;s current detection watches for it specifically. Patchright avoids the call and resolves contexts differently, which is why it passes targets that playwright-extra does not.\u003C/p>\n\u003Cp>\u003Cstrong>2. The \u003Ccode>HeadlessChrome\u003C/code> user-agent string in the binary.\u003C/strong> Not the runtime \u003Ccode>navigator.userAgent\u003C/code> you can override with a launch argument — the string compiled into the Chromium build, which surfaces in places a JavaScript override never reaches.\u003C/p>\n\u003Cp>\u003Cstrong>3. WebDriver capability exposure.\u003C/strong> \u003Ccode>navigator.webdriver\u003C/code> and its supporting plumbing, removed at the C++ level rather than deleted from the page context after load.\u003C/p>\n\u003Cp>The distinction that makes this work: \u003Cstrong>the patches land before the browser process starts, not in the page.\u003C/strong> A JavaScript-injection approach has to redefine properties after load, and redefinition is itself detectable — an \u003Ccode>Object.defineProperty\u003C/code> guard can spot a property whose descriptor was rewritten. There is nothing to spot when the property was never compiled in.\u003C/p>\n\u003Cp>Two consequences follow from the same fact: no JS injection overhead at page load, and a TLS fingerprint closer to a real Chrome session.\u003C/p>\n\u003Ch2 id=\"patchright-vs-playwright-side-by-side\">Patchright vs Playwright: Side by Side\u003C/h2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>\u003C/th>\n\u003Cth>Playwright\u003C/th>\n\u003Cth>Patchright\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>API\u003C/td>\n\u003Ctd>Reference implementation\u003C/td>\n\u003Ctd>Identical, drop-in\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Built for\u003C/td>\n\u003Ctd>Testing and automation\u003C/td>\n\u003Ctd>Scraping protected targets\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Runtime.enable\u003C/code> CDP call\u003C/td>\n\u003Ctd>Made\u003C/td>\n\u003Ctd>Avoided\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Headless UA string in binary\u003C/td>\n\u003Ctd>Present\u003C/td>\n\u003Ctd>Patched out\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>navigator.webdriver\u003C/code>\u003C/td>\n\u003Ctd>Exposed\u003C/td>\n\u003Ctd>Removed at build time\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Patch layer\u003C/td>\n\u003Ctd>None\u003C/td>\n\u003Ctd>Chromium binary, pre-launch\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Memory per instance\u003C/td>\n\u003Ctd>~200MB\u003C/td>\n\u003Ctd>~200MB, no added overhead\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Cloudflare BotFight\u003C/td>\n\u003Ctd>Blocked\u003C/td>\n\u003Ctd>Passes\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Cloudflare Enterprise / Turnstile\u003C/td>\n\u003Ctd>Blocked\u003C/td>\n\u003Ctd>Variable by target\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Akamai Bot Manager v4\u003C/td>\n\u003Ctd>Blocked\u003C/td>\n\u003Ctd>Variable by target\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Behavioural scoring\u003C/td>\n\u003Ctd>Not addressed\u003C/td>\n\u003Ctd>Not addressed\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Browser engine\u003C/td>\n\u003Ctd>Chromium, Firefox, WebKit\u003C/td>\n\u003Ctd>Chromium\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Maintenance\u003C/td>\n\u003Ctd>Microsoft\u003C/td>\n\u003Ctd>Small independent team\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Caside class=\"article__inline-cta\">\u003Cp class=\"article__inline-cta-text\">Try ScrapeWise on your own URL — \u003Cstrong>extract in 24s\u003C/strong>, no credit card.\u003C/p>\u003Ca class=\"article__inline-cta-btn\" href=\"https://portal.scrapewise.ai/login\" target=\"_blank\" rel=\"noopener\">Start Free →\u003C/a>\u003C/aside>\u003Ch2 id=\"migrating-it-is-an-import-change\">Migrating: It Is an Import Change\u003C/h2>\n\u003Cp>Patchright mirrors Playwright&#39;s API surface, so on a Node.js codebase the move is the import and the install. Your selectors, your page objects, your waits and your context handling all carry over unchanged.\u003C/p>\n\u003Cp>Two things to keep in mind. First, Patchright is \u003Cstrong>Chromium only\u003C/strong> — if you are running the same suite across Firefox and WebKit, only the Chromium leg moves. Second, the patched Chromium is downloaded and maintained separately from Playwright&#39;s own browser cache, so your CI image gets a second browser build to pull and pin.\u003C/p>\n\u003Cp>The practical test for whether the migration was worth it is not a fingerprint site. It is your own target, at your own request rate, over a few hours — a fingerprint check passes long before a rate-limiter stops caring.\u003C/p>\n\u003Ch2 id=\"what-patchright-does-not-fix\">What Patchright Does Not Fix\u003C/h2>\n\u003Cp>Patchright removes \u003Cem>technical\u003C/em> fingerprint signals. Every modern WAF also runs \u003Cstrong>behavioural\u003C/strong> scoring, and none of the three patches touch it.\u003C/p>\n\u003Cp>Behavioural scoring looks at mouse-movement paths, scroll velocity, dwell time before the first click, keystroke cadence, and the timing distribution of your requests. A patched browser that loads a page, reads the DOM in 400ms and leaves has a signature no binary patch addresses. Against Akamai Bot Manager v4 and PerimeterX/HUMAN this is what typically catches Patchright sessions, and it is why its results there are honestly described as variable rather than passing.\u003C/p>\n\u003Cp>It also does not give you proxies. A clean fingerprint from a datacentre IP that has already been flagged is refused at the edge before anything in the browser is evaluated.\u003C/p>\n\u003Cp>So the failure sequence in practice is: vanilla Playwright blocked instantly → Patchright passes → volume goes up → rate-limited → residential proxies added → behavioural scoring catches the timing → and now you are writing a mouse-movement simulator. That last step is where most teams find out stealth is not a library choice.\u003C/p>\n\u003Ch2 id=\"patchright-vs-the-alternatives\">Patchright vs the Alternatives\u003C/h2>\n\u003Cp>If Patchright is not enough, the next moves are sideways, not up.\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ca href=\"/blogs/camoufox-vs-patchright-2026\">Camoufox\u003C/a>\u003C/strong> — a Firefox fork patched at the C++ level, 0% headless detection on standard tests, but 42.49 seconds average bypass time on a Cloudflare challenge. Right for high-value, low-frequency targets; wrong for a daily catalogue crawl.\u003C/li>\n\u003Cli>\u003Cstrong>playwright-extra\u003C/strong> — the JS-injection approach Patchright supersedes. Blocked on Cloudflare Enterprise. Do not start new work on it.\u003C/li>\n\u003Cli>\u003Cstrong>noDriver\u003C/strong> — lighter (~80–120MB) and drives Chrome over CDP without Playwright at all, but has no behavioural handling and gets blocked quickly by anything scoring it.\u003C/li>\n\u003C/ul>\n\u003Cp>The full matrix across all five, including the Python \u003Ccode>playwright-stealth\u003C/code> line, is in our \u003Ca href=\"/blogs/playwright-stealth-2026\">Playwright stealth benchmark\u003C/a>. For the anti-bot systems themselves rather than the tools, see \u003Ca href=\"/blogs/bypass-cloudflare-akamai-perimeterx-web-scraping-2026\">bypassing Cloudflare, Akamai and PerimeterX\u003C/a>.\u003C/p>\n\u003Ch2 id=\"when-patching-stops-being-the-answer\">When Patching Stops Being the Answer\u003C/h2>\n\u003Cp>There is a volume at which this stops being a library decision and becomes a staffing one.\u003C/p>\n\u003Cp>Stealth tools decay. Each anti-bot vendor ships detection updates, each update needs a corresponding patch, and the gap between the two is downtime on whichever data source you were depending on. Maintaining that cycle is a recurring weekly cost that does not appear in any install command.\u003C/p>\n\u003Cp>If what you actually need is \u003Cstrong>competitor prices, stock levels and product data landing in your systems\u003C/strong> — rather than a stealth stack to keep alive — the honest answer is that the Patchright-vs-Playwright question is the wrong one. \u003Ca href=\"/\">ScrapeWise\u003C/a> runs the browsers, the proxies and the challenge handling and delivers structured rows. It is a feed, not a toolkit: no plan and no compute units, just a balance you top up and a charge per delivered page from EUR 0.15 per 1,000, with 5 free requests on every new account.\u003C/p>\n\u003Cp>You can also call \u003Ca href=\"/scrapers\">36 ready-made scraping API endpoints\u003C/a> directly, or see how this feeds \u003Ca href=\"/use-cases/competitor-price-tracking\">competitor price tracking\u003C/a>.\u003C/p>\n\u003Ch2 id=\"so-which-should-you-use\">So Which Should You Use?\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Playwright\u003C/strong> — tests, unprotected targets, or any stack where you need Firefox and WebKit too.\u003C/li>\n\u003Cli>\u003Cstrong>Patchright\u003C/strong> — a Node.js scraper that Cloudflare is blocking. It is the cheapest upgrade available and costs you one import line.\u003C/li>\n\u003Cli>\u003Cstrong>Camoufox\u003C/strong> — Patchright is passing the fingerprint checks and still getting blocked, and the target is worth 42 seconds a page.\u003C/li>\n\u003Cli>\u003Cstrong>None of them\u003C/strong> — you want delivered rows on a schedule and would rather not run a stealth stack at all.\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Ca href=\"/pricing\">Book a call\u003C/a>.\u003C/p>\n",{"title":11,"description":12,"badge":13,"benefits":14},"Frequently asked questions","Patchright vs Playwright in 2026 — what Patchright patches, whether it is a drop-in replacement, what still blocks it, and when to stop patching","FAQ",[15,18,21,24,27,30],{"title":16,"description":17},"What is the difference between Patchright and Playwright?","Patchright is Playwright with the headless tells patched out of the Chromium build. Playwright is a testing tool and does not try to hide: it calls Runtime.enable over the Chrome DevTools Protocol, ships a HeadlessChrome user-agent string compiled into the binary, and exposes the WebDriver capability. Patchright removes all three at build time, before the browser process starts. The API is identical, so on a Node.js codebase the difference in your code is the import line.",{"title":19,"description":20},"Is Patchright a drop-in replacement for Playwright?","On Chromium, yes. Patchright mirrors Playwright's API surface, so selectors, page objects, waits and context handling carry over unchanged. Two caveats: Patchright is Chromium only, so a suite running across Firefox and WebKit only moves its Chromium leg; and the patched Chromium is downloaded and maintained separately from Playwright's own browser cache, which means a second browser build to pull and pin in CI.",{"title":22,"description":23},"Does Patchright bypass Cloudflare?","On Cloudflare BotFight, consistently. On Cloudflare Enterprise and Turnstile, results vary by target. The reason Patchright does better than playwright-extra is the Runtime.enable CDP leak, which Cloudflare's current detection watches for specifically and which Patchright avoids. But Cloudflare Enterprise also runs behavioural scoring on mouse paths, scroll velocity and request timing, and no binary patch addresses that.",{"title":25,"description":26},"Why does Patchright still get blocked?","Because it fixes technical fingerprint signals and not behavioural ones. Modern WAFs score mouse-movement paths, scroll velocity, dwell time before the first click and the timing distribution of requests. A patched browser that loads a page, reads the DOM in 400ms and leaves has a signature no binary patch touches. Against Akamai Bot Manager v4 and PerimeterX/HUMAN this is usually what catches it. Patchright also does not give you proxies, and a flagged datacentre IP is refused at the edge before the browser is evaluated at all.",{"title":28,"description":29},"Patchright or Camoufox in 2026?","Patchright first, because it costs one import line and adds no runtime overhead over standard Chromium at roughly 200MB per instance. Move to Camoufox only when Patchright is passing fingerprint checks and still getting blocked, and the target is worth the cost: Camoufox is a Firefox fork patched at the C++ level with a 0% headless detection rate on standard tests, but averages 42.49 seconds to clear a Cloudflare challenge. That is right for high-value, low-frequency targets and wrong for a daily catalogue crawl.",{"title":31,"description":32},"When should you stop patching and buy the data instead?","When the maintenance cycle costs more than the data. Stealth tools decay: each anti-bot vendor ships detection updates, each update needs a corresponding patch, and the gap between the two is downtime on whichever source you depend on. If what you need is competitor prices, stock levels and product data arriving in your systems rather than a stealth stack to keep alive, a managed feed removes the question. ScrapeWise runs the browsers, proxies and challenge handling and delivers structured rows from EUR 0.15 per 1,000 delivered pages, with 5 free requests on every new account.","Patchright vs Playwright 2026: What It Actually Patches","Patchright vs Playwright in 2026. The three signals Patchright removes, the drop-in migration, what still gets you blocked, and when to stop patching.","Siim Brazier","/img/team/siim.jpg","Alternatives",6,[40,45,51],{"slug":41,"title":42,"image":43,"date":5,"category":37,"excerpt":44},"camoufox-vs-patchright-2026","Camoufox vs Patchright: Firefox Fork or Patched Chromium? (2026)","/img/news/camoufox-vs-patchright-2026.png","Camoufox vs Patchright in 2026: 0% headless detection at 42.49s a page against patched Chromium at no overhead. Which one your volume can actually afford.",{"slug":46,"title":47,"image":48,"date":49,"category":37,"excerpt":50},"oxylabs-vs-apify-web-scraping-2026","Oxylabs vs Apify: Which Web Scraping Platform Should You Choose in 2026?","/img/news/oxylabs-vs-apify-web-scraping-2026.png","23 Sep 2026","Oxylabs vs Apify compared for 2026: proxy access vs Actor marketplace, how each prices, e-commerce and AI coverage, and which one your bottleneck actually calls for.",{"slug":52,"title":53,"image":54,"date":55,"category":37,"excerpt":56},"decodo-smartproxy-alternative-web-scraping-2026","Decodo (Smartproxy) Alternative for Web Scraping: 4 Options Compared [2026]","/img/news/decodo-smartproxy-alternative-web-scraping-2026.png","22 July 2026","Decodo (formerly Smartproxy) is a proxy-first scraping platform. Compare 4 Decodo alternatives on proxy quality, scraping APIs, cost and upkeep.",{"slug":46,"title":47},{"slug":41,"title":42},[60,64,67,70,73,76,79,82],{"level":61,"text":62,"id":63},2,"Choose Before You Read","choose-before-you-read",{"level":61,"text":65,"id":66},"The Three Signals Patchright Removes","the-three-signals-patchright-removes",{"level":61,"text":68,"id":69},"Patchright vs Playwright: Side by Side","patchright-vs-playwright-side-by-side",{"level":61,"text":71,"id":72},"Migrating: It Is an Import Change","migrating-it-is-an-import-change",{"level":61,"text":74,"id":75},"What Patchright Does Not Fix","what-patchright-does-not-fix",{"level":61,"text":77,"id":78},"Patchright vs the Alternatives","patchright-vs-the-alternatives",{"level":61,"text":80,"id":81},"When Patching Stops Being the Answer","when-patching-stops-being-the-answer",{"level":61,"text":83,"id":84},"So Which Should You Use?","so-which-should-you-use",[],1790238196328]