nodriver
[Docs here](https://ultrafunkamsterdam.github.io/nodriver)
What it is and what it does
nodriver automates browser interactions by communicating directly with Chrome DevTools Protocol instead of using WebDriver or Selenium, which reduces detection signatures. It is fully asynchronous and designed to work with chromium, chrome, edge, and brave. The library aims to stay undetected against anti-bot solutions while maintaining a minimal, intuitive API—most tasks work with sensible defaults and require only a few lines of code.
The package handles profile management (creating fresh profiles per run and cleaning them up), cookie persistence, element selection by text or CSS selector (including iframe traversal), and direct access to the full Chrome DevTools Protocol for advanced customization. It depends on mss for screenshot capture, websockets for protocol communication, and the deprecated library for backward compatibility. Requires a local Chromium-based browser and Python 3.9 or later.
Use it for:
- Scraping sites protected by Cloudflare or other WAFs where traditional WebDriver detection is problematic
- Automating login workflows and saving/reusing cookies to avoid repeated authentication
- Extracting data from JavaScript-heavy pages with iframe content using text-based element lookup
- Testing web applications in headless environments with anti-bot evasion
- Clicking CAPTCHA verification buttons and handling JavaScript challenges programmatically
Worth the install?
AI-flagged interpretation of the facts on this page — verify before relying
nodriver is an async browser automation library that controls Chromium-based browsers via direct protocol communication, designed to evade anti-bot detection while providing a simple, high-level interface.
Yes, with conditions. Install if you need browser automation that evades anti-bot detection and prefer async-first design. The low install friction and active maintenance are strong points. However, the GNU AFFERO GENERAL PUBLIC LICENSE Version 3 requires careful review if you plan to modify and deploy this on a server or in a SaaS product—source code disclosure obligations apply. Also verify that a Chromium-based browser is available in your deployment environment.
Install
nodriver on PyPI
pip
pip install nodriveruv
uv add nodriverpoetry
poetry add nodriverInstalling nodriver
Before you install
Low install friction; pure Python wheel with only three runtime dependencies (mss, websockets, deprecated). Actively maintained with recent commits and solid GitHub presence (4652 stars). Requires a local Chromium-based browser installation and Python 3.9+.
License in practice
Licensed under GNU AFFERO GENERAL PUBLIC LICENSE Version 3, a copyleft license requiring that if you modify and deploy nodriver on a network server, you must provide source code access to users. For local use or closed-source internal tools, this is less restrictive, but distribution or SaaS deployment of modifications requires source disclosure.
Quickstart
import nodriver as uc
async def main():
browser = await uc.start()
page = await browser.get('https://example.com')
await page.close()
uc.loop().run_until_complete(main())
Requires a Chromium-based browser (Chrome, Edge, Brave) installed locally; Python 3.9 or later; on headless systems without a display, Xvfb or similar display emulation is needed.
Verify before relying
- Whether anti-detection techniques remain effective against current WAF implementations and bot-detection services
- Performance characteristics and memory footprint compared to alternatives for large-scale scraping
- Exact Xvfb requirements and configuration for headless deployment
Package facts
| License | GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this… (full text in the JSON record) (agpl) |
| Python support | supports the current Python release (>=3.9) |
| Install friction | low — pure-Python wheel |
| Runtime dependencies | 3 — mss, websockets, deprecated |
| Maintenance | actively maintained — 93 days since the last release |
| Last repo commit | |
| First released | |
| Downloads | 405,563/month — #6,903 on PyPI (30-day window, as of 2026-08-14) |
| Known vulnerabilities | none known (OSV.dev, checked 2026-08-14) |
Evidence: nodriver-0.50.3-py3-none-any.whl
Keywords: webdriver, browser, captcha, scraping, selenium, navigator, python3, cloudflare, chromedriver, anti-bot, bot-detection, cloudflare-bypass, distil, anti-detection
Tags
More Browsers packages
Automate Chromium, Firefox, and WebKit browsers…
permissive · top 1,000 on PyPI
browser-harnessConnects an LLM agent directly to a real…
permissive · top 5,000 on PyPI
patchrightPatchright is an undetected fork of Playwright…
permissive · top 5,000 on PyPI
seleniumbaseSeleniumBase is a browser automation framework…
permissive · top 5,000 on PyPI
browserforgeGenerates realistic browser headers and device…
permissive · top 5,000 on PyPI
proxy.pyA lightweight, pluggable HTTP proxy server…
permissive · top 5,000 on PyPI
zendriverZendriver is an async-first web automation…
agpl · top 15,000 on PyPI
undetected-chromedriverPatches Selenium's Chrome WebDriver to avoid…
copyleft · top 5,000 on PyPI
pydoll-pythonPydoll automates Chromium-based browsers via…
unclear · top 15,000 on PyPI
cloakbrowserLaunches a stealth Chromium browser that evades…
permissive · top 15,000 on PyPI
pyppeteerAutomates headless Chrome/Chromium browser…
permissive · top 5,000 on PyPI
seleniumSelenium provides Python bindings to automate…
permissive · top 1,000 on PyPI
requestiumRequestium merges Requests, Selenium, and…
permissive · top 15,000 on PyPI
selenium-stealthModifies a Selenium Chrome WebDriver to evade…
permissive · top 15,000 on PyPI
chromedriver-binaryDownloads and installs the chromedriver binary…
permissive · top 15,000 on PyPI
mycdpMyCDP provides autogenerated Chrome DevTools…
permissive · top 15,000 on PyPI