1. Overview
    1. Architecture
      1. Focus on the User
        1. The WebDriver APIs are focused on driving the browser from the user's point of view.
        2. e.g. "getText" attempts to return the text as a user would see it
      2. Layered
        1. API Wrapper
        2. Drivers for different browsers
    2. Getting Started
      1. Start
      2. Next Steps
        1. Navigating
        2. Interacting with the Page
        3. Filling in Forms
        4. Visual Information and Drag And Drop
        5. Moving between Windows and Frames
        6. Navigation: history and location
        7. Cookies
  2. Drivers
    1. HtmlUnitDriver
      1. Pure Java Implementation
      2. Platform Independent
      3. Support JavaScript
    2. IE
      1. Slow
      2. Windows
      3. Required configuration
        1. IE7 Protected Mode
        2. 100% Zoom
    3. Firefox
    4. Mobile
  3. API
    1. Interactions
      1. Check out interactions in WebElement API
      2. Advanced Interactions (Dev In Progress)
      3. Ajax Request
        1. Check Element Status Change
        2. Use JavascriptExecutor to check JavaScript status variable
        3. When use page objects, use AjaxElementLocatorFactory to wait elements for a certain time.
    2. Waiter
      1. explicit wait
        1. Document
          1. WebDriverWait
          2. Function
        2. Example
      2. implicit wait
        1. driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS)
        2. when using findElement it will wait implicitly until the element presents
        3. API
  4. Supported Locators
    1. XPath
    2. CSSSelector
    3. id, name, etc
  5. Language Support
    1. Java
    2. Ruby
  6. Development Strategies
    1. Domain Driven Design
      1. Ubiquitous Language (Business Language)
    2. BotStyle
      1. It's possible to layer PageObjects on top of bots.
    3. Page Objects
      1. Benefits
        1. Reduce Duplicated Code
        2. Fix need only be applied in one place
      2. Design
        1. The public methods represent the services that the page offers
        2. Try not to expose the internals of the page
        3. Generally don't make assertions
        4. Methods return other PageObjects
        5. Need not represent an entire page, could be part of a page, e.g. site navigation.
        6. Different results for the same action are modelled as different methods, e.g. successLogin, failedLogin
        7. Check current page by comparing title, see example.
      3. Page Factory
        1. Help to initElements, this is very useful.
      4. LoadableComponent
        1. Improve of Page Objects, do not need to load page explicitly any more
  7. Integrate With Cuke4duke
    1. Page Objects
      1. What's difference when integrate with cuke4duke?
        1. Should have assert in page objects
        2. Do not need return any page objects in methods
      2. Check out cuke-webdriver-demo in github
    2. picocontainer
      1. Used for DI of pages
  8. Others
    1. WebElement VS RenderedWebElement
    2. Selenium Emulation (WebDriver backed Selenium API)
    3. WebDriver VS Selenium
    4. WebDriver & Maven
    5. Automation Atoms
    6. How does WebDriver deal with untrusted SSL
    7. WebDriver Grid (Same as Selenium Grid)
      1. Hug
      2. Node
    8. Remote
      1. Client
      2. Server
      3. Wire Protocol