Showing posts with label Selenium. Show all posts
Showing posts with label Selenium. Show all posts

Wednesday, 13 April 2016

How To Continue With Script Even If NoSuchElement Exception is Thrown

The Problem
If you selenium script fails to find element on page by provided locator, it throws NoSuchElement exception. NoSuchElement is an exception which is basically like crashing the program into a wall. Whenever this error comes, script execution gets stopped.

A Solution
As an automation developer, I can ensure uninterrupted script execution in two ways
1.       Using try/catch block

Let’s try to implement it in an example –

NoSuchElement error without Try/Catch Handling
     public static void main(String[] args) {
                                WebDriver driver = new FirefoxDriver();

                                driver.get("http://thebuddhatree.blogspot.in/");

                                driver.findElement(By.id("name")).click();
                }

Note – This program will generate error and script execution gets stopped if element with provided locator is not on page.

NoSuchElement error with Try/Catch Block

import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class NoSuchElementError {

                public static void main(String[] args) {
                                WebDriver driver = new FirefoxDriver();
                                driver.get("http://thebuddhatree.blogspot.in/");
                                try {
                                                driver.findElement(By.id("name")).click();
                                } catch (NoSuchElementException e) {
                                                System.out.println("In Catch Block");
                                }
                                System.out.println("Outside Block, resume executing other code");
                }
}

Note – This program will generate error but script execution will continue for remaining code.

2.       Using FindElements() method
Build into Selenium is an ability to search multiple elements using single action
findElements() method behavior can be summarized as follows  -

·         On Zero Match : return an empty list
·         On One Match : returns list of one WebElement only
·         On One+ Match : returns list with all matching elements

NoSuchElement error using FindElements()
public static void main(String[] args) {
                                WebDriver driver = new FirefoxDriver();
                                driver.get("http://google.in/");
                               
                                List <WebElement> elements  =driver.findElements(By.id("name"));
                                if (elements.size() == 0){
                                                System.out.println("Element Not Found");
                                }
                }
Expected Behavior
  • ·         Open the Browser
  • ·         Load the page
  • ·         Search for an element
  • ·         Fails to find element
  • ·         Script execution continued

Conclusion
Happy Learning

Please ask questions on Testing Forum, in case of any issues or doubts or questions.

Friday, 19 February 2016

Introduction to Selenium WebDriver (Video Tutorial)

Selenium is browser automation tool & is used in wide range of web application. It can be implemented with many programming langauages, can run same script across browser & across operating systems.

This video helps you to learn following topics :


  1. Selenium Introduction
  2. Brief History 
  3. Selenium Tool Suite 
  4. Why Selenium 
  5. Note on Browser & Environment Support
  6. Advantage of WebDriver 
  7. Limitations of WebDriver
  8. How to choose the right Selenium Tool for your need 
  9. A short comparison of Selenium with QTP 
  10. Selenium WebDriver Overview 
  11. Define a Test Strategy for Automation 
  12. Pick a Programming Language 
  13. Choose an Editor 

Thursday, 31 December 2015

How to inspect HTML Element property in Internet Explorer

Since Internet Explorer version 8, IE has been shipping with a built-in tool-set for debugging, troubleshooting, and generally helping in inspecting elements on your pages. This utility is called as Developer Tools. There are two ways you can access it.
  1. By pressing F12 while in the browser
  2. Click on [Tools -> Developer Tools]

Developer Tools looks like following -



The HTML tab will let you peek into the DOM as the browser understands it. As you select elements from the HTML view, their styles will be detailed on the right, with individual rules have the ability to be toggled on and off. You can also modify rules, and determine whether the styles on the element were inherited, or assigned explicitly.


Having said that it is far from Fire Bug, but suitable for some quick help

Saturday, 3 October 2015

Create selenium WebDriver project in eclipse with Apache maven

The Problem
I often see Selenium practitioners ask that I have downloaded necessary resources to work on Selenium WebDriver. But, What should be project structure, how to manage dependencies, How to do build  and test management etc.

A Solution
By leveraging Apache Maven in our test framework, we can manage entire life-cycle of a test project. It provides support to define project structure, download the project dependencies libraries automatically, build and test management etc. Maven allows us to get all the Selenium libraries files and their dependencies by configuring the pom.xml (POM – Project Object Model) file.

Let’s dig in with an example

An Example
We will use Eclipse IDE and Maven for building the Selenium WebDriver test framework.
  1. Launch the Eclipse IDE.
  2. Create a new project by selecting [File -> New -> Other] from Eclipse Main Menu.
  3. On the New dialog, select [Maven -> Maven Project] as shown in the following screenshot:

  1. Click on [Next], the New Maven Project dialog will be displayed. Select the [Create a simple project (skip archetype selection)] check-box and set everything to default and click on the Next button as shown in the following screenshot: 

  1. On the New Maven Project dialog box, enter base package name (like com.myproject.app) in Group Id and project name (like myproject) in Artifact Id textboxes. You can also add a name and description but it is optional. Set everything to default and click on the [Finish] button as shown in the following screenshot:


  1. Eclipse will create the myproject project with a structure (in Package Explorer) similar to the one shown in the following screenshot:

