Skip to content

nodriver

4,003 2 14 AGPL-3.0
0.48.1 (9 Nov 2025) Jan 15 2024 321.9 thousand (month)

nodriver is a Python library for browser automation that communicates directly with the browser via the Chrome DevTools Protocol (CDP), without relying on Selenium or chromedriver. It is the successor to undetected-chromedriver, created by the same author, and is designed from the ground up to be undetectable by anti-bot systems.

Key advantages over traditional browser automation:

  • No chromedriver dependency Communicates directly with Chrome/Chromium via CDP websocket, eliminating the most common detection vector (chromedriver fingerprint).
  • Undetectable by default Does not set the navigator.webdriver flag, does not inject automation-related JavaScript, and avoids CDP detection patterns that anti-bot systems look for.
  • Fast and lightweight Without the Selenium/WebDriver protocol overhead, nodriver is significantly faster at launching browsers and executing commands.
  • Async-first Built entirely on Python's asyncio, enabling efficient concurrent browser automation.
  • Simple API Clean, Pythonic API that is easier to use than raw CDP or Selenium.

nodriver is particularly useful for scraping websites protected by advanced anti-bot systems like Cloudflare, DataDome, or PerimeterX, where standard Selenium or Playwright setups get detected and blocked.

Highlights


anti-detectcdpasyncfast

Example Use


```python import nodriver as uc import asyncio

async def main(): # Launch browser - undetected by default browser = await uc.start()

# Open a new tab and navigate
tab = await browser.get("https://example.com")

# Wait for an element and interact with it
search_box = await tab.find("input[name='q']")
await search_box.send_keys("web scraping")

# Click a button
button = await tab.find("button[type='submit']")
await button.click()

# Wait for navigation and extract content
await tab.wait_for("div.results")
results = await tab.query_selector_all("div.result")

for result in results:
    title = await result.query_selector("h3")
    print(await title.get_text())

# Take a screenshot
await tab.save_screenshot("results.png")

browser.stop()

asyncio.run(main()) ```

Alternatives / Similar


12,519 3.5.5 (2024-02-17 17:18:36 ago) Sep 04 2020 compare
camoufox new
7,089 0.4.11 (2025-01-29 09:33:18 ago) Mar 01 2024 compare
718 1.9.4 (2024-10-22 01:41:19 ago) Jul 22 2022 compare
pydoll new
- 0.0.0 (2025-02-01 00:00:00 ago) Jun 01 2024 compare
5,944 v0.6.1 (2024-03-02 18:08:29 ago) Feb 23 2022 compare
34,072 4.43.0 (2026-04-10 06:47:01 ago) Apr 25 2008 compare
14,506 1.58.0 (2026-01-30 15:09:24 ago) Feb 24 2021 compare
87,251 0.12.6 (2026-04-02 07:55:13 ago) Nov 01 2024 compare
primp new
504 1.2.2 (2026-04-03 07:11:15 ago) Jun 01 2024 compare
1,751 0.7.1 (2024-07-13 09:07:25 ago) Feb 23 2022 compare
skyvern new
21,046 1.0.29 (2026-04-02 14:42:44 ago) Feb 01 2024 compare
1,837 0.5.1 (2026-01-19 16:59:35 ago) Dec 28 2012 compare
4,321 4.0.97 (2026-01-06 07:45:54 ago) Oct 01 2023 compare
1,001 0.9.2 (2024-12-01 02:55:27 ago) Feb 23 2022 compare
4,193 3.5 (2020-06-16 13:27:02 ago) Apr 25 2014 compare

Other Languages

86,137 1.59.1 (2026-04-11 23:54:46 ago) Jan 23 2015 compare
rod new
6,853 v0.116.2 (2024-07-12 11:52:28 ago) Sep 23 2022 compare
94,086 2.11.2 (2023-04-11 04:13:00 ago) May 29 2018 compare
stagehand new
22,012 3.2.1 (2026-04-10 21:10:37 ago) Oct 29 2024 compare
7,293 3.3.6 (2023-03-01 12:19:02 ago) May 15 2018 compare
12,937 chromedp (2026-04-01 00:05:30 ago) May 10 2021 compare
3,062 v2.4.0 (2026-01-08 05:29:21 ago) Jul 17 2018 compare
Was this page helpful?