</>

Technology

Selenium

Difficulty

Beginner

Interview Question

Explain the Selenium WebDriver architecture. How does Selenium communicate with browsers?

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-java JAR
  • Provides WebDriver interface, 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 callHTTP 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)
ProtocolCustom JSON Wire ProtocolW3C standard (official spec)
StatusDeprecatedCurrent standard
Browser supportVia JSON WireAll major browsers natively
Relative locatorsNoYes (near(), above(), below())
CDP accessNoYes (BiDi / Chrome DevTools Protocol)
W3C capabilitiesPartialFull

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

Follow AutomateQA

Related Topics