Skip to content
Blog

Playwright Stealth: what it patches and misses

playwright-stealth hides navigator.webdriver and other simple automation tells. What the Python package patches, what it cannot hide, how sites spot it.

Frederick Jahn
Published Updated
Playwright Stealth: what it patches and misses

Playwright Stealth is a Python package that applies browser-side evasions to pages or browser contexts controlled through Playwright. It is meant to hide simple signs of automation, not to turn an automated session into a person.

What the package changes

The current playwright-stealth package is a maintained fork of an earlier Python port of puppeteer-extra-plugin-stealth. Its recommended setup wraps Playwright so new pages receive the stealth changes. An operator can also apply selected evasions to a browser context.

Those evasions target values that page JavaScript can inspect. The package's own examples check navigator.webdriver, and its configuration supports changes such as navigator language overrides. The WebDriver specification defines navigator.webdriver as the browser property that reports when a user agent is controlled through automation. Hiding it defeats a very simple test, but the missing value does not prove that a visitor is human.

The package is easy to confuse with related projects that share a similar name. This article concerns the Python package published on PyPI as playwright-stealth, whose current release is 2.0.3, published on April 4, 2026.

How it gets used

A developer can add Playwright Stealth to an existing browser script without maintaining a custom browser build such as Camoufox. That makes it a practical first step when a plain automated browser is rejected by basic client-side checks.

The package's maintainer is candid about its reach: the project describes it as a proof-of-concept starting point and says not to expect it to bypass more than simple bot detection. This is a useful boundary. A successful run against a public fingerprint test does not establish that the same configuration will pass a production bot-management system.

Why single-signal rules miss it

A rule that equates navigator.webdriver === true with automation has an obvious blind spot once software changes that property. The same applies to any short, public checklist of JavaScript values.

Defenders should look for agreement across layers. Browser claims can be compared with request and connection properties. Session activity can be assessed in the context of the resource being accessed. Repeated navigation or action patterns may add evidence even when a well-known property has been rewritten. None of those signals should carry the decision alone. The guide on how sites detect automated browsers explains how these layers combine.

Centinel benchmark result

Centinel detected Playwright Stealth in our September 2026 benchmark.

Keep a stealth-assisted Playwright case in regression testing. It checks whether detection has accidentally collapsed back to a single property that the package already knows how to change.

Is your protection catching stealth automation?

Hiding an automation flag can expose a gap in a simple bot rule. Check your own site with a free audit. We run real scraping tools against your site, review the results, and email you the report.

Request a free site audit

Treat concealment as evidence, not intent

Stealth software tells you that a session may be trying to conceal automation. It does not tell you the operator's intent. Apply policy to the action and resource: approved testing, monitoring, or partner automation can be allowed, while abusive extraction or account activity may require rate limits, a challenge, or a block. Centinel bot management, the product tested in that benchmark, applies that policy per route. Test it against your own traffic.

Log the evidence behind the decision. That makes a false positive reversible and gives the detection team something concrete to retest when the package changes.

Sources