+ All Categories
Home > Technology > Hands On with Selenium and WebDriver

Hands On with Selenium and WebDriver

Date post: 11-May-2015
Category:
Upload: techwellpresentations
View: 699 times
Download: 2 times
Share this document with a friend
Description:
Selenium WebDriver is an open source automation tool for test driving browsers. People sometimes find the API daunting and their initial automation code brittle and poorly structured. In this introduction, Alan Richardson provides hints and tips gained from his years of experience both using WebDriver and helping others improve their use of the tool. Alan starts at the beginning, explaining the basic WebDriver API capabilities—simple interrogation and navigation—and then moves on to synchronization strategies and working with AJAX applications. He covers tools and location strategies to find elements on web pages using CSS and XPath. Alan provides an introduction to abstraction approaches which help you build robust, reliable, and maintainable automation suites.
Popular Tags:
16
MD Full-day Tutorials 5/5/2014 8:30:00 AM Hands On with Selenium and WebDriver Presented by: Alan Richardson Compendium Developments Brought to you by: 340 Corporate Way, Suite 300, Orange Park, FL 32073 888-268-8770 ∙ 904-278-0524 ∙ [email protected] ∙ www.sqe.com
Transcript
Page 1: Hands On with Selenium and WebDriver

MD Full-day Tutorials

5/5/2014 8:30:00 AM

Hands On with Selenium

and WebDriver

Presented by:

Alan Richardson

Compendium Developments

Brought to you by:

340 Corporate Way, Suite 300, Orange Park, FL 32073

888-268-8770 ∙ 904-278-0524 ∙ [email protected] ∙ www.sqe.com

Page 2: Hands On with Selenium and WebDriver

Alan Richardson Compendium Developments

Alan Richardson has more than twenty years of professional IT experience, working as a programmer and at every level of the testing hierarchy from tester through head of testing. Author of the books Selenium Simplified and Java For Testers, Alan also has created online training courses to help people learn technical web testing and Selenium WebDriver with Java. He now works as an independent consultant, helping companies improve their use of automation, agile, and exploratory technical testing. Alan posts his writing and training videos on SeleniumSimplified.com, EvilTester.com, JavaForTesters.com, and CompendiumDev.co.uk.

Page 3: Hands On with Selenium and WebDriver

© Compendium Developments, 2014, CompendiumDev.co.uk

Hands On WebDriver: TrainingExercises For One Day

Alan Richardson

@eviltester

[email protected]

www.SeleniumSimplified.comwww.EvilTester.com

www.CompendiumDev.co.ukwww.JavaForTesters.com

© Compendium Developments, 2014, CompendiumDev.co.uk

Blogs and Websites

● CompendiumDev.co.uk

● SeleniumSimplified.com

● EvilTester.com

● JavaForTesters.com

● Twitter: @eviltester

Online Training Courses

● Technical Web Testing 101Unow.be/at/udemy101

● Intro to SeleniumUnow.be/at/udemystart

● Selenium 2 WebDriver APIUnow.be/at/udemyapi

Videos

youtube.com/user/EviltesterVideos

Books

Selenium Simplified

Unow.be/rc/selsimp

Java For Testers

leanpub.com/javaForTesters

Alan Richardson

uk.linkedin.com/in/eviltester

Independent Test Consultant & Custom Training

Contact Alan

http://compendiumdev.co.uk/contact

Page 4: Hands On with Selenium and WebDriver

© Compendium Developments, 2014, CompendiumDev.co.uk

Exercises

© Compendium Developments, 2014, CompendiumDev.co.uk

Exercises: My First Test

1) Create the Class and Test for “My First Extended Test”– http://seleniumsimplified.com/testpages/basic_web_page.html

● Get Page, Check Title, Find para1, Check Text

2) Find paragraph 1 using the Class Name "main"

3) Find paragraph 1 and check that getAttribute can return the class name correctly

4) Find all the paragraphs and check that there are 2 of them

Page 5: Hands On with Selenium and WebDriver

© Compendium Developments, 2014, CompendiumDev.co.uk

Exercises: My First Test .cont

5) Check that find element when the By would match multiple elements e.g. By.tagName("p") returns the first one

6) Check that findElement, when it can't find anything, throws an exception e.g. By.id("missing")

– What type of exception is thrown?

– What happens to the test?

7) Check that findElements, when it can't find anything, returns an empty collection and does not throw an exception

© Compendium Developments, 2014, CompendiumDev.co.uk

Exercises: Hamcrest

● Instead of Assert.assertTrue use

– assertThat(<condition>, is(true));

● Instead of Assert.assertEquals use

– assertThat(<value>, equalTo(<value>));

– assertThat(<value>, is(<value>));

