152
How To Use Selenium, Successfully by Dave Haeffner, @TourDeDave

Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Embed Size (px)

Citation preview

Page 1: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

How To Use Selenium, Successfully

by Dave Haeffner, @TourDeDave

Page 2: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

http://www.wpclipart.com/geography/features/chasm.png.html

Page 3: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

http://en.wikipedia.org/wiki/Optimal_solutions_for_Rubik's_Cube

Page 4: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Write business valuable tests that are reusable, maintainable and resilient across all relevant browsers.

Then package and scale them for you & your team.

Page 5: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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?

Page 6: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Step 1 Define a Test Strategy

Page 7: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Test Strategy1. 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

Page 8: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Step 2 Pick a Programming

Language

Page 9: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Programming Language

• Same language as the app?

• Who will own it?

• Build a framework or use an existing one?

• http://bit.ly/seleniumframeworks

Page 10: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Step 3 Use Selenium fundamentals

Page 11: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Selenium Fundamentals

• Mimics human action

• Uses a few common actions

• Works with “locators”

Locators tell Selenium which HTML element to interact with

Page 12: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Common Actions

• get();

• findElement();

• click(); //or submit();

• sendKeys();

• isDisplayed();

Page 13: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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

Page 14: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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

Page 15: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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

Page 16: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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)

Page 17: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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

Page 18: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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

Page 19: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 20: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Step 4 Write your first test

Page 21: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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

Page 22: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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

Page 23: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

http://the-internet.herokuapp.com/login

Page 24: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 25: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 26: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Now to find an assertion

1. Login

2. Inspect the page

3. Find a locator

4. Verify it

5. Add it to the test

Page 27: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 28: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 29: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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

Page 30: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Exception Handling cont’d

http://bit.ly/se-exceptions-howto

Page 31: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Step 5 Write reusable and

maintainable test code

Page 32: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Page Objects

Page 33: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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 :-(

Page 34: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Application Under Test

Page Object(s)

Test 1 Test 2 Test 3 Test 4 Test 5

Need to update JUST the page object :-D

Page 35: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Let’s look at a page object for login

Page 36: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 37: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

And here’s what the test looks like when using it

Page 38: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Page object helpers: http://bit.ly/po-html-elements http://bit.ly/po-page-factory

Page 39: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Base Page Object

Page 40: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Selenium Commands

Page Object 1

Page Object 2

Page Object 3

Page Object 4

Page Object 5

Page 41: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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

Page 42: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Let’s take a look at a Base Page Object

Page 43: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 44: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

And here it is implemented

Page 45: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 46: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

How everything fits together

Test TestTest

Page Object

Page Object

Base Page

Object

Tests use page objects

Page objects inherits the base page object

The base page object wraps your Selenium commands

Page 47: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Step 6 Make your tests resilient

Page 48: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Waiting

Page 49: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Thread.sleep(); Implicit wait Explicit waits

Page 50: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Thread.sleep(); Implicit wait Explicit waits

Page 51: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Thread.sleep(); Implicit wait Explicit waits

http://bit.ly/se-waiting

Page 52: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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)

Page 53: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 54: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

In the Base page object

Page 55: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

In the DynamicLoading page object

Page 56: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Browser Timing Considerations

Page 57: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Step 7 Prep for use

Page 58: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Test Harness• Simple organizational structure

• Central setup and teardown

• Configurable at run-time (with sensible defaults)

• Reporting & Logging

• Parallelization

• Test Grouping

Page 59: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Folder structure

Page 60: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Central setup/teardownMore on JUnit Rules: http://bit.ly/junit-rules

Page 61: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Simple config with defaults

Page 62: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Reporting & Logging

• Machine readablee.g., JUnit XML

• Human readable e.g., screenshots, failure message, stack trace

Fantastic Test Report Tool http://bit.ly/se-reporter (Allure Framework)

Page 63: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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

Page 64: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Test Grouping• Metadata (a.k.a. Categories)

• Enables “test packs”

• Some category ideas

• wip

• shallow

• deep

• story number

More info: bit.ly/junit-categories

Page 65: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Step 8 Add in cross-browser

execution

Page 66: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Locallyhttp://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

Page 67: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Chrome

Page 68: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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

Page 69: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

GridHub

Node(s)

Page 70: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Grid

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

Page 71: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Sauce Labs

Sauce Labs BrowserTests

Page 72: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Sauce Labs

Additional Considerations - Test name - Pass/Fail status - Secure tunnel

More on Sauce: http://bit.ly/sauce-platforms http://bit.ly/sauce-post http://bit.ly/sauce-tutorial-java

Page 73: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 74: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Step 9 Build an automated

feedback loop

Page 75: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Feedback loops• The goal: Find failures early and often

• Done with continuous integration and notifications

• Notifications e.g., remote: Email, chat, SMSin-person: audio/visual, public shaming

