---
title: "nodriver and undetected-chromedriver: 28 of 31 targets open"
description: "nodriver against undetected-chromedriver, read in September 2026: releases, licences, a 31 target benchmark, and the input traces nodriver leaves on a page."
canonical: "https://scalebrowser.net/blog/nodriver"
last_modified: "2026-09-25"
published: "2026-09-25"
author: "davide"
category: "stealth-tools"
---

> ## Documentation Index
> Fetch the complete documentation index at: https://scalebrowser.net/llms.txt
> Use this file to discover all available pages before exploring further.

# nodriver and undetected-chromedriver: 28 of 31 targets open

> nodriver against undetected-chromedriver, read in September 2026: releases, licences, a 31 target benchmark, and the input traces nodriver leaves on a page.

undetected-chromedriver, still downloaded about 2 million times a month, is where many blocked Selenium scripts end up, and nodriver is what its author built next. Both are still downloaded in large numbers, but only one of them is still released. We read both packages on 24 September 2026, took the one public benchmark that ran nodriver against live targets, and added what our own signature bench recorded when nodriver typed and clicked.

## What are nodriver and undetected-chromedriver?

undetected-chromedriver describes itself as an "Optimized Selenium Chromedriver patch": it keeps the Selenium WebDriver stack and patches the chromedriver binary underneath. [nodriver](https://github.com/ultrafunkamsterdam/nodriver) drops that stack. Its README calls it "the official successor of the Undetected-Chromedriver python package", with "No chromedriver binary or Selenium dependency", and it drives Chrome through the Chrome DevTools Protocol directly.

<Evidence source="PyPI JSON API, pypistats.org and GitHub API, read 24 September 2026">

| Package | Latest release | PyPI downloads, last month |
| --- | --- | --- |
| undetected-chromedriver | 3.5.5, 17 February 2024 | 2,035,804 |
| nodriver | 0.50.3, 13 May 2026 | 287,716 |

</Evidence>

The older package still gets about seven times the downloads of its successor, although its last release is from February 2024. The [undetected-chromedriver repository](https://github.com/ultrafunkamsterdam/undetected-chromedriver) is licensed GPL-3.0, nodriver AGPL-3.0.

## How did nodriver do against 31 targets?

nodriver was the only tool in the test without a blocked target. Ian L. Paterson ran [7 tools against 31 targets](https://ianlpaterson.com/blog/anti-detect-browser-benchmark-patchright-nodriver-curl-cffi/) in three sweeps from one residential IP address and published the results on 13 May 2026. undetected-chromedriver was not among the seven.

<Evidence source="Ian L. Paterson, Anti-Detect Browser Benchmark 2026, 31 targets, 3 sweeps, published 13 May 2026" href="https://ianlpaterson.com/blog/anti-detect-browser-benchmark-patchright-nodriver-curl-cffi/">

| Result on 31 targets | nodriver | vanilla Playwright |
| --- | --- | --- |
| OK | 28 | 24 |
| Gated | 3 | 2 |
| Blocked | 0 | 5 |

</Evidence>

Paterson attributes the gap to the control plane rather than to patches: "Playwright forks fail regardless of patch quality, and defeating that layer takes a control plane that is not Playwright." nodriver is not a Playwright fork, and it did not fall off that cliff.

## What does nodriver leave to you?

nodriver leaves three things to the code that uses it: the profile, the input and the licence.

1. **The profile.** Its README describes a "fresh profile on each run, cleans up on exit", and offers to "save and load cookies to file to not repeat tedious login steps". A login survives only if your code saves the cookies and loads them again; passkeys, storage and the rest of the profile do not travel with them.
2. **The input.** nodriver sends events from a script, not from an input device, and a page can see that (next section).
3. **The licence.** nodriver is licensed AGPL-3.0. Section 13 says that a modified version "must prominently offer all users interacting with it remotely through a computer network" the source code. A hosted product that changes nodriver takes on that duty and has to plan for it.

### What does direct CDP expose?

Direct CDP removes the Playwright layer and leaves the events nodriver dispatches itself. On our signature bench, 2 runs against Chrome 141 on 24 August 2026, nodriver was the most conspicuous of six input paths we recorded, although it is known as the quietest of the [free stealth tools](/blog/stealth-browser).

<Evidence source="Scalebrowser signature bench, nodriver 0.50.3, Chrome 141.0.7390.122, 2 runs, 24 August 2026">

| Event on the page | What nodriver produced |
| --- | --- |
| keydown | 0 |
| keypress | 79 |
| pointer events | none |
| click, isTrusted | false, at coordinate 0,0 |

</Evidence>

A page that listens for `keydown` sees none while text appears, and a click that is not trusted and has no pointer before it did not come from a mouse. The benchmark above recorded whether a site let a tool through, not what its events looked like, and a site that scores events can tell nodriver apart even where its fingerprint looks like ordinary Chrome. The [nodriver migration guide](/docs/migrate/nodriver) shows how to keep existing nodriver code and replace exactly these clicks and key events.

## So which should you pick?

| Situation | Pick | Why |
| --- | --- | --- |
| An existing Selenium script that must keep running | undetected-chromedriver | no rewrite, but no release since February 2024 |
| New Python code, one identity per run, AGPL acceptable | nodriver | no blocked target in the benchmark |
| A site that scores input events | an input layer that produces trusted events | nodriver's clicks are untrusted |
| A hosted product that would modify the driver | a driver under a permissive licence | AGPL section 13 applies |
| Many identities that stay signed in across runs | a browser built around persistent profiles | nodriver starts empty every time |

Our verdict: for new Python code nodriver is the better of the two, because it is released and it measured better than every Playwright based tool on the same targets. Its weak spot is where the benchmark did not measure: the events it sends and the profile it throws away after every run.

<ProductMention />
