Selenium WebDriver + Java OOP Interview Q&A
1. Why do we use `WebDriver driver = new ChromeDriver();` instead of `ChromeDriver driver = new
ChromeDriver();`?
We use `WebDriver` as the reference type to follow the polymorphism principle in Java. It allows switching
browsers easily without changing test logic.
Example:
WebDriver driver = new ChromeDriver();
// later switch:
driver = new FirefoxDriver();
2. What is the role of the WebDriver interface in Selenium?
`WebDriver` is the main interface in Selenium defining methods like `get()`, `findElement()`, `quit()`. All
browser drivers implement it.
3. What is polymorphism and how is it used in Selenium?
Polymorphism allows a parent interface to reference different child classes. In Selenium, `WebDriver driver`
can point to ChromeDriver, FirefoxDriver, etc.
4. What are the advantages of using interfaces like WebDriver or SearchContext?
- Flexibility
- Scalability
- Maintainability
`SearchContext` is the top-level interface, and `WebDriver` extends it.
5. How does Selenium support cross-browser testing using WebDriver?
Selenium provides different drivers that implement WebDriver. So you can use `WebDriver driver = new
ChromeDriver();` or `new FirefoxDriver();` etc.
6. What is the difference between RemoteWebDriver, WebDriver, and ChromeDriver?
- WebDriver: Interface
- ChromeDriver: Class for Chrome, implements WebDriver
- RemoteWebDriver: Executes on remote machines (e.g., Selenium Grid)
7. If you write `WebDriver driver = new ChromeDriver();`, which methods can you access?
Only WebDriver interface methods like `get()`, `findElement()`, `quit()`, etc.
Not ChromeDriver-specific methods like `getNetworkConditions()`.
8. What happens if you write `SearchContext driver = new ChromeDriver();`?
You can only use `findElement()` and `findElements()` methods. Other WebDriver methods won't be
accessible.
9. What is the difference between upcasting and downcasting in Selenium context?
- Upcasting: `WebDriver driver = new ChromeDriver();` (safe, common)
- Downcasting: `(ChromeDriver) driver` (used to access Chrome-specific methods)
10. Can you directly instantiate the WebDriver interface? Why or why not?
No. Interfaces can't be instantiated directly. You must use a class that implements it.
Correct: `WebDriver driver = new ChromeDriver();`
Advanced Questions on SearchContext, RemoteWebDriver, and WebDriver
11. What is `SearchContext` in Selenium and how is it used?
`SearchContext` is the top-most interface in Selenium. It declares only two methods:
- `findElement(By by)`
- `findElements(By by)`
It is the super interface of `WebDriver`, and even `WebElement` implements it. This allows recursive
searching inside elements.
Example:
SearchContext context = new ChromeDriver(); // works, but limited to find methods.
12. What is `RemoteWebDriver` in Selenium?
`RemoteWebDriver` is a class in Selenium used to execute tests on remote machines (e.g., Selenium Grid,
Docker, cloud services).
It implements `WebDriver`, `JavascriptExecutor`, `TakesScreenshot`, etc.
Example:
WebDriver driver = new RemoteWebDriver(new URL("[Link] capabilities);
13. How does `RemoteWebDriver` differ from `ChromeDriver`?
- `ChromeDriver` runs the browser on the local machine.
- `RemoteWebDriver` sends commands to a remote node using JSON Wire Protocol or W3C WebDriver
protocol.
It is useful for distributed or parallel test execution.
14. Why does `WebDriver` interface exist when we already have `RemoteWebDriver` and
`ChromeDriver` classes?
`WebDriver` defines a contract (a set of methods) that all driver classes must follow. This promotes:
- Abstraction
- Polymorphism
- Code maintainability
It allows frameworks to interact with any browser in a uniform way.
15. Can we instantiate `RemoteWebDriver` directly? In which cases should we do that?
Yes, we can instantiate `RemoteWebDriver` directly. We do this when:
- Running tests on Selenium Grid
- Executing in Docker containers
- Using cloud services like BrowserStack or Sauce Labs
Example:
Capabilities caps = new ChromeOptions();
WebDriver driver = new RemoteWebDriver(new URL("[Link] caps);