
WebDriver is a tool for automating testing web applications. It is popularly known as Selenium 2.0. WebDriver uses a different underlying framework, while Selenium RC uses JavaScript Selenium-Core embedded within the browser which has got some limitations. WebDriver interacts directly with the browser without any intermediary, unlike Selenium RC that depends on a server. It is used in the following context −
Multi-browser testing including improved functionality for browsers which is not well-supported by Selenium RC (Selenium 1.0).
Handling multiple frames, multiple browser windows, popups, and alerts.
Complex page navigation.
Advanced user navigation such as drag-and-drop.
AJAX-based UI elements.
WebDriver is best explained with a simple architecture diagram as shown below.
| Selenium RC | Selenium WebDriver | 
|---|---|
| The architecture of Selenium RC is complicated, as the server needs to be up and running before starting a test. | WebDriver's architecture is simpler than Selenium RC, as it controls the browser from the OS level. | 
| Selenium server acts as a middleman between the browser and Selenese commands. | WebDriver interacts directly with the browser and uses the browser's engine to control it. | 
| Selenium RC script execution is slower, since it uses a Javascript to interact with RC. | WebDriver is faster, as it interacts directly with the browser. | 
| Selenium RC cannot support headless execution as it needs a real browser to work with. | WebDriver can support the headless execution. | 
| It's a simple and small API. | Complex and a bit large API as compared to RC. | 
| Less object-oriented API. | Purely object oriented API. | 
| Cannot test mobile Applications. | Can test iPhone/Android applications. | 
Let us understand how to work with WebDriver. For demonstration, we would use https://www.calculator.net/. We will perform a "Percent Calculator" which is located under "Math Calculator". We have already downloaded the required WebDriver JAR's. Refer the chapter "Environmental Setup" for details.
Step 1 − Launch "Eclipse" from the Extracted Eclipse folder.
Step 2 − Select the Workspace by clicking the 'Browse' button.
Step 3 − Now create a 'New Project' from 'File' menu.
Step 4 − Enter the Project Name and Click 'Next'.
Step 5 − Go to Libraries Tab and select all the JAR's that we have downloaded. Add reference to all the JAR's of Selenium WebDriver Library folder and also selenium-java-2.42.2.jar and selenium-java-2.42.2-srcs.jar.
Step 6 − The Package is created as shown below.
Step 7 − Now right-click on the package and select 'New' >> 'Class' to create a 'class'.
Step 8 − Now name the class and make it the main function.
Step 9 − The class outline is shown as below.
Step 10 − Now it is time to code. The following script is easier to understand, as it has comments embedded in it to explain the steps clearly. Please take a look at the chapter "Locators" to understand how to capture object properties.
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
public class webdriverdemo {
   public static void main(String[] args) {
   
      WebDriver driver = new FirefoxDriver();
      //Puts an Implicit wait, Will wait for 10 seconds before throwing exception
      driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
      
      //Launch website
      driver.navigate().to("http://www.calculator.net/");
      
      //Maximize the browser
      driver.manage().window().maximize();
      
      // Click on Math Calculators
      driver.findElement(By.xpath(".//*[@id = 'menu']/div[3]/a")).click();
      
      // Click on Percent Calculators
      driver.findElement(By.xpath(".//*[@id = 'menu']/div[4]/div[3]/a")).click();
      
      // Enter value 10 in the first number of the percent Calculator
      driver.findElement(By.id("cpar1")).sendKeys("10");
      
      // Enter value 50 in the second number of the percent Calculator
      driver.findElement(By.id("cpar2")).sendKeys("50");
      
      // Click Calculate Button
      driver.findElement(By.xpath(".//*[@id = 'content']/table/tbody/tr[2]/td/input[2]")).click();
      
      // Get the Result Text based on its xpath
      String result =
         driver.findElement(By.xpath(".//*[@id = 'content']/p[2]/font/b")).getText();
      
      // Print a Log In message to the screen
      System.out.println(" The Result is " + result);
      
      //Close the Browser.
      driver.close();
   }
}
Step 11 − The output of the above script would be printed in Console.
The following table lists some of the most frequently used commands in WebDriver along with their syntax.
| Sr.No. | Command & Description | 
|---|---|
| 1 | driver.get("URL") To navigate to an application.  | 
| 2 | element.sendKeys("inputtext") Enter some text into an input box.  | 
| 3 | element.clear() Clear the contents from the input box.  | 
| 4 | select.deselectAll() Deselect all OPTIONs from the first SELECT on the page.  | 
| 5 | select.selectByVisibleText("some text") Select the OPTION with the input specified by the user.  | 
| 6 | driver.switchTo().window("windowName") Move the focus from one window to another.  | 
| 7 | driver.switchTo().frame("frameName") Swing from frame to frame.  | 
| 8 | driver.switchTo().alert() Helps in handling alerts.  | 
| 9 | driver.navigate().to("URL") Navigate to the URL.  | 
| 10 | driver.navigate().forward() To navigate forward.  | 
| 11 | driver.navigate().back() To navigate back.  | 
| 12 | driver.close() Closes the current browser associated with the driver.  | 
| 13 | driver.quit() Quits the driver and closes all the associated window of that driver.  | 
| 14 | driver.refresh() Refreshes the current page.  |