Page 6: Hands On with Selenium and WebDriver

© Compendium Developments, 2014, CompendiumDev.co.uk

Exercises: JUnit

● Move the driver creation and quit into @BeforeClass and @AfterClass

● Move the driver.get into @Before, and driver.close into @After

● What happens to the tests now?

● What happens when a test throws an exception now?

© Compendium Developments, 2014, CompendiumDev.co.uk

Exercises: Navigation

● Use the URLs in the table

– navigate() .to(), .forward(), back(), .refresh()

– Assert on titles to check navigation worked

● http://seleniumsimplified.com/testpages

File Path Title

/ "Selenium Test Pages"

/search.php "Selenium Simplified Search Engine"

/basic_html_form.html "HTML Form Elements"

/basic_web_page.html "Basic Web Page Title"

/refresh.php "Refreshed Page on ([0-9]{10})"

Page 7: Hands On with Selenium and WebDriver

© Compendium Developments, 2014, CompendiumDev.co.uk

Exercises: Interrogation● Using /find_by_playground.php

● Assert that the URL is correct

● findElement and then assert

– e.g. getText(), getAttribute(“id”)

● Create a test for each By

– By.id

– By.linkText

– By.name

– By.partialLinkText

– By.className

● Experiment with getSize, getLocation etc.

“NoSuchElementException” means that the locator didn't match anything

in the DOM.

Inspect the DOM or look at the page source

to identify locator approaches

If multiple elements match then

findElement will return the first.

e.g., tryDebug mode,

or System.out.println

© Compendium Developments, 2014, CompendiumDev.co.uk

Exercises: Manipulation

1) Submit form and assert page title changes

2) Clear, then type comments, submit form and check output

3) Submit form with radio 2 selected

4) Submit form with only checkbox 1 selected

Using http://seleniumsimplified.com/testpages/basic_html_form.html

You might need to run these tests in 'debug' mode, because we have not covered synchronisation yet.

Or after creating the driver, add:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

Page 8: Hands On with Selenium and WebDriver

© Compendium Developments, 2014, CompendiumDev.co.uk

Exercises: Manipulation Bonus

● testpages/basic_ajax.html

● Manually, select “server”, select “java”, submit, check submitted details

● automate with .click and previous interrogation learning

● Run in Debug Mode

© Compendium Developments, 2014, CompendiumDev.co.uk

Exercises: Locators - CSS & XPath

Page 9: Hands On with Selenium and WebDriver

© Compendium Developments, 2014, CompendiumDev.co.uk

Manual Locator Exercises

Use FirePath to experiment with CSS & Xpath Selectors on /testpages/find_by_playground.php

● Select All links

● Select all the anchors

● Select the 13th Link

● Experiment

© Compendium Developments, 2014, CompendiumDev.co.uk

CSS Basic Exercises

● Use By.cssSelector as replacement for

– By.id, By.name, By.className, By.tagName

– Create test first using By.id (etc.)

– Check test works

– Replace By.id (etc.) with By.cssSelector

● Optionally – repeat above for xpath

Replace Assert

By.id(“p31”) getAttribute(“name”) == “pName31”

By.name(“ulName1”) getAttribute(“id”) == “ul1”

By.className(“specialDiv”) getAttribute(“id”) == “div1”

By.tagName(“li”) getAttribute(“name”) == “liName1”

Page 10: Hands On with Selenium and WebDriver

© Compendium Developments, 2014, CompendiumDev.co.uk

Exercises: Synchronisation

● Run the test FixFailingTest.java in debug mode and check it works when you step through slowly

● Run it as a test and it fails

● Fix by increasing implicit wait time

● Set implicit wait time to 0 and fix by Adding Synchronisation code using the ExpectedConditions class so that the test runs

● There is more than one way to do this. When you have one approach try and find at least one more (the answers show 4 ways to do this)

© Compendium Developments, 2014, CompendiumDev.co.uk

Exercises: Synchronisation (Bonus)

● Create a custom expected condition to fix the test

– Inline with anonymous function

– Using a private method that returns an ExpectedCondition

– Using a custom ExpectedCondition class

Page 11: Hands On with Selenium and WebDriver

© Compendium Developments, 2014, CompendiumDev.co.uk

Exercises: Page Objects

● Using a Fixed Ajax Test as a basis, create a Page Object for the basic_ajax page and use that in the tests.

● Create a version of the page object that uses the Page Factory

● Make the results page a SlowLoadableComponent based Page Object

© Compendium Developments, 2014, CompendiumDev.co.uk

Optional Exercises● Refactor existing tests to use Page Objects

● Refactor tests so urls are in a single object e.g. Site.BASE_URL

● Use the “Select” support class for the Ajax tests

● Add Synchronisation to the Manipulation Test

