Better Selenium Tests with Geb - Selenium Conf 2014
description
Transcript of Better Selenium Tests with Geb - Selenium Conf 2014
![Page 2: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/2.jpg)
WebDriver
ChromeDriver FirefoxDriver InternetExplorerDriver
http://martinfowler.com/bliki/PageObject.html
![Page 3: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/3.jpg)
WebDriver
ChromeDriver FirefoxDriver InternetExplorerDriver
Selenium server
WebDriverJS
![Page 4: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/4.jpg)
https://www.flickr.com/photos/pagedooley/3028798210
Level of Abstraction
![Page 5: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/5.jpg)
WebDriver
ChromeDriver FirefoxDriver InternetExplorerDriver
Selenium server
WebDriverJS
![Page 6: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/6.jpg)
Any problem in computer science can be solved with another
layer of indirection
David Wheeler
https://www.flickr.com/photos/pc_plod/14187378533
![Page 7: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/7.jpg)
![Page 8: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/8.jpg)
Web Driver
![Page 9: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/9.jpg)
Geb
![Page 10: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/10.jpg)
Browser
import geb.Browser!import org.openqa.selenium.firefox.FirefoxDriver!!Browser browser = new Browser(driver: new FirefoxDriver())!
![Page 11: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/11.jpg)
Browserimport geb.Browser!import org.openqa.selenium.firefox.FirefoxDriver!!Browser browser = new Browser(driver: new FirefoxDriver())!
// driver.get("http://seleniumconf.org/")!browser.go 'http://seleniumconf.org/'!
![Page 12: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/12.jpg)
External Config// GebConfig.groovy!import org.openqa.selenium.firefox.FirefoxDriver!!driver = { !! def driverInstance = new FirefoxDriver() !! driverInstance.manage().window().maximize() !! driverInstance !} !
Browser browser = new Browser()!!// driver.get("http://seleniumconf.org/")!browser.go 'http://seleniumconf.org/'!browser.quit()!
![Page 13: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/13.jpg)
Accessing Elements// driver.findElement(By.name("j_username")) !def username = browser.$(name: 'j_username')!
// username.sendKeys("user1")!username << 'user1'!
println username.value()!
![Page 14: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/14.jpg)
Geb Browser
![Page 15: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/15.jpg)
Hello GebBrowser browser = new Browser()!browser.go “http://localhost:8000/app/login.html"!browser.$(name: 'j_username') << 'user1'!browser.$(name: 'j_password') << 'secret'!browser.$('#submit').click()!browser.quit()!
![Page 16: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/16.jpg)
Hello Geb - Improved
Browser.drive{!! go “http://localhost:8000/app/login.html"!! $(name: 'j_username') << 'user1'!! $(name: 'j_password') << 'secret'!! $('#submit').click()!}.quit()!
![Page 17: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/17.jpg)
Configurable URL
Browser.drive{!! go “login.html”!! $(name: 'j_username') << 'user1'!! $(name: 'j_password') << 'secret'!! $('#submit').click()!}.quit()!
// GebConfig.groovy!baseUrl = "http://localhost:8000/app/" !
![Page 18: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/18.jpg)
Assertion
assert $('h1').text() == 'Dashboard'!
![Page 19: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/19.jpg)
Navigator API
![Page 20: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/20.jpg)
Navigator Syntax
$(<css selector>, <index or range>, <attribute / text matchers>)
![Page 21: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/21.jpg)
<h2>Introduction</h2>!<h2>Navigator</h2>!<h2>Page Objects</h2>!<h2>Summary</h2>!
$('h2').text() == 'Introduction'!
$('h2', 1).text() == 'Navigator'!
$('h2').size() == 4!
![Page 22: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/22.jpg)
<h2>Introduction</h2>!<h2>Navigator</h2>!<h2>Page Objects</h2>!<h2>Summary</h2>!
$('h2', 0..2)*.text() == !! ! ['Introduction', 'Navigator', 'Page Objects']!
![Page 23: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/23.jpg)
<h2 duration="5">Introduction</h2>!<h2 duration="15">Navigator</h2>!<h2>Page Objects</h2>!<h2 duration="5">Summary</h2>!
$('h2', duration: '5').size() == 2!
$('h2', text: 'Summary').size() == 1!
![Page 24: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/24.jpg)
<h2 duration="5">Introduction</h2>!<h2 duration="15">Navigator</h2>!<h2>Page Objects</h2>!<h2 duration="5">Summary</h2>!
$('h2', text: contains('o')).size() == 2!
$('h2', text: iContains('o')).size() == 3!
$('h2', duration: contains('5')).size() == 3!
![Page 25: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/25.jpg)
<div class="languages">!! ! <div class="language jvm">Java</div>!! ! <div class="language clr">C#</div>!! ! <div class="language jvm">Groovy</div>!! ! <div class="language clr">F#</div>!! ! <div class="language erlang">Elixir</div>!</div>
$('div.languages').find('.jvm').each{ element ->!! ! println element.text()!}
Java Groovy
![Page 26: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/26.jpg)
<div class="languages">!! ! <div class="language jvm">Java</div>!! ! <div class="language clr">C#</div>!! ! <div class="language jvm">Groovy</div>!! ! <div class="language clr">F#</div>!! ! <div class="language erlang">Elixir</div>!</div>
$('.language').filter('.jvm').each{ element ->!! ! println element.text()!}
Java Groovy
$('.language').not('.clr').each{ element ->!! ! println element.text()!}
Java Groovy Elixir
![Page 27: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/27.jpg)
Page Objects
![Page 28: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/28.jpg)
Page Objects
![Page 29: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/29.jpg)
Modules
![Page 30: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/30.jpg)
Modules
![Page 31: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/31.jpg)
![Page 32: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/32.jpg)
Modulesclass Record extends Module{!! static content = {!! ! column {index -> $('td', index)}!! ! productCode {column(1).text()}!! ! price { column(2).text().toInteger()}!! }!}
class ProductPage extends Page{!! static url = 'table.html'!! static content = {!! ! products {moduleList Record, $('table tbody tr')}!! }!}
![Page 33: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/33.jpg)
Modules
Browser.drive() {!! to ProductPage!! products.each{ product ->!! ! println "${product.productCode} -> ${product.price}"!! }!}.quit()
![Page 34: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/34.jpg)
Modules List
![Page 35: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/35.jpg)
Waiting
![Page 36: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/36.jpg)
Wait<div id="dynamic"></div>
waitFor { $('#dynamic').text()}!waitFor(8) { $('#dynamic').text()}!waitFor(8, 0.5) { $('#dynamic').text()}!waitFor('slow') { $('#dynamic').text()}
// GebConfig.groovy!waiting {! presets {! slow {! timeout = 12! retryInterval = 1! }! }!}
![Page 37: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/37.jpg)
Integration
https://www.flickr.com/photos/lumaxart/2137737248
![Page 38: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/38.jpg)
Supported Frameworks
![Page 39: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/39.jpg)
@Stepwise!class SampleGebSpec extends GebReportingSpec{!! def "User can login"(){! !! when:! !! ! to LoginPage!! ! ! login('user1', 'secret')! ! ! then:!! ! ! at DashboardPage!! ! ! and:!! ! ! header.pageTitle == 'Dashboard'! }!!}!
Spock Example
![Page 40: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/40.jpg)
Integration
![Page 41: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/41.jpg)
• Power of WebDriver • Elegance of jQuery selection • Robustness of Page Object
modeling • Expressiveness of Groovy
Summary
Welcome Geb
![Page 42: Better Selenium Tests with Geb - Selenium Conf 2014](https://reader033.fdocuments.net/reader033/viewer/2022050904/5481d7a35906b500058b45d1/html5/thumbnails/42.jpg)
ReferencesOfficial Geb Page - http://www.gebish.org/ !Example - https://github.com/geb/geb-example-gradle !Spock Documentation - http://spock-framework.readthedocs.org/en/latest/ !Code samples - https://github.com/naresha/seconf2014