Nodriver is an asynchronous Python library that automates Chromium-family browsers through the Chrome DevTools Protocol (CDP), without Selenium or a ChromeDriver binary. You write Python coroutines to start a browser, navigate, find elements, interact with pages, persist cookies and call CDP methods directly. The project describes itself as the successor to undetected-chromedriver and uses the slogan “No more webdriver, no more selenium.”
That architecture can simplify deployments and give you lower-level browser control, but it is not a guarantee that any particular website will allow automation. Detection and access depend on the target site, account, browser version, network and your actions.
What Nodriver is (and is not)
Nodriver is distributed as a Python package for asynchronous browser automation and web scraping. Instead of sending commands to a WebDriver server, it communicates with a Chromium-based browser over CDP. The browser remains a real Chrome-family process, while Nodriver provides Python objects and awaitable methods for navigation, lookup and interaction.
The official package description calls Nodriver the successor to undetected-chromedriver. That is project positioning, not an independent benchmark. The reviewed official materials do not publish a detection rate, speed comparison or guaranteed result against a named anti-bot service.
Do these 3 things before closing this tab:
1Scan for outdated or missing drivers - takes under a minute2Clear out junk files and repair common Windows errors3Fix the driver behind crashes, sound loss and screen glitches#1 Best Overall
CDP instead of WebDriver
WebDriver automation normally involves a client library, a driver executable such as ChromeDriver and the browser. Nodriver removes the driver layer and speaks the browser’s DevTools Protocol directly. Its API documentation presents a higher-level interface over CDP: commands return objects that can be passed into later commands, and you generally do not instantiate CDP types yourself.
This is useful when your workflow needs browser tabs, events, network or storage controls that are exposed by CDP. It also means that browser and protocol changes matter; test upgrades rather than assuming every version behaves identically.
Install Nodriver and prepare a browser
- Install a supported Python environment and the package:
pip install nodriver
- Install a Chrome or Chromium-family browser. The project lists Chromium, Chrome, Edge and Brave as known to work.
- Run your script from an environment that can launch the browser. On a machine without a display, the README says headless mode is possible and mentions Xvfb as an option.
The official pages do not provide a complete operating-system and browser-version compatibility matrix. If you deploy in a container or server, pin and test the browser build used in production.
Installation and examples: Nodriver on PyPI and the official GitHub README.
The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Your first asynchronous script
Nodriver’s basic pattern is asynchronous startup followed by asynchronous navigation. Save this as capture.py:
import asyncio
import nodriver as uc
async def main():
browser = await uc.start()
page = await browser.get("https://example.com")
print(await page.get_content())
if __name__ == "__main__":
asyncio.run(main())
uc.start() launches a browser and returns a browser object; browser.get() opens a URL and returns a tab/page object. The exact returned methods and CDP objects are documented in the project’s API reference. Keep the event loop alive until all awaited work is complete.
Rank #2
Headless execution
For CI or a server, configure headless operation according to the version you install and the browser’s command-line options. A display-less Linux host may instead run a virtual display such as Xvfb, as suggested by the README. Validate screenshots, downloads and JavaScript behavior in the same mode you will use in production because headless and headed runs can differ.
Finding and using page elements
The package description documents lookup by visible text, CSS selector and XPath. Common lookup operations can include iframe content and can retry while waiting for an element. A typical flow is:
import asyncio
import nodriver as uc
async def main():
browser = await uc.start()
page = await browser.get("https://example.com/login")
# Method names can vary with the installed release; inspect the API docs
# for the exact element interaction available in your version.
email = await page.find("input[type='email']")
await email.send_keys("[email protected]")
password = await page.find("input[type='password']")
await password.send_keys("not-a-real-password")
submit = await page.find("button[type='submit']")
await submit.click()
await browser.stop()
asyncio.run(main())
Use stable selectors where possible. Text selectors are readable but can break when copy changes; generated class names are often less stable than semantic attributes. For dynamic pages, wait for a selector or an application state rather than sleeping for an arbitrary number of seconds.
Iframe-aware searches
Nodriver’s project description says its common element lookup includes iframe content. That can remove manual frame-switching code for some workflows, but iframe origin policies and application timing still apply. If an embedded document is not ready, wait for its content and confirm that your selector is evaluated in the intended frame.
Cookies, tabs and browser state
The documented feature list includes saving and loading cookies, inspecting tabs and connecting to a running Chrome debug session. Cookie persistence lets a later run reuse an authenticated session instead of logging in every time.
- Store cookies securely; they can grant account access.
- Separate profiles and cookie files for development, staging and production.
- Expire or delete state when a job finishes if the account is shared.
- Check the target site’s terms and authorization before automating authenticated pages.
Because APIs evolve, consult the installed version’s reference for the exact persistence and tab-management method names. The browser API overview is at the Nodriver CDP browser documentation.
Rank #3
Using CDP directly
Nodriver exposes CDP domains, methods and events in addition to its convenience lookups. This is the escape hatch for capabilities such as network inspection, page lifecycle events, browser targets or storage controls that are not represented by a single high-level helper.
The documented pattern is to call a domain method through Nodriver and use its returned object as an argument to subsequent calls. Prefer the library’s wrappers over constructing protocol types manually, and isolate CDP-specific code so it is easy to adjust when Chrome changes.
Anti-detection claims: what you can responsibly expect
Nodriver’s project page says direct communication offers better resistance to web application firewalls and describes the library as “optimized to stay undetected for most anti-bot solutions.” Those statements are claims by the project. The official sources reviewed here provide no independently measured success rate, controlled comparison or guarantee for a particular website.
Do not treat “without WebDriver” as “undetectable.” A site can use signals unrelated to the driver protocol, including IP reputation, login behavior, browser characteristics, JavaScript challenges, rate limits and account history. Automate only systems you own or are authorized to test, respect robots and terms where applicable, and design a fallback for a challenge or blocked request.
Version-specific note about 0.50.1
The package page describes version 0.50.1 as a substantial rewrite associated with a switch to a flat-mode connection. It also says iframes are included in more operations and advises thorough testing, especially in large projects. Treat this as historical release context, not a promise about every later release. Before upgrading, read the current release notes, run your end-to-end suite and verify login, iframe, download and shutdown behavior.
Reliability and performance practices
Control concurrency
Asynchronous APIs make it possible to coordinate many tasks, but each browser consumes CPU, memory and a browser process. Start with a small number of tabs or browser instances, measure resource use, and apply a semaphore around expensive jobs. More concurrency can trigger target-site rate limits without improving throughput.
Rank #4
Wait for conditions, not guesses
Prefer a selector, navigation completion, network-idle condition or application event when your installed API supports it. Fixed sleeps are useful only as a last resort and should be bounded. Add timeouts around every external operation and record the URL, action and exception for diagnosis.
Recover cleanly
- Use a
try/finallyblock to stop the browser when a job exits. - Retry transient navigation failures with a capped backoff; do not blindly retry a rejected login or a bot challenge.
- Save checkpoints for long crawls so a process restart does not repeat every page.
- Log browser, Nodriver and operating-system versions with each run.
Troubleshooting common failures
“No module named nodriver”
The package was installed into a different Python environment. Run python -m pip install nodriver with the same interpreter that runs the script, then check python -c "import nodriver; print(nodriver)".
Recommended Free Tools
Browser executable not found
Install Chrome, Chromium, Edge or Brave, or configure the launch options for the executable path supported by your installed Nodriver version. In containers, verify that the binary and its shared libraries exist inside the image.
Startup hangs or immediately exits
Check display availability, sandbox permissions, profile-directory permissions and conflicting browser processes. On a headless Linux host, try the project’s documented headless approach or run under Xvfb. Capture stderr and test with a fresh profile.
Element lookup returns nothing
The page may still be loading, the selector may target a different frame, or the element may be rendered only after an interaction. Confirm the final URL and page content, wait for the relevant condition, and use a selector based on stable markup.
Automation is challenged or blocked
Nodriver does not guarantee access. Reduce request rate, use an authorized account, investigate the site’s published integration, and handle CAPTCHA or denial pages explicitly. Do not attempt to defeat access controls without permission.
Best Value
An upgrade breaks a large project
Pin the last known-good version, read the release notes and run a focused regression suite. The 0.50.1 flat-connection change is specifically documented as a substantial rewrite, so older code may require careful testing.
When Nodriver is a good fit
- Choose it when you want Python async orchestration, direct CDP access, iframe-aware lookups or browser-state control without maintaining a WebDriver binary.
- Evaluate alternatives when your organization depends on a WebDriver-specific grid, a non-Chromium browser, a mature language binding outside Python or an ecosystem integration Nodriver does not provide.
- Do not choose based solely on anti-detection wording. No official source supplies a universal bypass guarantee or an independent benchmark.
Or skip the browser setup: ScreenshotNeo
If your goal is simply to obtain a clean image or PDF of a public URL rather than interact with a live browser, ScreenshotNeo is a simpler API path. It accepts consent banners before capture and removes more than 60 known consent platforms, newsletter popups and chat widgets; each cleanup step can be disabled. Bot checks, blank pages, timeouts, failed loads and cache hits are not billed, and the response identifies the page verdict and billing status in headers.
One GET request returns PNG, JPEG, WebP or PDF:
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
Python:
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
Node.js:
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
See the complete parameters in the ScreenshotNeo documentation. Options include full-page captures with lazy images loaded, CSS-selector element shots, dark mode, 12 device presets and custom viewports, retina scale, PDF paper and margin controls, custom CSS and JavaScript, clicks, selector or network-idle waits, request blocking, headers, cookies, user agents, Authorization, timezone, geolocation, transparent backgrounds, resizing, chosen cache TTLs, signed image links, asynchronous webhooks, bulk capture of up to 100 URLs per call, a usage API and an OpenAPI specification. An MCP server supplies take_screenshot, get_page_info and capture_pdf tools for Claude, Cursor and other MCP clients.
The Free plan includes 1,000 screenshots per month with no card. Paid plans start at $5 for 3,000 shots; yearly billing gives two months free, and every feature is included on every plan. Create a free ScreenshotNeo account to start.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Scan for outdated or missing drivers - takes under a minuteDriver Scan →FAQ
Does Nodriver require Selenium?
No. Its documented architecture communicates directly with Chromium through CDP and does not require Selenium or ChromeDriver.
Is Nodriver available for JavaScript or Java?
The project materials covered here describe a Python package. They do not establish equivalent official libraries for other languages.
Can Nodriver automate Firefox?
The documented known-working browsers are Chromium, Chrome, Edge and Brave. The supplied official materials do not establish Firefox support.
Is Nodriver free?
It is installed as a Python package with pip. The supplied sources do not describe a separate commercial license or hosted service.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




