SlideShare a Scribd company logo
Web UI Test Automation
by Artem Nagornyi

Drivers: Selenium WebDriver, Sikuli X
Frameworks: PageFactory, TestNG
Other tools: Apache Ant, Jenkins CI
What is Selenium WebDriver?
● Open-source, multi-platform, multi-browser
  tool for browser automation
● Collection of bindings for multiple languages
  (Java, C#, Python, Ruby, Perl, PHP)
● Can be used with different frameworks:
  JUnit, NUnit, TestNG, unittest, RSpec, Test::
  Unit, Bromine, Robot, and many others.
● Has the biggest and strongest community.
  De facto standard in the world of Web UI test
  automation
Locators
Selenium WebDriver finds elements in browser via DOM
using these locators:
● webdriver.findElement(By.id("logo"))
● webdriver.findElement(By.name("q"))
● webdriver.findElement(By.tagName("H1"))
● webdriver.findElements( By.className
   ("sponsor_logos"))
● webdriver.findElement( By.cssSelector("section.
   roundbutton div#someid"))
● webdriver.findElement( By.xpath("//section
   [@id='miniconfs']/a[2]"))
● webdriver.findElements(By.linkText("about"))
● webdriver.findElement(By.partialLinkText("canberra"))
Interactions With Page
Selenium WebDriver simulates all user
interactions with browser:
● webElement.click()
● webElement.sendKeys("type some text")
● webElement.submit()
Actions class -> Mouse events, Drag and Drop
   Actions builder = new Actions(driver);
   Action dragAndDrop = builder.clickAndHold(someElement)
         .moveToElement(otherElement)
         .release(otherElement)
         .build();
   dragAndDrop.perform();
There are many ways ...
To simulate right-click:
new Actions(driver).contextClick(element).perform();


Or you can use WebDriverBackedSelenium:
Selenium selenium = new WebDriverBackedSelenium(webDriver,
"http://sample.com")
selenium.fireEvent("//tr[@id[contains(.,'Equipment')]]",
"blur");


To generate virtually any JS event use JavaScriptExecutor:
((JavascriptExecutor)driver).executeScript("document.
getElementById('element ID').blur()")
AJAX applications
When elements are loaded asynchronously,
Selenium can wait either unconditionally:
  webdriver().manage().timeouts()
     .implicitlyWait(30, TimeUnit.SECONDS)


or conditionally:
  Boolean expectedTextAppeared =
  (new WebDriverWait(driver, 30))
  .until(ExpectedConditions.
  textToBePresentInElement(By.cssSelector
  ("div#projects div.value"), "expected
  value"));
Testing Styles and Executing JS
Testing CSS properties:
● webElement.getCssValue("height")
● webElement.getCssValue("background-image")

JavaScript execution:
  JavascriptExecutor js = (JavascriptExecutor)
  driver;
  js.executeScript("your_js_function();");
Frames and Alerts
TargetLocator target = webDriver.switchTo();

//Switching to a frame identified by its name
target.frame("name");
//Switching back to main content
target.defaultContent();

//Switching to alert
Alert alert = target.alert();
//Working with alert
alert.getText();
alert.accept();
alert.dismiss();
alert.sendKeys("text");
Browser Navigation
Navigation nav = webDriver.navigate();

//Emulating browser Back button
nav.back();

//Forward button
nav.forward();

//Open URL
nav.to("http://www.sut.com");
Migration from Selenium I (RC)
Selenium selenium =
new WebDriverBackedSelenium(webDriver, "http:
//sample.com")

selenium.open("http://sample.com/home");
selenium.click("id=follow_twitter");
selenium.waitForPageToLoad("10000");

WebDriver webDriver = ((WebDriverBackedSelenium)
selenium)
   .getUnderlyingWebDriver();
PageFactory and Page Objects
●   Each page is encapsulated in its own Page class where methods represent
    page-specific actions and instance variables represent elements bound to
    locators via annotations
●   Behavior that is not page-specific is encapsulated in a Site class, and all
    Page classes are derived from Site class

    public class GoogleSearchPage extends GoogleSite {
        @FindBy(id = "q")
        private WebElement searchBox;
        public GoogleResultsPage searchFor(String text) {
            searchBox.sendKeys(text);
            searchBox.submit();
            return PageFactory.initElements(driver,
    GoogleResultsPage.class);
        }
    }
Working with Regular Expressions
@FindBy(css = "a.mylink")
private WebElement mylink;
//This checks that the text of a link equals to "Yahoo"
assertEquals(mylink.getText(), "Yahoo");
//This checks that the text of a link contains "ho" substring
assertTrue(checkRegexp("ho", mylink.getText()));


       ===================Helpers.java===================
public static boolean checkRegexp(String regexp, String text)
{
    Pattern p = Pattern.compile(regexp);
    Matcher m = p.matcher(text);
    return m.find();
}
Asynchronous Text Lookup
webdriver().manage().timeouts()
    .implicitlyWait(30, TimeUnit.SECONDS)
isTextPresent("sometext"); isTextNotPresent("othertext");


       ===================Helpers.java===================
public static void isTextPresent(String text) {
    wd.findElement(By.xpath("//*[contains(.,""+text+"")]")); }
public static void isTextNotPresent(String text) {
    boolean found = true;
    try {
    wd.findElement(By.xpath("//*[contains(.,""+text+"")]"));
    } catch(Exception e) {
    found = false;
    } finally { assertFalse(found); } }
Working with Tables
@FindBy(css = "table#booktable")
private WebElement table;
//getting the handler to the rows of the table
List<WebElement> rows = table.findElements(By.tagName("tr"));
System.out.println("Table rows count: " + rows.size());
//print the value of each cell using the rows handler
int rown; int celln; rown = 0;
for(WebElement row: rows) {
rown ++;
List<WebElement> cells = row.findElements(By.tagName("td"));
celln = 0;
for(WebElement cell: cells) {
    celln ++;
    System.out.println("Row number: " + rown + ". Cell number: "
    + celln + ". Value: " + cell.getText());
} }
What is Sikuli X?
● Open-source, multi-platform visual
  technology to automate graphical user
  interfaces using images of objects on the
  screen.
● Tests are developed in Jython or Java.
● Images of objects are captured in Sikuli IDE.
● You can import and use Java classes to
  extend your framework.
Sikuli Java API Wrappers
//Wait for element on the screen
public static void elementWait (String elementImagePath, int
timeOut) throws Exception {
    regionImagePath = image_folder + elementImagePath;
    screen.exists(elementImagePath, timeOut);
}

//Click element on the screen
public static void elementWaitAndClick (String elementImagePath)
throws Exception {
    regionImagePath = image_folder + elementImagePath;
    screen.click(elementImagePath, 0);
}
Why Sikuli?
1. Automation of non-standard interfaces,
   where more native UI automation is
   impossible or will require much larger efforts.
2. Image comparison testing.
3. As a helper tool in scope of a larger test
   automation framework.
What is TestNG?
TestNG is a testing framework inspired from JUnit and NUnit but
introducing some new functionalities that make it more powerful
and easier to use, such as:
 ● Annotations.
 ● Run your tests in arbitrarily big thread pools with various
    policies available (all methods in their own thread, one thread
    per test class, etc...).
 ● Flexible test configuration.
 ● Support for data-driven testing (with @DataProvider).
 ● Support for parameters.
 ● Powerful execution model (no more TestSuite).
 ● Supported by a variety of tools and plug-ins (Eclipse, IDEA,
    Maven, etc...).
TestNG Code Example
@Test(groups = {"regression", "inprogress"})
public void testSearch() { // test implementation }

@Parameters({"browser"})
@BeforeMethod(alwaysRun = true)
public void startDriver(){
driver = new FirefoxDriver(); }

@AfterClass(alwaysRun = true)
public void stopDriver() {
driver.close(); }
Apache Ant
Apache Ant is a Java build and configuration
tool that we use for:
1. Compilation of Selenium WebDriver test
   classes
2. Execution of tests
3. Passing parameters from command line to
   test automation framework (used for
   selective execution of test suite and test
   case)
Jenkins Continuous Integration
Server
Jenkins is a popular open-source continuous
integration server that we use for:
1. Scheduled execution or on-demand
   execution of Selenium WebDriver tests
2. Integration with source control repository
   (SVN, GIT)
3. Shared online dashboard with test results
4. Keeping history of test results
5. Email notifications about failed builds
Online Resources
● http://seleniumhq.org/docs/03_webdriver.html -
  Selenium WebDriver official page and tutorial
● http://selenium.googlecode.
  com/svn/trunk/docs/api/java/index.html - Selenium
  WebDriver API (Java bindings)
● http://code.google.com/p/selenium/wiki/PageFactory -
  PageFactory
● http://testng.org/doc/documentation-main.html - TestNG
  documentation
● http://sikuli.org/docx/ - Sikuli X Documentation
● http://ant.apache.org/manual/index.html - Apache Ant
  documentation
● https://wiki.jenkins-ci.org/display/JENKINS/Use+Jenkins
  - Jenkins Wiki
Questions

More Related Content

PPT
Introduction to Selenium
PPT
Selenium Architecture
PPTX
Selenium web driver
PDF
Selenium Overview
PPTX
Selenium WebDriver
PPTX
Introduction to Selenium Web Driver
PDF
UI Testing Automation
PDF
Mastering Test Automation: How to Use Selenium Successfully
Introduction to Selenium
Selenium Architecture
Selenium web driver
Selenium Overview
Selenium WebDriver
Introduction to Selenium Web Driver
UI Testing Automation
Mastering Test Automation: How to Use Selenium Successfully

What's hot (20)

PPT
Web Test Automation with Selenium
PPT
Selenium
PPT
Selenium
PPTX
Automated UI testing done right (DDDSydney)
PPT
Selenium
PPTX
Selenium web driver
PPT
Selenium
DOCX
Selenium WebDriver FAQ's
ODP
Automated UI testing. Selenium. DrupalCamp Kyiv 2011
PDF
Automation framework using selenium webdriver with java
PPT
Selenium
PDF
Selenium 2 - PyCon 2011
PDF
Introduction to Protractor
PDF
Web automation using selenium.ppt
PDF
Test Automation Using Python | Edureka
PDF
Introduction to Automation Testing and Selenium overiew
PDF
Selenium presentation
PDF
Selenium web driver
PPT
Selenium Concepts
PPTX
Python selenium
Web Test Automation with Selenium
Selenium
Selenium
Automated UI testing done right (DDDSydney)
Selenium
Selenium web driver
Selenium
Selenium WebDriver FAQ's
Automated UI testing. Selenium. DrupalCamp Kyiv 2011
Automation framework using selenium webdriver with java
Selenium
Selenium 2 - PyCon 2011
Introduction to Protractor
Web automation using selenium.ppt
Test Automation Using Python | Edureka
Introduction to Automation Testing and Selenium overiew
Selenium presentation
Selenium web driver
Selenium Concepts
Python selenium
Ad

Viewers also liked (9)

PPTX
UI Test Automation - Maximizing ROI by Minimizing Maintenance Costs
PDF
UI test automation techniques by an example of JavaFX UI
PDF
Introduction to UI Automation Framework
KEY
Effectively Using UI Automation
PPT
Challenges faced in UI automation
PPTX
Coded UI - Test automation Practices from the Field
PPTX
UI Automation Quirks
PDF
UI Test Automation Effectiveness
PDF
Behavior Driven UI Automation (Agile Testing Days 2017, Potsdam)
UI Test Automation - Maximizing ROI by Minimizing Maintenance Costs
UI test automation techniques by an example of JavaFX UI
Introduction to UI Automation Framework
Effectively Using UI Automation
Challenges faced in UI automation
Coded UI - Test automation Practices from the Field
UI Automation Quirks
UI Test Automation Effectiveness
Behavior Driven UI Automation (Agile Testing Days 2017, Potsdam)
Ad

Similar to Web UI test automation instruments (20)

PPTX
Protractor framework architecture with example
PDF
Component Based Unit Testing ADF with Selenium
PDF
Automated Testing ADF with Selenium
PDF
Automated testing by Richard Olrichs and Wilfred vd Deijl
PPTX
Breaking free from static abuse in test automation frameworks and using Sprin...
PDF
Automated acceptance test
PDF
Selenium interview questions and answers
PDF
Toolbox for Selenium Tests in Java: WebDriverManager and Selenium-Jupiter
PDF
Node.js and Selenium Webdriver, a journey from the Java side
PDF
Top100summit 谷歌-scott-improve your automated web application testing
PPTX
Selenium training
PPTX
Mastering Test Automation: How To Use Selenium Successfully
PDF
Selenium RC: Automated Testing of Modern Web Applications
PPTX
Testing basics for developers
PPTX
Web driver training
PDF
Integration tests: use the containers, Luke!
PPTX
Automation - web testing with selenium
PDF
Javascript ui for rest services
PDF
What is the taste of the Selenide
Protractor framework architecture with example
Component Based Unit Testing ADF with Selenium
Automated Testing ADF with Selenium
Automated testing by Richard Olrichs and Wilfred vd Deijl
Breaking free from static abuse in test automation frameworks and using Sprin...
Automated acceptance test
Selenium interview questions and answers
Toolbox for Selenium Tests in Java: WebDriverManager and Selenium-Jupiter
Node.js and Selenium Webdriver, a journey from the Java side
Top100summit 谷歌-scott-improve your automated web application testing
Selenium training
Mastering Test Automation: How To Use Selenium Successfully
Selenium RC: Automated Testing of Modern Web Applications
Testing basics for developers
Web driver training
Integration tests: use the containers, Luke!
Automation - web testing with selenium
Javascript ui for rest services
What is the taste of the Selenide

Recently uploaded (20)

PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
A novel scalable deep ensemble learning framework for big data classification...
PDF
Zenith AI: Advanced Artificial Intelligence
PDF
Transform Your ITIL® 4 & ITSM Strategy with AI in 2025.pdf
PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PDF
Mushroom cultivation and it's methods.pdf
PDF
Enhancing emotion recognition model for a student engagement use case through...
PDF
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
PPTX
A Presentation on Artificial Intelligence
PDF
Univ-Connecticut-ChatGPT-Presentaion.pdf
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Web App vs Mobile App What Should You Build First.pdf
PPTX
TLE Review Electricity (Electricity).pptx
PDF
From MVP to Full-Scale Product A Startup’s Software Journey.pdf
PDF
ENT215_Completing-a-large-scale-migration-and-modernization-with-AWS.pdf
PPTX
cloud_computing_Infrastucture_as_cloud_p
PDF
1 - Historical Antecedents, Social Consideration.pdf
PDF
DP Operators-handbook-extract for the Mautical Institute
Building Integrated photovoltaic BIPV_UPV.pdf
A novel scalable deep ensemble learning framework for big data classification...
Zenith AI: Advanced Artificial Intelligence
Transform Your ITIL® 4 & ITSM Strategy with AI in 2025.pdf
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
Mushroom cultivation and it's methods.pdf
Enhancing emotion recognition model for a student engagement use case through...
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
A Presentation on Artificial Intelligence
Univ-Connecticut-ChatGPT-Presentaion.pdf
Programs and apps: productivity, graphics, security and other tools
Unlocking AI with Model Context Protocol (MCP)
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Web App vs Mobile App What Should You Build First.pdf
TLE Review Electricity (Electricity).pptx
From MVP to Full-Scale Product A Startup’s Software Journey.pdf
ENT215_Completing-a-large-scale-migration-and-modernization-with-AWS.pdf
cloud_computing_Infrastucture_as_cloud_p
1 - Historical Antecedents, Social Consideration.pdf
DP Operators-handbook-extract for the Mautical Institute

Web UI test automation instruments

  • 1. Web UI Test Automation by Artem Nagornyi Drivers: Selenium WebDriver, Sikuli X Frameworks: PageFactory, TestNG Other tools: Apache Ant, Jenkins CI
  • 2. What is Selenium WebDriver? ● Open-source, multi-platform, multi-browser tool for browser automation ● Collection of bindings for multiple languages (Java, C#, Python, Ruby, Perl, PHP) ● Can be used with different frameworks: JUnit, NUnit, TestNG, unittest, RSpec, Test:: Unit, Bromine, Robot, and many others. ● Has the biggest and strongest community. De facto standard in the world of Web UI test automation
  • 3. Locators Selenium WebDriver finds elements in browser via DOM using these locators: ● webdriver.findElement(By.id("logo")) ● webdriver.findElement(By.name("q")) ● webdriver.findElement(By.tagName("H1")) ● webdriver.findElements( By.className ("sponsor_logos")) ● webdriver.findElement( By.cssSelector("section. roundbutton div#someid")) ● webdriver.findElement( By.xpath("//section [@id='miniconfs']/a[2]")) ● webdriver.findElements(By.linkText("about")) ● webdriver.findElement(By.partialLinkText("canberra"))
  • 4. Interactions With Page Selenium WebDriver simulates all user interactions with browser: ● webElement.click() ● webElement.sendKeys("type some text") ● webElement.submit() Actions class -> Mouse events, Drag and Drop Actions builder = new Actions(driver); Action dragAndDrop = builder.clickAndHold(someElement) .moveToElement(otherElement) .release(otherElement) .build(); dragAndDrop.perform();
  • 5. There are many ways ... To simulate right-click: new Actions(driver).contextClick(element).perform(); Or you can use WebDriverBackedSelenium: Selenium selenium = new WebDriverBackedSelenium(webDriver, "http://sample.com") selenium.fireEvent("//tr[@id[contains(.,'Equipment')]]", "blur"); To generate virtually any JS event use JavaScriptExecutor: ((JavascriptExecutor)driver).executeScript("document. getElementById('element ID').blur()")
  • 6. AJAX applications When elements are loaded asynchronously, Selenium can wait either unconditionally: webdriver().manage().timeouts() .implicitlyWait(30, TimeUnit.SECONDS) or conditionally: Boolean expectedTextAppeared = (new WebDriverWait(driver, 30)) .until(ExpectedConditions. textToBePresentInElement(By.cssSelector ("div#projects div.value"), "expected value"));
  • 7. Testing Styles and Executing JS Testing CSS properties: ● webElement.getCssValue("height") ● webElement.getCssValue("background-image") JavaScript execution: JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("your_js_function();");
  • 8. Frames and Alerts TargetLocator target = webDriver.switchTo(); //Switching to a frame identified by its name target.frame("name"); //Switching back to main content target.defaultContent(); //Switching to alert Alert alert = target.alert(); //Working with alert alert.getText(); alert.accept(); alert.dismiss(); alert.sendKeys("text");
  • 9. Browser Navigation Navigation nav = webDriver.navigate(); //Emulating browser Back button nav.back(); //Forward button nav.forward(); //Open URL nav.to("http://www.sut.com");
  • 10. Migration from Selenium I (RC) Selenium selenium = new WebDriverBackedSelenium(webDriver, "http: //sample.com") selenium.open("http://sample.com/home"); selenium.click("id=follow_twitter"); selenium.waitForPageToLoad("10000"); WebDriver webDriver = ((WebDriverBackedSelenium) selenium) .getUnderlyingWebDriver();
  • 11. PageFactory and Page Objects ● Each page is encapsulated in its own Page class where methods represent page-specific actions and instance variables represent elements bound to locators via annotations ● Behavior that is not page-specific is encapsulated in a Site class, and all Page classes are derived from Site class public class GoogleSearchPage extends GoogleSite { @FindBy(id = "q") private WebElement searchBox; public GoogleResultsPage searchFor(String text) { searchBox.sendKeys(text); searchBox.submit(); return PageFactory.initElements(driver, GoogleResultsPage.class); } }
  • 12. Working with Regular Expressions @FindBy(css = "a.mylink") private WebElement mylink; //This checks that the text of a link equals to "Yahoo" assertEquals(mylink.getText(), "Yahoo"); //This checks that the text of a link contains "ho" substring assertTrue(checkRegexp("ho", mylink.getText())); ===================Helpers.java=================== public static boolean checkRegexp(String regexp, String text) { Pattern p = Pattern.compile(regexp); Matcher m = p.matcher(text); return m.find(); }
  • 13. Asynchronous Text Lookup webdriver().manage().timeouts() .implicitlyWait(30, TimeUnit.SECONDS) isTextPresent("sometext"); isTextNotPresent("othertext"); ===================Helpers.java=================== public static void isTextPresent(String text) { wd.findElement(By.xpath("//*[contains(.,""+text+"")]")); } public static void isTextNotPresent(String text) { boolean found = true; try { wd.findElement(By.xpath("//*[contains(.,""+text+"")]")); } catch(Exception e) { found = false; } finally { assertFalse(found); } }
  • 14. Working with Tables @FindBy(css = "table#booktable") private WebElement table; //getting the handler to the rows of the table List<WebElement> rows = table.findElements(By.tagName("tr")); System.out.println("Table rows count: " + rows.size()); //print the value of each cell using the rows handler int rown; int celln; rown = 0; for(WebElement row: rows) { rown ++; List<WebElement> cells = row.findElements(By.tagName("td")); celln = 0; for(WebElement cell: cells) { celln ++; System.out.println("Row number: " + rown + ". Cell number: " + celln + ". Value: " + cell.getText()); } }
  • 15. What is Sikuli X? ● Open-source, multi-platform visual technology to automate graphical user interfaces using images of objects on the screen. ● Tests are developed in Jython or Java. ● Images of objects are captured in Sikuli IDE. ● You can import and use Java classes to extend your framework.
  • 16. Sikuli Java API Wrappers //Wait for element on the screen public static void elementWait (String elementImagePath, int timeOut) throws Exception { regionImagePath = image_folder + elementImagePath; screen.exists(elementImagePath, timeOut); } //Click element on the screen public static void elementWaitAndClick (String elementImagePath) throws Exception { regionImagePath = image_folder + elementImagePath; screen.click(elementImagePath, 0); }
  • 17. Why Sikuli? 1. Automation of non-standard interfaces, where more native UI automation is impossible or will require much larger efforts. 2. Image comparison testing. 3. As a helper tool in scope of a larger test automation framework.
  • 18. What is TestNG? TestNG is a testing framework inspired from JUnit and NUnit but introducing some new functionalities that make it more powerful and easier to use, such as: ● Annotations. ● Run your tests in arbitrarily big thread pools with various policies available (all methods in their own thread, one thread per test class, etc...). ● Flexible test configuration. ● Support for data-driven testing (with @DataProvider). ● Support for parameters. ● Powerful execution model (no more TestSuite). ● Supported by a variety of tools and plug-ins (Eclipse, IDEA, Maven, etc...).
  • 19. TestNG Code Example @Test(groups = {"regression", "inprogress"}) public void testSearch() { // test implementation } @Parameters({"browser"}) @BeforeMethod(alwaysRun = true) public void startDriver(){ driver = new FirefoxDriver(); } @AfterClass(alwaysRun = true) public void stopDriver() { driver.close(); }
  • 20. Apache Ant Apache Ant is a Java build and configuration tool that we use for: 1. Compilation of Selenium WebDriver test classes 2. Execution of tests 3. Passing parameters from command line to test automation framework (used for selective execution of test suite and test case)
  • 21. Jenkins Continuous Integration Server Jenkins is a popular open-source continuous integration server that we use for: 1. Scheduled execution or on-demand execution of Selenium WebDriver tests 2. Integration with source control repository (SVN, GIT) 3. Shared online dashboard with test results 4. Keeping history of test results 5. Email notifications about failed builds
  • 22. Online Resources ● http://seleniumhq.org/docs/03_webdriver.html - Selenium WebDriver official page and tutorial ● http://selenium.googlecode. com/svn/trunk/docs/api/java/index.html - Selenium WebDriver API (Java bindings) ● http://code.google.com/p/selenium/wiki/PageFactory - PageFactory ● http://testng.org/doc/documentation-main.html - TestNG documentation ● http://sikuli.org/docx/ - Sikuli X Documentation ● http://ant.apache.org/manual/index.html - Apache Ant documentation ● https://wiki.jenkins-ci.org/display/JENKINS/Use+Jenkins - Jenkins Wiki