WebDriver is an API and protocol that defines a language-neutral interface for controlling the behaviour of web browsers. Each browser is backed by a specific WebDriver implementation, called a driver, written by the browser vendor, usually in a systems language.
| Browser | Driver | Written in | Maintained by |
|---|---|---|---|
| Chrome/ Edge | chromedriver, msedgedriver | C++ | Google/ Microsoft |
| Firefox | geckodriver | Rust | Mozilla |
| Safari | safaridriver | Objective-C / Swift (macOS native) | Apple |
| Opera | operadriver | C++ (based on Chromium) | Opera Software |
These drivers are standalone server programs that implement the W3C WebDriver protocol, which is an HTTP+JSON REST-like interface. They listen on a port (e.g., 9515) for commands such as POST /session, POST /element, etc.
The "bindings" are the client libraries used to write automation code in a preferred language - Python, Java, JavaScript, C#, Ruby, etc.
| Language | Binding (client library) | Example package |
|---|---|---|
| Python | selenium-python | pip install selenium |
| Java | selenium-java | Maven dependency |
| C# | selenium-dotnet | NuGet |
| JS/ TS | selenium-webdriver | npm package |
Each binding knows how to
- Translate method calls (
river.get(),find_element(), etc.) - into HTTP requests (JSON payloads) and
- send them to the corresponding browser driver’s REST endpoint
The upshot
The language bindings don't care what the driver is written in, and vice versa. The drivers and bindings just speak the same JSON-over-HTTP protocol.