Understanding WebDriver driver = new FirefoxDriver()
This statement uses interface reference and object polymorphism — a core Java OOP concept.
Breaking it down:
WebDriver driver = new FirefoxDriver();
↑ ↑ ↑
Interface Reference var Actual object created
(type) (name) (implementation)
WebDriver is an interface:
public interface WebDriver {
void get(String url);
String getTitle();
String getCurrentUrl();
WebElement findElement(By by);
List<WebElement> findElements(By by);
// ... many more abstract methods
}
FirefoxDriver implements WebDriver:
public class FirefoxDriver implements WebDriver {
// Implements all abstract methods from WebDriver interface
@Override
public void get(String url) { /* Firefox-specific implementation */ }
@Override
public String getTitle() { /* Firefox-specific implementation */ }
// ...
}
Why use WebDriver type instead of FirefoxDriver type?
// Option 1 - WebDriver type (PREFERRED)
WebDriver driver = new FirefoxDriver();
// Can reassign to any browser implementation:
driver = new ChromeDriver(); // Works!
driver = new SafariDriver(); // Works!
// Option 2 - FirefoxDriver type (LIMITING)
FirefoxDriver driver = new FirefoxDriver();
// Cannot reassign to other browsers easily
Cross-browser switching with WebDriver type:
WebDriver driver;
String browser = System.getProperty("browser", "chrome");
if (browser.equals("firefox")) {
driver = new FirefoxDriver();
} else if (browser.equals("ie")) {
driver = new InternetExplorerDriver();
} else {
driver = new ChromeDriver();
}
// driver.get() works identically regardless of browser
driver.get("https://example.com");
Key concept:
WebDriver is an interface containing several abstract methods such as get(), findElement() etc. We create a reference to the WebDriver interface, and we can assign objects (FirefoxDriver, ChromeDriver, IEDriver, AndroidDriver) to it — enabling polymorphism for cross-browser testing.