Page 76: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

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

Page 77: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Simple CI configuration1. 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

Page 78: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 79: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Step 10 Find information on

your own

http://bit.ly/se-info-slides

http://bit.ly/se-info-video

Page 80: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Steps to solve the puzzle1. 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

Page 81: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Write business valuable tests that are reusable, maintainable and resilient across all relevant browsers.

Then package them and scale them for you & your team.

Page 82: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

–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”

Page 83: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

https://seleniumguidebook.com/

Page 84: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Selenium Tips & Tricks

by Dave Haeffner @TourDeDave

Page 85: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

http://ElementalSelenium.com

Page 86: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

etc.

Page 87: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Headless w/ XvfbTip 38

Page 88: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 89: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 90: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 91: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Headless w/ GhostDriverTip 38

Page 92: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 93: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Step 2 - Start PhantomJS w/ WebDriver flag

Step 1 - Download PhantomJShttp://phantomjs.org/download.html

Step 3 - Connect Your Test to PhantomJS using Selenium Remote

NOTE: You can also connect PhantomJS to a Selenium Grid

Page 94: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 95: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

HTTP Status CodesTip 17

Page 96: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Configuration

• Use a proxy server to capture the traffic from your Selenium test(s)

• Find the status code for the action you’re interested in (e.g., visiting a URL)

• Assert that the status code is what you expect

Page 97: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Selenium Browser Proxy Server

Application Under Test

Page 98: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 99: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 100: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 101: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

BlacklistingTip 66

Page 102: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Configuration

• Use a proxy server to manipulate the traffic from your Selenium test(s)

• Identify third-party resources that are slow to load (which could negatively impact your tests) and blacklist them (e.g., make it so they don’t load)

Page 103: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 104: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 105: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Load TestingTip 68

Page 106: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Configuration

• Use a proxy server to capture the traffic from your Selenium test(s)

• Convert the HTTP Archive into a JMeter JMX file

• Run the new JMX file with JMeter to enact load on your application (modify as needed)

Page 107: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 108: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 109: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Code adapted from ruby-jmeter example from flood.io

Page 110: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 111: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 112: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Broken Image CheckingTip 67

Page 113: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Option 1 - Proxy Server

Option 2 - HTTP Library

Option 3 - JavaScript

Page 114: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Option 1: Proxy Server

Page 115: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 116: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Option 2: HTTP Library

Page 117: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 118: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Option 3: JavaScript

Page 119: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 120: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Forgot PasswordTip 43

Page 121: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Configuration• Use Selenium to trigger the forgot password

workflow (which sends an e-mail to a Gmail account) and keep the session active

• Retrieve the e-mail and it’s contents (e.g., a URL) through the Gmail API

• Launch the URL from the e-mail using the Selenium session

Page 122: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 123: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 124: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

A/B TestingTip 12

Page 125: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 126: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 127: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Example Explanation

• There are 3 states available in the example on the-internet. Each state has different header text.

• The control has the text ‘A/B Test Control’

• The variation has the text ‘A/B Test Variation 1’

• Outside of the split test, the text says ‘No A/B Test’

Page 128: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Configuration

• You can easily opt-out of A/B tests by forging a cookie or appending a query to the URL

• This way you get a known state of the page which isn’t likely to change without your knowledge

Page 129: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 130: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 131: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Downloading a FileTips 2, 8, & 15

Page 132: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Two approaches• Configure Selenium to download to local disk, and

delete the file when done

• Use an HTTP library, perform a HEAD request, and check the headers for the correct content type & length.

A HEAD request with an HTTP library is an order of magnitude faster than downloading with Selenium since you’re just checking the headers. And, it can be used in

tandem with Selenium.

Page 133: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

With Selenium

Page 134: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 135: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

With an HTTP library

Page 136: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

With an HTTP library (for secure files)

Page 137: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 138: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Highlight ElementsTip 65

Page 139: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 140: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 141: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 142: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 143: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Growl NotificationsTip 55

Page 144: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 145: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 146: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup
Page 147: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

See the video at http://bit.ly/se-growl-video

Page 148: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Visual Testing

Page 149: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Some Write-ups

http://bit.ly/se-visual-1 Getting Started

http://bit.ly/se-visual-2 False Positives part 1

http://bit.ly/se-visual-3 False Positives part 2

http://bit.ly/se-visual-4 Add Visual Testing To Your Existing Tests

http://bit.ly/se-visual-5 Add Visual Testing To Your BDD Tests

Page 150: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

A Robot On Every Desk ™

Page 151: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Tapsterbot

http://bit.ly/tapster-build

http://bitly.com/tapster-buy

Build Your Own

Buy One Fully Assembled

Page 152: Selenium Tips & Tricks, presented at the Tel Aviv Selenium Meetup

Get in touch

@TourDeDave

[email protected]

DaveHaeffner.com