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.

Getting Started with Selenium

1,788 views

Published on

Workshop slides from Selenium Conf 2015

Published in: Technology
  • Login to see the comments

Getting Started with Selenium

  1. 1. Getting Started with Selenium by Dave Haeffner, @TourDeDave
  2. 2. http://www.wpclipart.com/geography/features/chasm.png.html
  3. 3. http://en.wikipedia.org/wiki/Optimal_solutions_for_Rubik's_Cube
  4. 4. Write business valuable tests that are reusable, maintainable and resilient across all relevant browsers. Then package and scale them for you & your team.
  5. 5. Selenium Overview • What it is — the Reader’s Digest version • What it is and is not good at • IDE vs. Local vs. Remote • Slow, brittle, and hard to maintain?
  6. 6. Step 1 Define a Test Strategy
  7. 7. Test Strategy 1. How does your business make money? 2. What features of your application are being used? 3. What browsers are your users using? 4. What things have broken in the app before? Outcome: What to test and which browsers to care about
  8. 8. Step 2 Pick a Programming Language
  9. 9. Programming Language • Same language as the app? • Who will own it? • Build a framework or use an existing one? • http://bit.ly/seleniumframeworks
  10. 10. 2a Java, a brief primer
  11. 11. Java Setup • Everyone setup? • Java Software Development Kit (SDK) • Maven • Initial test repo from http://bit.ly/se-java-init
  12. 12. Java Concepts • Object Structures (Variables, Methods, & Classes) • Access Modifiers (public, protected, private) • Object Types (Strings, Booleans, etc.) • Actions (Asserts & Conditionals) • Annotations • Inheritance
  13. 13. Object Structures • Variables • Methods • Classes
  14. 14. Object Structures Variables Objects where you can store and retrieve values
  15. 15. Object Structures Methods Where you can store common actions for reuse
  16. 16. Object Structures Classes Store the state and behavior of something complex
  17. 17. Access Modifiers • When specifying an object (e.g., a variable, method, or class) you can apply a modifier • This modifier denotes what else can access the object (a.k.a. scope) • private -> protected -> public • “need-to-know”
  18. 18. Object Types • Strings ("") • Booleans (true/false)
  19. 19. Object Types Booleans
  20. 20. Actions • Assertions • Conditionals
  21. 21. Actions Assertions Allows us to test assumptions about our application
  22. 22. Actions Conditionals A way to break up the flow of code so only certain chunks of it are executed based on predefined criteria
  23. 23. Annotations A form of metadata Used by various libraries to enable additional functionality
  24. 24. Inheritance Classes can connect together via a parent/child connection
  25. 25. Additional Java Resources • http://bit.ly/learn-java-1 (Learn Java Online) • http://bit.ly/learn-java-2 (Oracle Tutorials) • http://bit.ly/learn-java-3 (tutorialspoint) • http://bit.ly/learn-java-4 (Free udemy course) • http://bit.ly/learn-java-5 (Java in a Nutshell book) • http://bit.ly/learn-java-6 (Java for Testers book)
  26. 26. Step 3 Use Selenium fundamentals
  27. 27. Selenium Fundamentals • Mimics human action • Uses a few common actions • Works with “locators” Locators tell Selenium which HTML element to interact with
  28. 28. Common Actions • get(); • findElement(); • click(); //or submit(); • sendKeys(); • isDisplayed();
  29. 29. Locator Strategies • Class • CSS selectors • ID • Link Text • Partial Link Text • Tag Name • XPath Good locators are: • unique • descriptive • unlikely to change That rules a few of these out
  30. 30. Locator Strategies • Class • CSS selectors • ID • Link Text • Partial Link Text • Tag Name • XPath Good locators are: • unique • descriptive • unlikely to change That rules a few of these out
  31. 31. Locator Strategies • Class • CSS selectors • ID • Link Text • Partial Link Text • Tag Name • XPath Good locators are: • unique • descriptive • unlikely to change That rules a few of these out Start with IDs and Classes
  32. 32. Locator Strategies • Class • CSS selectors • ID • Link Text • Partial Link Text • Tag Name • XPath Good locators are: • unique • descriptive • unlikely to change That rules a few of these out Start with IDs and Classes Use CSS or XPath (with care)
  33. 33. Locator Strategies • Class • CSS selectors • ID • Link Text • Partial Link Text • Tag Name • XPath CSS vs XPath http://bit.ly/seleniumbenchmarks http://bit.ly/cssxpathexamples
  34. 34. Finding Quality Locators • Inspect the page • Verify your selection • e.g., FirePath or FireFinder • http://bit.ly/verifyinglocators • Learn through gaming • http://bit.ly/locatorgame • Conversation
  35. 35. CSS Selectors
  36. 36. Step 4 Write your first test
  37. 37. Good Test Anatomy • Write for BDD or xUnit test framework • Test one thing (atomic) • Each test can be run independently (autonomous) • Anyone can understand what it is doing • Group similar tests together
  38. 38. http://the-internet.herokuapp.com/login
  39. 39. A Login Example 1. Visit the login form 2. Find the login form’s username field and input text 3. Find the login form’s password field and input text 4. Find the submit button and click it 1. or, find the form and submit it
  40. 40. Your turn: 1. Create a new package called “tests” 2. Create a new file called TestLogin.java 3. Place this code in it 4. Run it to make sure it works http://bit.ly/se-java-init2
  41. 41. Now to find an assertion 1. Login 2. Inspect the page 3. Find a locator 4. Verify it 5. Add it to the test HINT: Assert.assertTrue(); driver.findElement().isDisplayed(); Your turn Add an assertion to your test
  42. 42. Exception Handling • org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"css selector","selector":".flash.error"} • Most common ones you’ll run into: 
 NoSuchElement and StaleElementReferenceError • A list of all WebDriver exceptions: 
 http://bit.ly/se-exceptions-java
  43. 43. Exception Handling cont’d http://bit.ly/se-exceptions-howto
  44. 44. Step 5 Write reusable and maintainable test code
  45. 45. Page Objects
  46. 46. Application Under Test Test 1 Test 2 Test 3 Test 4 Test 5Test 1 Test 2 Test 3 Test 4 Test 5 Need to update EVERY test :-(
  47. 47. Application Under TestPage Object(s) Test 1 Test 2 Test 3 Test 4 Test 5 Need to update JUST the page object :-D
  48. 48. Let’s look at a page object for login
  49. 49. Your Turn 1. create a new package called “pageobjects” 2. create a new file in it called Login.java 3. add this code to it 4. update your TestLogin file to use it 5. run your test to make sure it still works http://bit.ly/se-java-init2
  50. 50. And here’s what the test looks like when using it
  51. 51. Page object helpers: http://bit.ly/po-html-elements http://bit.ly/po-page-factory
  52. 52. Base Page Object a.k.a. Selenium Wrapper or Base Utility Class
  53. 53. Selenium Commands Page Object 1 Page Object 2 Page Object 3 Page Object 4 Page Object 5
  54. 54. Base Page Object Page Object 1 Page Object 2 Page Object 3 Page Object 4 Page Object 5 Selenium Commands • Global reuse • More readable • Insulates you from Selenium API changes http://bit.ly/se-upgrade
  55. 55. Let’s take a look at a Base Page Object
  56. 56. Your Turn 1. create a new file in “pageobjects”, Base.java 2. add this code to it 3. update your page object to use it 4. run your tests to make sure they still work http://bit.ly/se-java-init2
  57. 57. And here it is implemented
  58. 58. How everything fits together Test TestTest Page Object Page Object Base Page Object Tests use page objects Page objects inherit the base page object The base page object wraps your Selenium commands
  59. 59. Step 6 Make your tests resilient
  60. 60. Waiting
  61. 61. Thread.sleep(); Implicit wait Explicit waits
  62. 62. Thread.sleep(); Implicit wait Explicit waits
  63. 63. Thread.sleep(); Implicit wait Explicit waits http://bit.ly/se-waiting
  64. 64. Explicit Waits • Specify an amount of time, and an action • Selenium will try repeatedly until either: • The action is completed, or • The amount of time specified has been reached (and throw a timeout exception)
  65. 65. Your Turn 1. implement this code in pageobjects/Base.java 2. create a new page object to for dynamic_loading/1 • pageobjects/DynamicLoading.java • http://the-internet.herokuapp.com/dynamic_loading/1 3. create a test to use the page object • e.g., tests/TestDynamicLoading.java http://bit.ly/se-java-init2
  66. 66. pageobjects/DynamicLoading.java
  67. 67. Browser Timing Considerations
  68. 68. Recap 1. Test Strategy 2. Programming Primer 3. Writing Your First Test 4. Page Objects 5. Base Page Object 6. Waiting Code from morning session: http://bit.ly/se-java-init2 Code going forward: http://bit.ly/se-java-init-3
  69. 69. Step 7 Prep for use
  70. 70. Test Harness • Central setup and teardown • Configurable at run-time (with sensible defaults) • Reporting & Logging • Parallelization • Test Grouping
  71. 71. Central setup/teardown More on JUnit Rules: http://bit.ly/junit-rules Your turn 1. Create a “Base.java” file in “tests” 2. Add this code to it
  72. 72. Updated test Your turn 1. Update your tests to establish inheritance 2. Remove un-necessary setup & teardown 3. Run your tests to make sure they work
  73. 73. Simple config with defaults Your turn 1. Create a new file in “tests”called Config.java 2. Implement it into pageobjects/Base.java
  74. 74. Reporting & Logging • Machine readable
 e.g., JUnit XML • Human readable
 e.g., screenshots, failure message, stack trace Fantastic Test Report Tool http://bit.ly/se-reporter (Allure Framework)
  75. 75. Parallelization • In code • Through your test runner • Through your Continuous Integration (CI) server #protip Enforce random order execution of tests http://bit.ly/junit-random-order Recommended approach: http://bit.ly/mvn-surefire
  76. 76. Your turn 1. Open pom.xml 2. Add this to the bottom of it 3. Save the file Run them 1. Open the command prompt 2. Navigate to the project dir 3. Run them with mvn clean test
  77. 77. Test Grouping • Metadata (a.k.a. Categories) • Enables “test packs” • Some category ideas • defect • shallow & deep • story number More info: bit.ly/junit-categories
  78. 78. Your turn 1. In “tests” create a new package called “groups” 2. Create an interface in “groups” (e.g., Shallow.java) 3. Annotate a test (or tests) to use this Category
  79. 79. Your turn 1. Open pom.xml 2. Add properties group 3. Add groups configuration 4. Save the file
  80. 80. Running Categories Your turn - Run your tests from the command-line
  81. 81. Step 8 Add in cross-browser execution
  82. 82. Locally http://bit.ly/se-chromedriver http://bit.ly/se-firefoxdriver http://bit.ly/se-iedriver http://bit.ly/se-operadriver (12.16) http://bit.ly/se-safaridriver (!Windows)
  83. 83. Locally with Chrome Your turn 1. Create a “vendor” directory 2. Download ChromeDriver into it 3. Add this code to tests/Base.java http://bit.ly/download-chromedriver
  84. 84. Grid Grid Hub Browser Tests All done with the Selenium Standalone Server Just requires additional runtime flags Grid Node Grid Node Grid Node Browser Browser
  85. 85. Grid Hub Node(s) Your turn • Download the Selenium jar • Stand up a grid with a node http://bit.ly/download-selenium
  86. 86. Grid Your turn • Update tests/Base.java • Run your tests on the grid mvn clean test -Dhost=grid
  87. 87. More on Selenium Grid • http://bit.ly/se-grid-docs • http://bit.ly/se-grid-post • http://bit.ly/se-grid-extras • http://bit.ly/se-grid-scaler
  88. 88. Sauce Labs Sauce Labs Browser Tests
  89. 89. Sauce Labs cont’d Your turn 1. Create a free trial account • https://saucelabs.com/signup 2. Add this code to tests/Base.java
  90. 90. Sauce Labs Additional Considerations - Test name - Pass/Fail status - Secure tunnel More on Sauce: https://saucelabs.com/platforms http://bit.ly/sauce-post http://bit.ly/sauce-tutorial-java
  91. 91. Your turn 1. Add this to tests/Base.java 2. Re-run your tests in Sauce 3. Confirm that the test name is passed
  92. 92. Step 9 Build an automated feedback loop
  93. 93. Feedback loops • The goal: Find failures early and often • Done with continuous integration and notifications • Notifications
 e.g., remote: Email, chat, SMS
 in-person: audio/visual, public shaming
  94. 94. Code Committed Unit/Integ. (pass?) Deploy to autom. test server (success?) Run automated tests (pass?) Deploy to next env. yes yes yes Notify team if no Code Promotion Bonus points: stop the line
  95. 95. Simple CI configuration 1. Create a Job 2. Pull In Your Test Code 3. Set up Build Triggers 4. Configure Build steps 5. Configure Test Reports 6. Set up Notifications 7. Run Tests & View The Results 8. High-five your neighbor
  96. 96. Simple CI configuration 1. Download “Latest and greatest” from http://jenkins-ci.org/ 2. Launch it from the command-line with `java-jar jenkins.war` 3. Visit http://localhost:8080 in your browser 4. Create a job to run your Selenium tests on a specific browser (e.g., IE8) 5. Manually run the job 6. High-five your neighbor Your turn
  97. 97. Step 10 Find information on your own http://bit.ly/se-info-slides http://bit.ly/se-info-video
  98. 98. Elemental Selenium (3) Selenium HQ (1) Documentation & Tips Issue Tracker Guidance (23) Straight To The Source (24) IRC Chat Channel (25) Selenium Testing Tools Cookbook (18) The Selenium Guidebook (19) Selenium Design Patterns (21) All in-person Selenium Meetups (13) How to start your own (14) Selenium Developer Google Group (10) Agile Testing Yahoo Group (11) Selenium Wiki (2) Books Meetups Mailing Lists Forums The good stuff http://bit.ly/se-info-# Videos Selenium LinkedIn Users Group (6) Stack Overflow (7) Quora (8) Selenium Users Google Group (9) The Selenium Hangout (12) Conference talks (15) Meetup talks (16) Selenium 2 Testing Tools (17) Selenium Simplified (20) Issue Tracker (22) Blogs The official Selenium blog (4) “All” Selenium blogs (5)
  99. 99. Steps to solve the puzzle 1. Define a Test Strategy 2. Pick a programming language 3. Use Selenium Fundamentals 4. Write Your First Test 5. Write re-usable and maintainable test code 6. Make your tests resilient 7. Package your tests into a framework 8. Add in cross-browser execution 9. Build an automated feedback loop 10. Find information on your own Finished code at http://bit.ly/se-java-init-3
  100. 100. Write business valuable tests that are reusable, maintainable and resilient across all relevant browsers. Then package them and scale them for you & your team.
  101. 101. –Dave Haeffner “You may think your puzzle is unique. But really, everyone is trying to solve the same puzzle. Yours is just configured differently — and it’s solvable”
  102. 102. http://ElementalSelenium.com
  103. 103. Get in touch @TourDeDave dhaeffner@gmail.com DaveHaeffner.com

×