● Run tests using a different browser

● Use the other pages in /testpages and create Page Objects and tests to handle the functionality on the test pages

– e.g. cookies, alerts, submit forms

● Create a Driver class which lets you configure browsers in a single location

Answers are not provided for these – work through these at your own pace

Page 12: Hands On with Selenium and WebDriver

© Compendium Developments, 2014, CompendiumDev.co.uk

Answers

When no answer section exists then see the sample code

© Compendium Developments, 2014, CompendiumDev.co.uk

Answers: My First Test

1)See code on original slide

2)WebElement para1 =

driver.findElement(By.className("main"));

3)Assert.assertTrue(

para1.getAttribute("class").equals("main"));

4)Assert.assertEquals(

driver.findElements(By.tagName("p")).size(), 2);

5)Assert.assertTrue(driver.findElement(By.tagName("p")).

getAttribute("id").equals("para1"));

6)WebElement missing =

driver.findElement(By.id("missing"));

– NoSuchElementException

– leaves browser open

7)Assert.assertEquals(driver.findElements(

By.id("missing")).size(),0);

Page 13: Hands On with Selenium and WebDriver

© Compendium Developments, 2014, CompendiumDev.co.uk

Answers: Hamcrest

● Import from hamcrest matchersimport static org.hamcrest.MatcherAssert.assertThat;

import static org.hamcrest.Matchers.equalTo;

import static org.hamcrest.Matchers.is;

AssertThat(

driver.getTitle().equals("Basic Web Page Title"), is(true));

assertThat(driver.getTitle(), equalTo("Basic Web Page Title"));

assertThat(driver.getTitle(), is("Basic Web Page Title"));

© Compendium Developments, 2014, CompendiumDev.co.uk

Answers: JUnit

● Static required for class level methods

● Tests now focus on assertions and actions, not setup

● Failing tests don't leave browsers open

● Easier now to create new tests instead of expanding existing

static WebDriver driver;final String PAGE_URL = "http://seleniumsimplified.com/testpages/basic_web_page.html";

@BeforeClasspublic static void createDriver(){ driver = new FirefoxDriver();}

@Beforepublic void gotoPage(){ driver.get(PAGE_URL);}

@Afterpublic void closePage(){ driver.close();}

@AfterClasspublic static void closeBrowser(){ driver.quit();}

Page 14: Hands On with Selenium and WebDriver

© Compendium Developments, 2014, CompendiumDev.co.uk

Answers: Manual CSS Selectors

● a[href]

● a[name^="p"]

● #div18 ul li:nth-child(13) a

© Compendium Developments, 2014, CompendiumDev.co.uk

Answers: Manual XPath Selectors

● //a[@href]

● //a[not(@href)]

– Or

– //a[starts-with(@name,"p")]

● (//a[@href])[13]

Page 15: Hands On with Selenium and WebDriver

© Compendium Developments, 2014, CompendiumDev.co.uk

Answers: CSS Basic Exercises

● I have two sets of sample answers because there are so many ways of fulfilling the result

– FindByCSSSelectorBasicExercisesTest

– FindByCSSSelectorBasicExercisesFullAnswersTest

© Compendium Developments, 2014, CompendiumDev.co.uk

Answers: Synchronisation● Full answers in the code. Hint: prior to 2nd select

● And you might need to wait for the results to be ready

new WebDriverWait(driver,10).until( ExpectedConditions.invisibilityOfElementLocated( By.id("ajaxBusy")));

new WebDriverWait(driver,10).until( ExpectedConditions.presenceOfElementLocated( By.cssSelector("option[value='23']")));

new WebDriverWait(driver,10).until( ExpectedConditions.visibilityOfElementLocated( By.cssSelector("option[value='23']")));

new WebDriverWait(driver,10).until( ExpectedConditions.elementToBeClickable( By.cssSelector("option[value='23']")));

Page 16: Hands On with Selenium and WebDriver

© Compendium Developments, 2014, CompendiumDev.co.uk

Blogs and Websites

● CompendiumDev.co.uk

● SeleniumSimplified.com

● EvilTester.com

● JavaForTesters.com

● Twitter: @eviltester

Online Training Courses

● Technical Web Testing 101Unow.be/at/udemy101

● Intro to SeleniumUnow.be/at/udemystart

● Selenium 2 WebDriver APIUnow.be/at/udemyapi

Videos

youtube.com/user/EviltesterVideos

Books

Selenium Simplified

Unow.be/rc/selsimp

Java For Testers

leanpub.com/javaForTesters

Alan Richardson

uk.linkedin.com/in/eviltester

Independent Test Consultant & Custom Training

Contact Alan

http://compendiumdev.co.uk/contact


Recommended