Skip to content

nodrivervsskyvern

AGPL-3.0 14 2 4,003
321.9 thousand (month) Jan 15 2024 0.48.1(2025-11-09 05:57:23 ago)
21,046 17 148 AGPL-3.0
Feb 01 2024 250.9 thousand (month) 1.0.29(2026-04-02 14:42:44 ago)

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.

Skyvern is an AI-powered browser automation tool that uses large language models (LLMs) and computer vision to interact with websites. Instead of relying on DOM selectors, Skyvern takes screenshots of web pages and uses visual understanding to identify and interact with elements, making it highly resilient to website changes.

Key features include:

  • Vision-based interaction Uses screenshots and computer vision (multimodal LLMs) to understand page layout and identify interactive elements visually, rather than through DOM inspection alone.
  • No selectors needed Describe tasks in natural language and Skyvern figures out what to click, type, and navigate without CSS selectors or XPath.
  • Complex workflow automation Can handle multi-step workflows like form filling, navigation through menus, file uploads, and multi-page processes.
  • Self-correcting When actions fail, Skyvern can analyze the resulting page state and adjust its approach, recovering from errors autonomously.
  • API-first design Provides a REST API for triggering and managing automation tasks programmatically.
  • Open source with cloud option Core engine is open source and can be self-hosted. Also available as a managed cloud service.

Skyvern is particularly effective for automating tasks on websites with complex or dynamic UIs where traditional selector-based automation breaks frequently. It achieved 85.85% accuracy on the WebVoyager benchmark.

Highlights


anti-detectcdpasyncfast
ai-powerednatural-languageanti-detect

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()) ```
```python import requests # Skyvern runs as a service - interact via REST API SKYVERN_API = "http://localhost:8000/api/v1" # Create a task with natural language instructions task = requests.post( f"{SKYVERN_API}/tasks", json={ "url": "https://example.com/contact", "navigation_goal": "Fill out the contact form with test data and submit it", "data_extraction_goal": "Extract the confirmation message after submission", "navigation_payload": { "name": "John Doe", "email": "john@example.com", "message": "Hello, this is a test message", }, }, ).json() task_id = task["task_id"] # Check task status result = requests.get(f"{SKYVERN_API}/tasks/{task_id}").json() print(result["status"]) # "completed" print(result["extracted_information"]) # confirmation message ```

Alternatives / Similar


Was this page helpful?