Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Pragmatic Browser Automation
with Geb
Naresha K, Chief Technologist
Channel Bridge Software Labs
@naresha_k
2
3
4
5
6
WebDriver
7
http://martinfowler.com/bliki/PageObject.html
8
WebDriver
ChromeDriver FirefoxDriver InternetExplorerDriver
9
WebDriver
ChromeDriver FirefoxDriver InternetExplorerDriver
Selenium server
WebDriverJS
10
Coarse Grained
Fine Grained
11
Any problem in
computer science can
be solved with another
layer of indirection
David Wheeler
12
13
Geb
14
15
16
Browser
import geb.Browser
import org.openqa.selenium.firefox.FirefoxDriver
Browser browser = new Browser(driver: new F...
17
Browser
import geb.Browser
import org.openqa.selenium.firefox.FirefoxDriver
Browser browser = new Browser(driver: new F...
18
Accessing Elements
// driver.findElement(By.name("j_username"))
def username = browser.$(name: 'j_username')
// usernam...
19
20
External Config
// GebConfig.groovy
import org.openqa.selenium.firefox.FirefoxDriver
driver = {
def driverInstance = new...
21
Hello Geb
Browser browser = new Browser()
browser.go “http://localhost:8000/app/login.html"
browser.$(name: 'j_username...
22
Hello Geb - Improved
Browser.drive{
go “http://localhost:8000/app/login.html"
$(name: 'j_username') << 'user1'
$(name: ...
23
Configurable URL
Browser.drive{
go “login.html”
$(name: 'j_username') << 'user1'
$(name: 'j_password') << 'secret'
$('#s...
24
Assertion
assert $('h1').text() == 'Dashboard'
25
Navigator API
26
Navigator Syntax
$(<css selector>, <index or range>, <attribute / text matchers>)
27
<h2>Introduction</h2>
<h2>Navigator</h2>
<h2>Page Objects</h2>
<h2>Summary</h2>
$('h2').text() == 'Introduction'
$('h2'...
28
<h2>Introduction</h2>
<h2>Navigator</h2>
<h2>Page Objects</h2>
<h2>Summary</h2>
$('h2', 0..2)*.text() ==
['Introduction...
29
<h2 duration="5">Introduction</h2>
<h2 duration="15">Navigator</h2>
<h2>Page Objects</h2>
<h2 duration="5">Summary</h2>...
30
<h2 duration="5">Introduction</h2>
<h2 duration="15">Navigator</h2>
<h2>Page Objects</h2>
<h2 duration="5">Summary</h2>...
31
<div class="languages">
<div class="language jvm">Java</div>
<div class="language clr">C#</div>
<div class="language jv...
32
<div class="languages">
<div class="language jvm">Java</div>
<div class="language clr">C#</div>
<div class="language jv...
33
Page Objects
34
Page Objects
35
Modules
36
Modules
37
38
Modules
class Record extends Module{
static content = {
column {index -> $('td', index)}
productCode {column(1).text()}...
39
Modules
Browser.drive() {
to ProductPage
products.each{ product ->
println "${product.productCode} -> ${product.price}"...
40
Modules List
41
Waiting
42
Wait
<div id="dynamic"></div>
waitFor { $('#dynamic').text()}
waitFor(8) { $('#dynamic').text()}
waitFor(8, 0.5) { $('#...
43
Integration
https://www.flickr.com/photos/lumaxart/2137737248
44
Supported Frameworks
45
Spock Example
@Stepwise
class SampleGebSpec extends GebReportingSpec{
def "User can login"(){
when:
to LoginPage
login(...
46
Integration
47
• Power of WebDriver
• Elegance of jQuery selection
• Robustness of Page Object
modeling
• Expressiveness of Groovy
Sum...
48
References
Official Geb Page - http://www.gebish.org/
Example - https://github.com/geb/geb-example-gradle
Spock Document...
Pragmatic Browser Automation with Geb - GIDS 2015
Upcoming SlideShare
Loading in …5
×

Pragmatic Browser Automation with Geb - GIDS 2015

  • Be the first to comment

Pragmatic Browser Automation with Geb - GIDS 2015

  1. 1. Pragmatic Browser Automation with Geb Naresha K, Chief Technologist Channel Bridge Software Labs @naresha_k
  2. 2. 2
  3. 3. 3
  4. 4. 4
  5. 5. 5
  6. 6. 6 WebDriver
  7. 7. 7 http://martinfowler.com/bliki/PageObject.html
  8. 8. 8 WebDriver ChromeDriver FirefoxDriver InternetExplorerDriver
  9. 9. 9 WebDriver ChromeDriver FirefoxDriver InternetExplorerDriver Selenium server WebDriverJS
  10. 10. 10 Coarse Grained Fine Grained
  11. 11. 11 Any problem in computer science can be solved with another layer of indirection David Wheeler
  12. 12. 12
  13. 13. 13 Geb
  14. 14. 14
  15. 15. 15
  16. 16. 16 Browser import geb.Browser import org.openqa.selenium.firefox.FirefoxDriver Browser browser = new Browser(driver: new FirefoxDriver())
  17. 17. 17 Browser import 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/'
  18. 18. 18 Accessing Elements // driver.findElement(By.name("j_username")) def username = browser.$(name: 'j_username') // username.sendKeys("user1") username << 'user1' println username.value()
  19. 19. 19
  20. 20. 20 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()
  21. 21. 21 Hello Geb Browser 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()
  22. 22. 22 Hello Geb - Improved Browser.drive{ go “http://localhost:8000/app/login.html" $(name: 'j_username') << 'user1' $(name: 'j_password') << 'secret' $('#submit').click() }.quit()
  23. 23. 23 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/"
  24. 24. 24 Assertion assert $('h1').text() == 'Dashboard'
  25. 25. 25 Navigator API
  26. 26. 26 Navigator Syntax $(<css selector>, <index or range>, <attribute / text matchers>)
  27. 27. 27 <h2>Introduction</h2> <h2>Navigator</h2> <h2>Page Objects</h2> <h2>Summary</h2> $('h2').text() == 'Introduction' $('h2', 1).text() == 'Navigator' $('h2').size() == 4
  28. 28. 28 <h2>Introduction</h2> <h2>Navigator</h2> <h2>Page Objects</h2> <h2>Summary</h2> $('h2', 0..2)*.text() == ['Introduction', 'Navigator', 'Page Objects']
  29. 29. 29 <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
  30. 30. 30 <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
  31. 31. 31 <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
  32. 32. 32 <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
  33. 33. 33 Page Objects
  34. 34. 34 Page Objects
  35. 35. 35 Modules
  36. 36. 36 Modules
  37. 37. 37
  38. 38. 38 Modules class 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')} } }
  39. 39. 39 Modules Browser.drive() { to ProductPage products.each{ product -> println "${product.productCode} -> ${product.price}" } }.quit()
  40. 40. 40 Modules List
  41. 41. 41 Waiting
  42. 42. 42 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 } } }
  43. 43. 43 Integration https://www.flickr.com/photos/lumaxart/2137737248
  44. 44. 44 Supported Frameworks
  45. 45. 45 Spock Example @Stepwise class SampleGebSpec extends GebReportingSpec{ def "User can login"(){ when: to LoginPage login('user1', 'secret') then: at DashboardPage and: header.pageTitle == 'Dashboard' } }
  46. 46. 46 Integration
  47. 47. 47 • Power of WebDriver • Elegance of jQuery selection • Robustness of Page Object modeling • Expressiveness of Groovy Summary Welcome Geb
  48. 48. 48 References Official 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

×