47
Web Automation using Groovy, WebDriver, JQuery and Page Object Model By: Gaurav Bansal

Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

  • Upload
    vodqa

  • View
    3.860

  • Download
    2

Embed Size (px)

DESCRIPTION

Learn how to design, create, maintain, and re-factor an automation framework using the power of WebDriver, the elegance of jQuery content selection, the robustness of Page Object modeling, and the expressiveness of the Groovy language. Gaurav introduces an open-source testing solution that provides all this, and can be integrated with testing frameworks such as Spock, JUnit & TestNG.

Citation preview

Page 1: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Web Automation using Groovy, WebDriver,

JQuery and Page Object Model

By: Gaurav Bansal

Page 2: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Need…

• We need a solution that is based on technology that is native to WebBrowsers.

• We need a solution that requires no boilerplate code.

• We need a solution that offers a powerful set of tools for matching a set of elements in a document.

• We need a solution that offers in-built mechanism to incorporate Page-object model

Page 3: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Solution…

G E B

Page 4: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

What is Geb?

• Geb is a browser automation solution.• You can use it for…

– Acceptance Testing Web Applications – Automating Web Sites – Screen Scraping

• It brings together the…– Cross browser automation capabilities of WebDriver – Elegance of jQuery content selection – Expressiveness of the Groovy language – Robustness of Page Object modelling

Page 5: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

About the Project

• Free Open Source, Apache License, Version 2.0.

• Currently at version 0.7.0.– Home Page — http://www.gebish.org – The Book of Geb —

http://www.gebish.org/manual/current – Source Code — https://github.com/geb/geb – User Mailing List —

http://xircles.codehaus.org/projects/geb/lists – In Maven Central —

http://mvnrepository.com/artifact/org.codehaus.geb

Page 6: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Project Components

• The heart is the geb-core component which is all you really need (plus WebDriver).

• For testing, you probably also want one of these as well:– geb-spock – geb-junit3 – geb-junit4 – geb-testng – geb-easyb

• (Has been used from Cucumber as well).• There is also a Grails plugin.

Page 7: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

WebDriverhttp://seleniumhq.org/projects/webdriver/

Page 8: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

WebDriver

• Successor to the Selenium project.

• Also known as “Selenium 2”.

• Sponsored and driven by Google.

• Becoming a W3C standard.– http://dvcs.w3.org/hg/webdriver/raw-file/

515b648d58ff/webdriver-spec.html

Page 9: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Cross-browserAutomation

Java based, with many language bindings.

import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.By; import org.openqa.selenium.firefox.FirefoxDriver; 

WebDriver driver = new FirefoxDriver(); driver.get("http://google.com"); WebElement heading = driver.findElement(By.tagName("h1")); 

Page 10: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Mobile Browsers

• Rapidly improving.– iPad – iPhone – Android – Blackberry

• Can use real devices or emulators in most cases.

• A headless webkit based driver (PhantomJS) is in progress.

Page 11: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

WebDriver API

• Geb sits on top of WebDriver so you very rarely deal with its API, though it's accessible if you need it.

• Geb never talks to the actual browser because that's what WebDriver does.

Page 12: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Driver dependency

• You need to pull in a specific driver implementation for each browser you want to work with.– <dependency>– <groupId>org.seleniumhq.selenium</groupId>– <artifactId>selenium-firefox-driver</artifactId>– <version>2.24.1</version> – </dependency>

Page 13: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

jQueryhttp://jquery.com/

Page 14: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

JQuery

• jQuery provides an incredibly powerful API for navigating and selecting content.

– $("div#footer").prev().children(); – CSS based, a whole lot better than XPath.

Page 15: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Geb's inspiration

• Geb features a “Navigator API” that is inspired by jQuery.

– // This is Geb code, not jQuery JavaScript… $("h1").previous().children();

• API is not identical.

Page 16: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Groovyhttp://groovy-lang.org

Page 17: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Dynamic JVM Lang.

• Groovy is…– Compiled, never interpreted – Dynamic, optionally typed – 99% Java syntax compatible – Concise, clear and pragmatic – Great for DSLs – A comfortable Java alternative for most

Page 18: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Geb & Groovy

• Geb uses Groovy's dynamism to remove boilerplate. import geb.*Browser.drive {

to GoogleHomePageat GoogleHomePagesearch.forTerm "wikipedia“at GoogleResultsPage assert firstResultLink.text() == "Wikipedia" firstResultLink.click()waitFor { at WikipediaPage }} 

Page 19: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Page ObjectsThe key to not pulling your hair

out when dealing with web tests.

Page 20: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

What are they?• In a phrase: Domain Modelling.

• By modelling and creating abstractions, we can isolate implementation detail.

$("input[name=username]").value("user")$("input[name=pwd]").value("password")$("input[type=submit]").click() 

• Is far more fragile than this…

void login(String username, String password) { $("input[name=username]").value(username)$("input[name=pwd]").value(password)$("input[type=submit]").click()

}

login("user", "password") 

Page 21: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Just good programming

• It's the application of trusted principles; encapsulation and reuse.

• Not new at all, but new to the world of web testing/automation.

• Not just about modelling “pages”. It's about modelling all kinds of things in the domain of a user's actions online.

• Just giving symbolic names to page content is a great start.

Page 22: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Browser has-a PageBrowser.drive { 

to GoogleHomePage at GoogleHomePage search.forTerm "wikipedia" at GoogleResultsPage assert firstResultLink.text() == "Wikipedia" firstResultLink.click()waitFor { at WikipediaPage }} 

• The to() and click() methods are changing the underlying page.

• You can refer to the current page's content and methods just by name.

Page 23: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Geb's Page Objects

• Geb builds the Page Object pattern directly into the framework (though it is optional).

import geb.*

