Answer
Selenium WebDriver Architecture
Architecture Overview (Selenium 4 / W3C)
CODE
Your Test Code (Java)
│
│ Java Selenium Bindings (selenium-java)
↓
WebDriver API
│
│ HTTP requests (W3C WebDriver Protocol / JSON over REST)
↓
Browser Driver
(ChromeDriver / GeckoDriver / EdgeDriver / SafariDriver)
│
│ Browser-native protocol (CDP for Chrome, etc.)
↓
Browser
(Chrome / Firefox / Edge / Safari)
│
│ Interacts with
↓
Web Page
Key Components
1. Selenium Client Library (Language Binding)
- ✓Your Java code +
selenium-javaJAR - ✓Provides
WebDriverinterface,WebElement,By,WebDriverWait - ✓Converts Java calls → HTTP requests
Java
WebDriver driver = new ChromeDriver();
driver.get("https://example.com");
// ↑ This compiles to an HTTP POST /session/{id}/url
2. Browser Driver (ChromeDriver / GeckoDriver)
- ✓Standalone binary that bridges Selenium ↔ Browser
- ✓Starts an HTTP server on
localhost:9515(default) - ✓Receives W3C WebDriver JSON commands from Selenium
- ✓Translates to browser-specific instructions
Bash
# ChromeDriver starts automatically when you call new ChromeDriver()
# But you can start it manually:
chromedriver --port=9515
3. W3C WebDriver Protocol (Selenium 4)
Every Selenium command is an HTTP request to the driver's server:
| Selenium call | HTTP request |
|---|---|
driver.get(url) | POST /session/{id}/url with {"url": "https://..."} |
driver.findElement(By.id("x")) | POST /session/{id}/element with {"using":"id","value":"x"} |
element.click() | POST /session/{id}/element/{elemId}/click |
element.sendKeys("text") | POST /session/{id}/element/{elemId}/value |
driver.quit() | DELETE /session/{id} |
4. Browser
- ✓Receives instructions from its driver
- ✓Executes actions on the real DOM
- ✓Returns results (element handles, text, titles) as JSON
Selenium 3 vs Selenium 4 Protocol
| Selenium 3 (JSONWireProtocol) | Selenium 4 (W3C WebDriver) | |
|---|---|---|
| Protocol | Custom JSON Wire Protocol | W3C standard (official spec) |
| Status | Deprecated | Current standard |
| Browser support | Via JSON Wire | All major browsers natively |
| Relative locators | No | Yes (near(), above(), below()) |
| CDP access | No | Yes (BiDi / Chrome DevTools Protocol) |
| W3C capabilities | Partial | Full |
Flow for driver.findElement(By.id("email")).sendKeys("test@email.com")
CODE
1. Java: driver.findElement(By.id("email"))
↓
2. Selenium lib sends:
POST http://localhost:9515/session/abc123/element
Body: {"using": "id", "value": "email"}
↓
3. ChromeDriver receives request
↓
4. ChromeDriver tells Chrome to find element with id="email"
↓
5. Chrome searches DOM, returns element handle
↓
6. ChromeDriver responds:
{"value": {"element-6066-11e4-a52e-4f735466cecf": "element-1"}}
↓
7. Java receives WebElement with internal ID "element-1"
↓
8. Java: element.sendKeys("test@email.com")
↓
9. POST /session/abc123/element/element-1/value
Body: {"text": "test@email.com"}
↓
10. ChromeDriver types into the element in Chrome
WebDriverManager (Avoid Manual Driver Management)
Java
// Old way — manually download and set path
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
WebDriver driver = new ChromeDriver();
// Modern way — WebDriverManager auto-downloads correct version
WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
// In Selenium 4.6+ — WebDriverManager is bundled, just:
WebDriver driver = new ChromeDriver(); // no setup() needed
