Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Selenium Page Objects an Example in Java

David Luu
September 18, 2014

Selenium Page Objects an Example in Java

A Java example implementation for the Page Object Practitioners Present!!! meetup for South Bay Selenium Meetup group (http://www.meetup.com/SeleniumSanJose/events/199204062/?a=uc1_vm&read=1&_af_eid=199204062&_af=event).

For additional tips and thoughts on page objects (from me), go to http://autumnator.wordpress.com.

David Luu

September 18, 2014
Tweet

More Decks by David Luu

Other Decks in Programming

Transcript

  1. Visual Overview of the automation • What we are testing

    and implementing page object for • Target = a simple ask.com search and potentially not so simple results analysis
  2. An example test excerpt @Test public void testDemo() throws Exception

    { AskSearchPage mainSearchPage = new AskSearchPage(driver); mainSearchPage.open(); mainSearchPage.doSearchOn("fourscore"); ArrayList<SearchResult> results1 = mainSearchPage.getSearchResults(); Assert.assertEquals(results1.size(),10); printSearchResults(results1); //…and so on for checking the remaining search results pages }
  3. Custom SearchResult data structure public class SearchResult { public String

    title; public String link; public String description; public SearchResult(String title, String link, String description){ this.title = title; this.link = link; this.description = description; } public SearchResult(){ this("","",""); } }
  4. Ask.com search page object public class AskSearchPage { private WebDriver

    driver; private String searchTextField = "id=search-box"; private String searchTextSubmitBtn = "id=sbut"; private String searchResultsRootElement = "css=div#lindm > div[class*='wresult tsrc_']"; private String searchResultTitleTxt = "css=a.url.txt_lg, a.title.url"; private String searchResultLink = "css=a.url.txt_lg, a.title.url"; private String searchResultDescriptionTxt = "css=p.abstract.txt3"; private String nextPageLink = "id=nextPageLink"; //special case locators, etc. private String dictionaryResultClassId = "SAS"; private String dictionaryResultTitleTxt = "css=div.sa_dictionary_syllable_spell"; private String dictionaryResultDescriptionTxt = "css=div.sa_dictionary_definitions"; private String wikiResultClassId = "Wiki-SA"; private String wikiResultDescriptionTxt = "css=div[style='overflow:hidden;']"; private String newsResultClassId = "NEWS"; private String newsResultDescription = "css=a.title.url + div"; private String pageUrl = "http://www.ask.com"; public AskSearchPage(WebDriver driver){ this.driver = driver; }
  5. Ask.com search page object continued public void doSearchOn(String text) throws

    Exception{ driver.findElement(Utility.getLocatorReference(searchTextField)).sendKeys(text); driver.findElement(Utility.getLocatorReference(searchTextSubmitBtn)).click(); } /** * Go to the next search page by clicking 'next' link at bottom of the search page * For now, we assume the 'next' link is always clickable (e.g. not at last page) */ public AskSearchPage goToNextSearchPage() throws Exception{ driver.findElement(Utility.getLocatorReference(nextPageLink)).click(); return new AskSearchPage(driver); } /** * Open up Ask.com search (home) page */ public void open() throws Exception{ driver.get(pageUrl); }
  6. Ask.com search page object continued public ArrayList<SearchResult> getSearchResults() throws Exception{

    ArrayList<WebElement> resultsRootElem = (ArrayList<WebElement>) driver.findElements( Utility.getLocatorReference(searchResultsRootElement) ); ArrayList<SearchResult> finalResults = new ArrayList<SearchResult>(); int numResults = resultsRootElem.size(); String className; SearchResult searchResult; …
  7. Ask.com search page object continued for(int i = 0; i

    < numResults; i++){ className = resultsRootElem.get(i).getAttribute("class"); searchResult = new SearchResult(); //handle case of special search results in main/1st page if(className.contains(dictionaryResultClassId)){ searchResult.title = resultsRootElem.get(i).findElement( Utility.getLocatorReference(dictionaryResultTitleTxt)).getText(); searchResult.description = resultsRootElem.get(i).findElement( Utility.getLocatorReference(dictionaryResultDescriptionTxt)).getText(); }else if(..some other cases…){ //code for other cases }else{ //normal search result case searchResult.title = resultsRootElem.get(i).findElement( Utility.getLocatorReference(searchResultTitleTxt)).getText(); searchResult.link = resultsRootElem.get(i).findElement( Utility.getLocatorReference(searchResultLink)).getAttribute("href"); searchResult.description = resultsRootElem.get(i).findElement( Utility.getLocatorReference(searchResultDescriptionTxt)).getText(); } finalResults.add(searchResult); } return finalResults;
  8. Test related methods outside page object public void printSearchResults(ArrayList<SearchResult> results){

    int numResults = results.size(); for(int i = 0; i < numResults; i++){ logger.info("Link: " + results.get(i).link); logger.info("Title: " + results.get(i).title); logger.info("Description: " + results.get(i).description); printTotalWordCountInSearchResultDescription( results.get(i)); logger.info(""); //for pretty formatting } } //a complex scenario can do more analysis than just dump out results
  9. Sample output excerpt from a test run … 11:34:38.040 [main]

    LOG com.ask.pageobject.demo.tests.DemoTest - Link: http://www.thefreedictionary.com/fourscore 11:34:38.040 [main] LOG com.ask.pageobject.demo.tests.DemoTest - Title: fourscore - definition of fourscore by The Free Dictionary 11:34:38.040 [main] LOG com.ask.pageobject.demo.tests.DemoTest - Description: Definition of fourscore in the Online Dictionary. Meaning of fourscore. Pronunciation of fourscore. Translations of fourscore. fourscore synonyms, fourscore ... 11:34:38.041 [main] LOG com.ask.pageobject.demo.tests.DemoTest - 'fourscore' appeared 6 times. …
  10. Selenium RC style parser for WebDriver public class Utility {

    public static By getLocatorReference(String locator) throws NoSuchFieldException { // Match by prefix identifier of locator type // then strip out prefix and return as appropriate By object if(locator.startsWith("id=")){ return By.id(locator.substring(3)); }else if(…other Selenium RC locator strategies…){ …relevant parsing code… }else{ // Locator pattern not found throw new NoSuchFieldException( "Locator pattern " + locator + " not found.");
  11. Selenium RC style parser for WebDriver continued Find it in

    PHP here, trivial task to convert to your desired language – to return appropriate By object or WebElement. Consider it your homework ;) https://github.com/daluu/php-webdriver- bindings/blob/master/phpwebdriver/WebDriver BackedSelenium.php#L95
  12. Page object tips (based on real world observations) • Separate

    test data from page objects • High level over granular methods – Zoom(direction, units) vs zoomIn(), zoomOut() • Private page object locators but mostly public methods • Try to avoid click(), type(), etc. methods • Consider building out page objects upfront • More complex examples w/o code, time permitting