What Is zendriver? β Definition and How It Works
Learn what zendriver is, how it differs from nodriver, how its CDP connection model constrains remote browsers, and where it fits in a stack.
zendriver is an async Python library that automates Chromium over the Chrome DevTools Protocol without a WebDriver component. It began as a community-maintained fork of nodriver, keeping the same driver-free design while moving faster on fixes and typing.
1. The Shared Design
Like its parent, zendriver launches Chromium and speaks CDP to it directly. There is no ChromeDriver process, so the launch artefacts that a driver introduces are absent rather than patched over.
The API is asynchronous end to end:
import asyncio, zendriver as zd
async def main():
browser = await zd.start(headless=False)
page = await browser.get("https://example.com")
print(await page.get_content())
await browser.stop()
asyncio.run(main())
Element lookup by visible text, default waiting, and CDP-level input events all carry over. For most scripts the two libraries are interchangeable at the source level.
2. What the Fork Changed
The fork's value is maintenance rather than a different architecture: type hints throughout, more consistent async cleanup, and a faster release cadence against Chromium changes. Teams generally pick it for responsiveness to breakage, not for a capability the parent lacks.
3. The Connection Model Is a Real Constraint
zendriver assumes it owns the browser. It launches Chromium locally and holds the connection.
Attaching to a browser someone else started is narrower than it first appears. The connect_existing path takes a host and port for a DevTools HTTP endpoint, not an arbitrary WebSocket URL, so a remote browser service that hands you a single ws:// or wss:// address does not slot in directly. One such URL addresses one browser, and the per-tab endpoints that a local DevTools server publishes are not reachable the same way through a remote provider.
Bridging that gap means working at the protocol level β attaching to a target, keeping the returned session identifier, and stamping it on outgoing messages β rather than passing a URL to a constructor. Anyone planning to drive a hosted browser with zendriver should confirm this early, because it shapes the integration far more than any API detail.
4. What It Does Not Do
zendriver removes driver artefacts. It does not manage fingerprints, and it does not touch the network path. The browser reports its real screen, timezone, fonts, and GPU strings unless something else changes them, and the request carries whatever IP reputation its egress has.
It is Chromium-only, and async-only.
5. Summary
zendriver is an actively maintained, typed fork of nodriver: async Python, direct CDP, no WebDriver layer. Its practical distinguishing feature is not stealth but its connection model β driving a remote browser with it requires protocol-level work, whereas driving a local one is straightforward. Fingerprints and proxies remain separate concerns.