Pydoll: Automate the Web, naturally

Pydoll connects directly to the Chrome DevTools Protocol. No WebDrivers, with human-like interactions, asynchronous performance and the ability to handle behavioral CAPTCHAs (e.g., Cloudflare Turnstile, reCAPTCHA v3), depending on IP reputation and interaction patterns.

Bypass Cloudflare com Pydoll

Cloudflare captcha bypass example

Zero WebDrivers

Direct CDP integration to reduce complexity and increase reliability.

Human-like interactions

Clicks, navigation and typing that simulate human behavior.

Async and scalable

Automate multiple tabs and tasks in parallel with asyncio.

Browser-context requests

Use tab.request to automatically inherit cookies, CORS and session state.

Network interception

Monitor, modify and fulfill requests with flexibility.

Reactive events

React to page, network and runtime events in real-time.

Install and get started in seconds

No complex setup. Install, import and automate.

pip install pydoll-python

Quick example:

import asyncio
from pydoll.browser.chromium import Chrome

async def main():
    async with Chrome() as browser:
        tab = await browser.start()
        await tab.go_to('https://example.com')
        title = await tab.execute_script('return document.title')
        print(title)

asyncio.run(main())
terminal
Pydoll automation example

Highlights

Key capabilities with simple examples.

Concurrent automation

Process multiple tabs in parallel with a straightforward API.

import asyncio
from pydoll.browser.chromium import Chrome

async def scrape_page(url, tab):
    await tab.go_to(url)
    return await tab.execute_script('return document.title')

async def main():
    browser = Chrome()
    tab1 = await browser.start()
    tab2 = await browser.new_tab()
    titles = await asyncio.gather(
        scrape_page('https://google.com', tab1),
        scrape_page('https://github.com', tab2),
    )
    print(titles)

asyncio.run(main())

Multiple tabs: create and manage tab1 and tab2 in the same browser.

Parallel execution: use asyncio.gather to run tasks simultaneously.

Consistent API: same API per tab, no boilerplate.

Browser‑context requests

Make HTTP calls that inherit session, cookies and CORS from the browser.

from pydoll.browser.chromium import Chrome

async def main():
    async with Chrome() as browser:
        tab = await browser.start()
        await tab.go_to('https://example.com/login')
        # ... realize o login ...
        response = await tab.request.get('https://example.com/api/user/profile')
        print(response.json())

Shared session: browser cookies and auth automatically.

CORS respected: same policies as the browser.

Direct JSON: access response.json() effortlessly.

Browser preferences

Fine-grained Chrome behavior control with handy helpers.

from pydoll.browser.options import ChromiumOptions

options = ChromiumOptions()
options.set_default_download_directory('/tmp/downloads')
options.set_accept_languages('en-US,en,pt-BR')
options.prompt_for_download = False

Silent downloads: no prompts or dialogs.

Language and locale: adjust accept_languages.

Less friction: disable download prompts and distractions.

Frequently asked questions

Top questions about Pydoll, its features and use cases.

What is Pydoll and why doesn't it use WebDriver?

Pydoll is a Python library that controls the browser via the Chrome DevTools Protocol (CDP), eliminating WebDrivers. This reduces layers, improves reliability and gives direct access to advanced capabilities like page events, network interception and JavaScript execution in the real tab context.

Can Pydoll handle CAPTCHAs like Cloudflare Turnstile or reCAPTCHA v3?

It provides human-like interactions (movement, click, typing) and a helper to attempt Turnstile bypass. Effectiveness depends on IP reputation and interaction patterns. For critical flows, combine with quality proxies and good browsing practices.

What are “browser‑context requests” and when to use them?

With tab.request you perform HTTP in the same context as the tab: cookies, session, headers and CORS are automatically inherited. Ideal for hybrid automation: log in via UI and then call the app's authenticated APIs with simplicity and speed.

What are the practical differentiators: concurrency, events and preferences?

- Concurrency: multiple tabs/processes with asyncio.gather.
- Reactive events: listen to Page, Network and Runtime to react in real-time.
- Browser preferences: control silent downloads, languages and internal policies via ChromiumOptions.

Enjoying Pydoll?

Star it, contribute to the repo or sponsor the development.