Test Automation
& Selenium
Oren Rubin
CEO, Testim.io
Oren Rubin
● Why Unit Tests aren't enough?
● Writing Unit Tests !== Writing E2E Tests
● Meet Selenium
● Best practices & Design Patterns
● Selenium Grid
● UI Validations
● Record / Playback
Today's Menu
Selenium to UI-Testing is like..
Power Steering & Automatic Transmission is to Driving
I'm
not making you
coffee!
Unit Tests: Same language, Easy setup. Synchronous.
// Setup
Account account = new Account();
// Stimuli e.g. click, setting text, XHR
account.login( "borg", "resistance is futile" );
// Validation
assert( account.isLoggedIn(), true );
E2E vs. Unit - same same but different
E2E is
the real
SHIT!
● Synchronous?
● Same language?
● Easy setup?
○ Where are the browsers running?
○ Who's in charge of keeping them alive?
E2E is hard!
Expected: Actual:
Cowabunga
It gets worse.. I shit you not!
Cowabunga Cowabungaz-index
Cowabungasize
CowabungaThe Flying Pony
Cowabung
a
Over here!
Blur, Focus, ….
CSS
HTML
JS Event
One browser.. you wish!
* What about responsive design?!
Which language do you prefer?
Test Language?
Meet Selenium
Why the name Selenium?
Selenium 1 - JS based
Selenium 2 - WebDriver & WebElements
Selenium 3 - Mobile
Past, Present, and Future
Google Trends - Same for Jobs
Example - la login
// setup
WebDriver driver = new Chrome();
driver.get("http://www.google.com");
// stimuli
driver.findElement( By.id("user") ).sendKeys("mel brooks");
driver.findElement( By.id("password") ).sendKeys("12345");
driver.findElement( By.id("submit") ).submit();
// assertion
assert(driver.getTitle(), "That's the kind of thing an idiot would have on his luggage!");
// tear down
driver.quit();
Example
Architecture
?
Can anyone suggest a good architecture?
...
...
One (W3C) Standard to rule them all!
https://code.google.com/p/selenium/wiki/JsonWireProtocol http://www.w3.org/TR/webdriver/
HTTP as a universal language
?
The
Wire
Protocol
SDK Driver
Closer look
new Chrome(); chromedriver.exe
Browser
HTTP Request
localhost:4444/click
driver = new Chrome();
...
submitBtn.click();
driver
note: don't forget to frequently u
chromedriver.exe
Now for Firefox
new Firefox(); webdriver.xpi
Browser
HTTP Request
localhost:4444/click
driver
driver = new Firefox();
...
submitBtn.click();
Let's improve
loginChromeTest () {
driver = new Chrome();
loginTest(driver);
}
loginFirefoxTest () {
driver = new Firefox();
loginTest(driver);
}
loginTest (driver) {
driver.findElement( By.id("user") ).sendKeys("mel brooks");
driver.findElement( By.id("password") ).sendKeys("12345");
driver.findElement( By.id("submit") ).submit();
}
Page Objects
A Design Pattern.
Provides a programmatic API to drive and interrogate a UI
Best Practices & Design Patterns
http://www.slideshare.net/orenrubin/page-objects-presentation-selenium-conference-2014-38767492
// setup
WebDriver driver = new Chrome();
driver.get("http://www.google.com");
// stimuli
driver.findElement( By.id("user") ).sendKeys("mel brooks");
driver.findElement( By.id("password") ).sendKeys("12345");
driver.findElement( By.id("submit") ).submit();
// assertion
assert(driver.getTitle(), "That's the kind of thing an idiot would have on his luggage!");
// tear down
driver.quit();
Example
Simon
says no!
@Test
void loginTest () {
Test Automation Architecture
Link to "Page Objects Done Right" Presentation
Selenium Grid
● Concurrency
● Multiple
Platforms
Remember this?
new Chrome(); chromedriver.exe
Browser
HTTP Request
localhost:8989/click
driver = new Chrome();
...
submitBtn.click();
driver
What we want
new Chrome(); chromedriver.exe
Browser
HTTP Request
<some-ip>:8989/click
driver = new Chrome();
...
submitBtn.click();
driver
computer 1 computer 2
Selenium Grid
java -jar selenium.jar
-port 4444
-role hub
selenium hub
Node 0 on 10.0
Selenium Grid
Node 1 on 10.1
Node 2 on 10.2
selenium node
java -jar selenium.jar -role webdriver -browser firefox
-hubHost 10.0 –port 8989
java -jar selenium.jar
-port 4444
-role hub
selenium node
java -jar selenium.jar -role webdriver -browser chrome
-hubHost 10.0 –port 8989
selenium hub
Node 0 on 10.0
chromedriver.exe
firefox-webdriver.dpi
Selenium Grid
new Chrome();
Browser
HTTP Request
10.0:4444/chrome
hub = new URL("10.0:4444/wd/hub")
cap = new Capabilities ("chrome", "v3", "windows")
driver = new RemoteWebDriver( hub, cap );
...
driver
my computer / CI server
Node 1 on 10.1
Node 2 on 10.2
selenium node
java -jar selenium.jar -role webdriver
-hubHost 10.1 –port 8989
java -jar selenium.jar
-port 4444
-role hub
selenium node
java -jar selenium.jar -role webdriver
-hubHost 10.1 –port 8989
selenium hub
Node 0 on 10.0
HTTP Request
10.2:8989/chrome
chromedriver.exe
firefox-webdriver.dpi
Selenium Grid
new Chrome();
Browser
HTTP Request
10.0:4444/click
driver = ...
submitBtn = driver.find(By.id("submit"));
submitBtn.click();
driver
my computer / CI server
Node 1 on 10.1
Node 2 on 10.2
selenium node
java -jar selenium.jar -role webdriver
-hubHost 10.1 –port 8989
java -jar selenium.jar
-port 4444
-role hub
selenium node
java -jar selenium.jar -role webdriver
-hubHost 10.1 –port 8989
selenium hub
Node 0 on 10.0
HTTP Request
10.2:8989/click
chromedriver.exe
firefox-webdriver.dpi
Browsers in the cloud
Selenium Grid as a Service
SaaS Open source
Spot the differences
UI Verification - Applitools eye
One image is worth a 1000 assertions
Oren Rubin
Testim.io
oren@testim.io
Thank you!

Test automation & Seleniun by oren rubin

  • 1.
    Test Automation & Selenium OrenRubin CEO, Testim.io
  • 2.
  • 3.
    ● Why UnitTests aren't enough? ● Writing Unit Tests !== Writing E2E Tests ● Meet Selenium ● Best practices & Design Patterns ● Selenium Grid ● UI Validations ● Record / Playback Today's Menu
  • 4.
    Selenium to UI-Testingis like.. Power Steering & Automatic Transmission is to Driving I'm not making you coffee!
  • 5.
    Unit Tests: Samelanguage, Easy setup. Synchronous. // Setup Account account = new Account(); // Stimuli e.g. click, setting text, XHR account.login( "borg", "resistance is futile" ); // Validation assert( account.isLoggedIn(), true ); E2E vs. Unit - same same but different
  • 6.
  • 7.
    ● Synchronous? ● Samelanguage? ● Easy setup? ○ Where are the browsers running? ○ Who's in charge of keeping them alive? E2E is hard!
  • 8.
    Expected: Actual: Cowabunga It getsworse.. I shit you not! Cowabunga Cowabungaz-index Cowabungasize CowabungaThe Flying Pony Cowabung a Over here! Blur, Focus, …. CSS HTML JS Event
  • 9.
    One browser.. youwish! * What about responsive design?!
  • 10.
    Which language doyou prefer? Test Language?
  • 11.
  • 12.
    Why the nameSelenium?
  • 13.
    Selenium 1 -JS based Selenium 2 - WebDriver & WebElements Selenium 3 - Mobile Past, Present, and Future
  • 14.
    Google Trends -Same for Jobs
  • 15.
  • 16.
    // setup WebDriver driver= new Chrome(); driver.get("http://www.google.com"); // stimuli driver.findElement( By.id("user") ).sendKeys("mel brooks"); driver.findElement( By.id("password") ).sendKeys("12345"); driver.findElement( By.id("submit") ).submit(); // assertion assert(driver.getTitle(), "That's the kind of thing an idiot would have on his luggage!"); // tear down driver.quit(); Example
  • 17.
    Architecture ? Can anyone suggesta good architecture? ... ...
  • 18.
    One (W3C) Standardto rule them all! https://code.google.com/p/selenium/wiki/JsonWireProtocol http://www.w3.org/TR/webdriver/
  • 19.
    HTTP as auniversal language ? The Wire Protocol SDK Driver
  • 20.
    Closer look new Chrome();chromedriver.exe Browser HTTP Request localhost:4444/click driver = new Chrome(); ... submitBtn.click(); driver note: don't forget to frequently u chromedriver.exe
  • 21.
    Now for Firefox newFirefox(); webdriver.xpi Browser HTTP Request localhost:4444/click driver driver = new Firefox(); ... submitBtn.click();
  • 22.
    Let's improve loginChromeTest (){ driver = new Chrome(); loginTest(driver); } loginFirefoxTest () { driver = new Firefox(); loginTest(driver); } loginTest (driver) { driver.findElement( By.id("user") ).sendKeys("mel brooks"); driver.findElement( By.id("password") ).sendKeys("12345"); driver.findElement( By.id("submit") ).submit(); }
  • 23.
    Page Objects A DesignPattern. Provides a programmatic API to drive and interrogate a UI Best Practices & Design Patterns http://www.slideshare.net/orenrubin/page-objects-presentation-selenium-conference-2014-38767492
  • 24.
    // setup WebDriver driver= new Chrome(); driver.get("http://www.google.com"); // stimuli driver.findElement( By.id("user") ).sendKeys("mel brooks"); driver.findElement( By.id("password") ).sendKeys("12345"); driver.findElement( By.id("submit") ).submit(); // assertion assert(driver.getTitle(), "That's the kind of thing an idiot would have on his luggage!"); // tear down driver.quit(); Example Simon says no! @Test void loginTest () {
  • 25.
    Test Automation Architecture Linkto "Page Objects Done Right" Presentation
  • 26.
  • 27.
    Remember this? new Chrome();chromedriver.exe Browser HTTP Request localhost:8989/click driver = new Chrome(); ... submitBtn.click(); driver
  • 28.
    What we want newChrome(); chromedriver.exe Browser HTTP Request <some-ip>:8989/click driver = new Chrome(); ... submitBtn.click(); driver computer 1 computer 2
  • 29.
    Selenium Grid java -jarselenium.jar -port 4444 -role hub selenium hub Node 0 on 10.0
  • 30.
    Selenium Grid Node 1on 10.1 Node 2 on 10.2 selenium node java -jar selenium.jar -role webdriver -browser firefox -hubHost 10.0 –port 8989 java -jar selenium.jar -port 4444 -role hub selenium node java -jar selenium.jar -role webdriver -browser chrome -hubHost 10.0 –port 8989 selenium hub Node 0 on 10.0 chromedriver.exe firefox-webdriver.dpi
  • 31.
    Selenium Grid new Chrome(); Browser HTTPRequest 10.0:4444/chrome hub = new URL("10.0:4444/wd/hub") cap = new Capabilities ("chrome", "v3", "windows") driver = new RemoteWebDriver( hub, cap ); ... driver my computer / CI server Node 1 on 10.1 Node 2 on 10.2 selenium node java -jar selenium.jar -role webdriver -hubHost 10.1 –port 8989 java -jar selenium.jar -port 4444 -role hub selenium node java -jar selenium.jar -role webdriver -hubHost 10.1 –port 8989 selenium hub Node 0 on 10.0 HTTP Request 10.2:8989/chrome chromedriver.exe firefox-webdriver.dpi
  • 32.
    Selenium Grid new Chrome(); Browser HTTPRequest 10.0:4444/click driver = ... submitBtn = driver.find(By.id("submit")); submitBtn.click(); driver my computer / CI server Node 1 on 10.1 Node 2 on 10.2 selenium node java -jar selenium.jar -role webdriver -hubHost 10.1 –port 8989 java -jar selenium.jar -port 4444 -role hub selenium node java -jar selenium.jar -role webdriver -hubHost 10.1 –port 8989 selenium hub Node 0 on 10.0 HTTP Request 10.2:8989/click chromedriver.exe firefox-webdriver.dpi
  • 33.
    Browsers in thecloud Selenium Grid as a Service SaaS Open source
  • 34.
  • 35.
    UI Verification -Applitools eye One image is worth a 1000 assertions
  • 36.