7.       
           7. The JRE version might change based on the Java version installed on your machine. 
              Right-click on JRE System Library [J2SE-1.5] and select the Properties option from the 
              menu.       
  1. Select pom.xml from Package Explorer. This will open the pom.xml file in the editor area with the Overview tab open. Select the pom.xml tab instead.
  2. Add the WebDriver and TestNG dependencies highlighted in the following code snippet, to pom.xml in the <project> node:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
         <modelVersion>4.0.0</modelVersion>
         <groupId>com.myproject.app</groupId>
         <artifactId>myproject</artifactId>
         <version>0.0.1-SNAPSHOT</version>
<dependencies>
     <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-server</artifactId>
        <version>2.42.2</version>
    </dependency>
   <dependency>
                  <groupId>org.testng</groupId>
                  <artifactId>testng</artifactId>
                  <version>6.8.8</version>
   <scope>test</scope>
   </dependency>
</dependencies>
  <build>
    <testResources>
      <testResource>
        <directory>src/test/resources</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </testResource>
      <testResource>
        <directory>src/test/java</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </testResource>
    </testResources>
   
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
    </build>
/project>

  1. Right click on pom.xml from Package Explorer & Select [Run As -> Maven Install]

Conclusion
If you'd like to see the code and example used in the above project, you can find them here.


Happy Testing!

Wednesday, 30 July 2014

Selenium: How to handle Stale Element Exception error

Common Causes
A stale element reference exception is thrown in one of two cases:
  1. The element has been deleted entirely or element/page  has been refreshed
  2. The element is no longer attached to the DOM.


Solution
  1. The most simple solution is to use the Java PageFactory, this will create a proxy WebElement that will find the element every time you use it (There is a slim change that the element will be released in the couple of milliseconds between it being found and you performing an action on it, in this case it is suggested to use an explicit wait to wait for the element to become stale before finding it again).
  2. Use try catch to handle this exception and reload the element in catch block.
  3. Add a short sleep between FindElement & action method..


Monday, 10 February 2014

How to Verify Broken Links using Selenium WebDriver

This program reads all link from a web page, sends open connection request to URL, checks for response code. Based on response code, broken link is identified & get printed on console.

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;

public class Links_Broken {