class GoogleHomePage extends Page { static url = "http://google.com/ncr"  static at = { title == "Google" } static content = { 

search { module GoogleSearchModule }} 

Page 24: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Geb's Page Objects

• Features the “Content DSL” for naming content in a dynamic and powerful way.

import geb.*class GoogleResultsPage extends Page { static at = { waitFor { title.endsWith("Google Search") } }   static content = {         search { module GoogleSearchModule }          results { $("li.g") }         result { i -> results[i] }            resultLink { i -> result(i).find("a.l", 0) }         firstResultLink { resultLink(0) }     } } 

Page 25: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Modules

• Modules are repeating and/or reappearing content.

 import geb.* class GoogleSearchModule extends Module {     static content = {         field { $("input", name: "q") }         button(to: GoogleResultsPage) { btnG() }     }

    class StandardPage extends Page {     static content = {   gmod { module  GoogleSearchModule  }     } } 

Page 26: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

TestingGeb's testing adapters

Page 27: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Geb for Testing

• Geb can be used with…– Spock – JUnit (3 & 4) – TestNG – EasyB – Cucumber (Cuke4Duke)

• The majority of Geb users use Spock.• Geb can dump HTML and screenshots for each

“test” to help in debugging.

Page 28: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Navigator APIjQuery inspired content

selection/navigation

Page 29: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

The $() method

• Returns a Navigator object.

• General format:– $(«css selector», «index/range», «attribute/

text matchers»)

• Examples:– $("div") // all divs – $("div", 0) // first div $("div", 0..2) // first three divs – // The third section heading with text “Geb” $("h2", 2, id: "section", text: "Geb") 

Page 30: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

CSS Selectors

• Full CSS3 if the target browser supports it.

$("div.some-class p:first[title='something']")$("ul li a") $("table tr:nth-child(2n+1) td")$("div#content p:first-child::first-line") 

• CSS lookups are fast.

Page 31: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Attribute/Text match

• Can match on attribute values:– //<div foo="bar">– $("div", foo: "bar")

• The “text” attribute is special:– //<div>foo</div> 

– $("div", text: "foo")

• Can use Regular Expressions:– //<div>foo</div> – $("div", text: ~/f.+/) 

Page 32: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Predicates

• Geb supplies some handy predicates:

$("p", text: startsWith("p")) $("p", class: contains("section")) $("p", id: endsWith(~/\d/))

Page 33: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Relative Content

• $() returns a Navigator that allows you to find relative content. $("p").previous()$("p").prevAll()$("p").next()$("p").nextAll()$("p").parent()$("p").siblings()$("div").children() 

• Most of these methods take selectors, indexes and attribute text/matchers too. $("p").nextAll(".listing") 

Page 34: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Content DSL

Page 35: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Content DSL

class GoogleResultsPage extends Page {     static content = {        results { $("li.g") }        result { i -> results[i] }           resultLink { i -> result(i).find("a.l", 0) }         firstResultLink { resultLink(0) }     }

• Content definitions can build upon each other.

• Content definitions are actually templates.

Page 36: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Optional Content

class OptionalPage extends Page {    static content = {     errorMsg(required: false) { $("p.errorMsg") }   } }

• By default, Geb will error if the content you select doesn't exist.

• The “required” option disables this check.

Page 37: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Dynamic Content

class DynamicPage extends Page {     static content = {         errorMsg(wait: true) { $("p.errorMsg") }     }}

• Geb will wait for some time for this content to appear.

• By default, it will look for it every 100ms for 5s before giving up. This is highly configurable.

• Same semantics as the waitFor {} method that can be used anywhere.

Page 38: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Expensive Contentclass ExpensivePage extends Page {     static content = {         results(cache: true) { $("li.results") }        result { results[it] }     } } 

• By default, all content is transient.• The cache option instructs Geb to hold on to the

content, avoiding redundant lookups.• Use carefully, can cause problems with dynamic

pages.

Page 39: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

NavigationGetting around

Page 40: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

The to() methodclass GoogleHomePage extends Page {     static url = "http://google.com/ncr" }

• Pages can define a url that defines the page location.

• The to() method sends the browser there and sets that as the current page object.

• to GoogleHomePage The page url can be relative (will be resolved against a config driven base).

Page 41: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Content based navigationclass FrontPage {     static content = {     aboutUsLink(to: AboutUsPage) { $("div#nav ul li a", text: iStartsWith("About Us")) }    

}}

• When this content is clicked, the underlying page will be changed implicitly.

to FrontPageaboutUsLink.click() page instanceof AboutUsPage 

Page 42: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

At Checking

• The “at checking” mechanism enables fail fast and less debugging.

class LoginPage extends Page {     static at = { $("h1").text() == "Please log in" } }

browser.at LoginPage 

• Will throw an exception if every statement of the at check is not true.

Page 43: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Driver Management

• Geb caches the WebDriver instance (per thread) and shares it across test cases.

• Manages clearing cookies and is configurable.

• This can be disabled and tuned.

Page 44: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Config. Management

• Looks for GebConfig class or GebConfig.groovy file (or class) on classpath.

driver = { new FirefoxDriver() }

waiting {timeout = 2 slow { timeout = 100 }} 

reportsDir = "geb-reports“

environments {chrome { driver = "chrome" }} 

Page 45: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

What we didn't see

• JavaScript interface• jQuery interface• Direct Downloading• Multi Window support• Frame support• Page Change Listening• Actions (e.g. Drag & Drop)• alert()/confirm() handling

Page 46: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Summary

JUnit3 Spock Grails JUnit4 EasyB

Page 47: Comprehensive Browser Automation Solution using Groovy, WebDriver & Obect Model

Thanks

» @gaurav_bansal

» [email protected] / [email protected]

» +91-9899849992