    @Test
      public void saveAllLinks(){
          FirefoxDriver firefoxDriver = new FirefoxDriver(); //Starts Firefox browser
                  
          firefoxDriver.navigate().to("
http://google.co.in"); //opens Web Page
               
           List <WebElement>linksList = firefoxDriver.findElements(By.tagName("a")); // finds link  elements & stores in a list

//traverse each link from collection
          for(WebElement linkElement: linksList){
              String link =linkElement.getAttribute("href");
              if(link!=null){
                verifyLinkActive(link);
              }
          }
          firefoxDriver.quit(); // close Firefox browser
      }
          
      /**
       * This method verifies that link is active
       * @param link - link(URL)
       * @return - true/false
       */
       public void verifyLinkActive(String linkUrl){
          try {
             URL url = new URL(linkUrl);
             HttpURLConnection httpURLConnect=(HttpURLConnection)url.openConnection();
             httpURLConnect.setConnectTimeout(3000);
             httpURLConnect.connect();

             if(httpURLConnect.getResponseCode()==200){
                 System.out.println(linkUrl+" - "+httpURLConnect.getResponseMessage());
              }
            if(httpURLConnect.getResponseCode()==HttpURLConnection.HTTP_NOT_FOUND)  

             {
                 System.out.println(linkUrl+" - "+httpURLConnect.getResponseMessage() + " - "+                  HttpURLConnection.HTTP_NOT_FOUND);
              }
          } catch (MalformedURLException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
}

Friday, 3 January 2014

What are the element locators available with Selenium which could be used to locate elements on web page

There are mainly 5 locators used with Selenium –
1.       html id
2.       html name
3.       XPath locator
4.       Css locators
5.       DOM
6.       LinkText
7.       PartialLinkText
8.       Tagname

9.       Classname

Sunday, 29 December 2013

Selenium - How to highlight Element

It is always a good practice to highlight element before performing an operation. This helps us to know where the Selenium is currently focused or which element it is being executed.

There is no native way to do this, but because Selenium allows to execute JavaScript, it can be accomplished by  executing JavaScript method. Code is as follows -

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;

public class HighLightElement {

WebDriver driver = new FirefoxDriver(); //Launch firefox browser

@Test
   public void highlightTest() throws InterruptedException {
driver.get("https://www.facebook.com/"); // open facebook site
driver.manage().window().maximize(); // maximize browser
WebElement emailField = driver.findElement(By.xpath("//*[@id='email']")); //get
                reference to email text field
Thread.sleep(2000); //Stop program execution for 2 seconds
highlightElement(emailField); // call to highlight method


/** Method which executes Java Script code to highlight page object */
public void highlightElement(WebElement element) { 
   for (int i = 0; i < 2; i++) 
  { 
JavascriptExecutor js = (JavascriptExecutor) driver; 
js.executeScript("arguments[0].setAttribute('style', arguments[1]);", element, "color: red; border: 5px solid red;"); 
js.executeScript("arguments[0].setAttribute('style', arguments[1]);", element, ""); 
     } 

}

Thursday, 26 December 2013

Selenium - How to read URL of a link

Selenium code to get URL is as follows -

    1. Find the link as a Web Element using findElement() method

                      WebElement Lnk_URL =  driver.findElement(By.id("Lnk"));

    2. Get URL value using  "href" attribute
                      
                       String URL = Lnk_URL.getAttribute("href");

Thursday, 19 December 2013

Selenium - Can we set the speed of the WebDriver

This piece of functionality does not exist in Selenium WebDriver.  WebDriver provides  implicit wait and explicit wait to make sure that conditions happen before you attempt an action.

Tuesday, 3 December 2013

How to handle java script alert using WebDriver

WebDriver supports handling  JavaScript alerts using Alert interface.

          // Bring control on already opened alert
               Alert alert = driver.switchTo().alert();

          // Get the text/message of the alert or prompt
               alert.getText(); 
         
         // Click ok button of alert
              alert.accept();

         // Click Cancel button of alert

              alert.dismiss();

Selenium - How to switch to Web Dialog window & back to Parent Browser Window

Steps are as follows -

           1.   Before clicking the link, get the handle id of the browser window.
                 String BrowserParent = driver.getWindowHandle();

           2. After clicking the link;
                 String str = driver.getWindowHandle();
                 driver.switchTo().window(st); // switch to child browser

           3.    Once the operation on the web dialog box is completed.    

                   driver.switchTo().window(BrowserParent);

Friday, 29 November 2013

Selenium TestNG - How to disable HTML Report Generation


Steps to disable TestNG default HTML Report generation is as follows - 
  1. Right Click on [Java Project] 
  2. Select [Properties] 
  3. Select [TestNG] 
  4. Select [Disable default Listeners]
  5. Click on [Ok] button
Note - This would work if you have installed TestNG as Eclipse plug-in.

Thursday, 24 October 2013

Hybrid (Keyword + Data) Framework using Selenium WebDriver, JXL API, Log4J

Selenium Test Framework is a test automation framework, is developed using WebDriver, JXL API, LOG4J and MS Excel. It has following features -

  1. Hybrid (Keyword + Data) Framework
  2. Firefox browser testing
  3. Data Driven testing using XLS file, write one test method against multiple test data sets
  4. Well defined Tear Down feature, which provides ability to continue with test execution even in test failures/application crash
  5. HTML Test Report
  6. Test Script creation in XLS File
Visit link https://drive.google.com/file/d/0BypxAnZwsvAcYlVCajhMME5paWs/viewDrop a message if you want to download framework code.



Friday, 23 August 2013

Selenium WebDriver : - How to capture screenshot

#SeleniumWebDriver  #TakeScreenshot #TheBuddhaTree

The Problem
When we do nightly test execution, we need historical evidence to analyze & debug script failure. Sometime, it can be challenging to track down the issue that caused a failure using failure message along with stack trace. Especially when you run the test again and it passes.

A Solution
A simple way to gain insight into your test failures is to capture screenshots of AUT at the moment of failure and add the screenshots into test execution result. 

How to Implement using Selenium
Selenium WebDriver provides the TakesScreenshot interface for capturing a screenshot of a web page. This helps in test runs, showing exactly what happened when an exception or error occurred during execution, and so on.


TakesScreenshot interface provides the getScreenshotAs() method to capture a screenshot of the page displayed in the driver instance.  Example code is as follows –


import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;

public class TakeScreenshotOfApplication {
                WebDriver driver;

    @Test
       public void compareTitle() {
              driver = new FirefoxDriver();

              driver.get("http://google.co.in");

            // compare title & take screenshot of application if it fails
       if (driver.getTitle().contains("facebook")) {
                 System.out.println("Title matched!!");
       } else {
                 System.out.println("Title did not match");
                 takeScreenshotMethod();
            }
        }

        private void takeScreenshotMethod() {
             // code to take screen shot of browser
            File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);

             // file name where image to be saved
             String screenshotpath = "C:\\google.png";
               try {
                       // save image to drive
                        FileUtils.copyFile(scrFile, new File(screenshotpath));
               } catch (IOException e) {
                       e.printStackTrace();
              }
          }

}

Expected Behavior
  1. Load the URL
  2. Take Screenshot
  3. Save Screenshot Image to local drive
Happy Learning
}