Blog to understand automation concepts in QTP, Selenium Webdriver and Manual Testing concepts

Identifying Elements in Selenium – Using By

In the previous article, we discuss on the concept and difference between FindElement and FindElements. While FindElement returns the first  webElement matching the condition, FindElements return a list of Web Elements.

We can identify a web Element using the class Name, Id, css Selector, link Text, name, partial link Text, tag Name, or Xpath property. Let us discuss now what these properties are and how to extract these in an HTML Page. We can identify the DOM structure of the objects in page. In Firefox browser, we can install the firebug add-on to identify the properties of element.


In Internet explorer, Chrome, or Firefox, Press F12 which will open the developer toolbar. Installing Firebug or similar add-on in browser helps to identify the object’s property in a better way, so is recommended to install firebug add-on in Firefox to extract object information to be used to identify object properties in a better way.


Let us take a simple example of link for Gmail in the Google Page, to understand how we can use properties in selenium to uniquely identify the element in the Page.
Consider code as shown in below image. We are focusing on element link for Gmail.



For the element gmail in the Page, we have following information from the firebug. It is a link, so tagName of the object is “a”, classname of the object is “gb_g”, Id is “gma3”, href is https://mail.google.com/mail/?tab=wm. nad name is "tna";

Now to identify this element in the Page in Selenium using different by method is explained below: 

Using Id - Iattribute can be used to uniquely identify web element in the Page. Since Id is unique for a web element in the Page. If Id is provided for an object, we should use Id to identify the object uniquely.


So suppose we use Id to uniquely identify the web element, the syntax will be:

WebElement usr= driver.findElement(By.id("gma3"));

Using TagName – We usually use tagName to find list of elements in the Page. A common example includes finding number of link in the Page.


List<WebElement> logi = driver.findElements(By.tagName("a"));
System.out.println(logi.size());

      Using ClassName - The class attribute specifies the class of element defined. Several objects in the Page can have same class and is usually useful  o get a list of objects. 


E.g: there are five edit boxes in a form. Once we click on submit with invalid data in the forms. Five different error messages will be displayed, and is very much possible, all will have same class. Using ClassName and findelements, we can get a list of webelement and extract the error message using getText Method;

WebElement usr= driver.findElement(By.className("gb_g"));

In case of using findElement, first object identified by properties will be selected as webElement.

Name - Finds element /element (s) that match the name attribute supplied.


WebElement usr= driver.findElement(By.name("name"));

      linkText – Find element that matches the exact text of the link, used for element of type link only.

     WebElement usr= driver.findElement(By.linkText("gmail"));

   partialLinkText – Find element that matches the text partially of the link based on text provided, used for element of type link only.

     
     WebElement usr= driver.findElement(By.partiallinkText("gma"));

   cssSelector – As Per Wiki Definition,In CSS, selectors are used to declare which part of the markup a style applies to by matching tags and attributes in the markup itself. Based on location of objects, its property, e.g : Id or className or relative location in the Page, we can identify the element. We will discuss various scenario and syntax to identify the element using css.


In the current example, we can identify link Gmail using css in following ways.

WebElement usr= driver.findElement(By.cssSelector("a. gb_g")); Or
WebElement usr= driver.findElement(By.cssSelector("a#gma3")); Or
WebElement usr= driver.findElement(By.cssSelector("a#gma3.gb_g")); Or
WebElement usr= driver.findElement(By.cssSelector("a[name=tna"));


      Xpath – Xpath is a query language for selecting nodes from an XML document. XPath is rendered on most HTML Pages


WebElement usr= driver.findElement(By.xpath("//a"));
WebElement usr= driver.findElement((By.xpath("//a[@id='gma3']"));
WebElement usr= driver.findElement((By.xpath("//a[contains(@href, 'https://mail.google.com/mail/?tab=wm')]”));

How to Use FindElement(s) to identify Elements in Selenium WebDriver

The objective of this article  is to understand object Identification in selenium for the basic login Page in the application.Let us assume we have username/Password available for website. In this example, We will click on Link for Login, provide username and Password and click on Login button and validate login is successful.


Since we have to perform action on different objects, we need to identify objects or elements in the Page based on properties of the object. We use findElement or findElements to find a particular element or a list of element satisfying the object description. 

The findElement() method returns a WebElement object based on object description and throws exception if it does not find any element matching the object description. To return a webelement object, below is the syntax:

WebElement elemlink = driver.findElement(By.linkText("log in"));

Once we have the webelement defined, we can perform required action on the element. E.g: clicking a link, inputting text in an edit box or get text of the object.
Methods to work on an object using Selenium

In this example, we find collection of all elements in list elemlnk which have tagName as a, i.e collection of all the links in the page. Once we have the list, we can validate if a particular link is available in the Page by comparing the text or validating for broken links in the page based on http response.List<WebElement> elemlnk = driver.findElements(By.tagName("a"));for (int i=0;i<elemlnk.size();i++)
{String strData = elemlnk.get(i).getText();}So now, since we are familiar with basic of WebElement and WebElements, We can go further with the original problem in the Page which was:In this article, we will click on Link for Login, provide username and Password and click on Login button and validate login is successful.

Code for the problem:public void LoginInSagenda() { try {//finding link in the page for login and clicking on the link. WebElement elemlink = driver.findElement(By.linkText("Log in")); elemlink.click(); new WebDriverWait(driver,40).until(ExpectedConditions.titleContains("Log in"));//once link is clicked, we will verify title of the new page if (driver.getTitle().contains("Log in")) { System.out.println("Title of the Page contains text :" + driver.getTitle();          } else { System.out.println("Title of the Page does not contains text : Log in"); } //define elements on which to perform action. Note we use different ways to identify object in page by using Id, name and xpath in the page WebElement usr= driver.findElement(By.id("Email")); WebElement pwd= driver.findElement(By.name("Password")); WebElement login = driver.findElement(By.xpath("//input[@value='Login']"));// perform required action in the objects identified. usr.sendKeys("abc@xyz.com"); pwd.sendKeys("abcxyz"); login.click();// dynamic wait until a particular condition is met new WebDriverWait(driver,40).until(ExpectedConditions.titleContains("Dashboard"));//once link is clicked, we will verify title of the new page if (driver.getTitle().contains("Dashboard")) { System.out.println("Title of the Page contains text :" + driver.getTitle());   } else { System.out.println("Title of the Page does not contains text : Dashboard");   } } catch (Exception e) { System.out.println(e.getMessage());
}
}

The findElements() method returns a list of WebElements matching the object description. If no elements are found, it returns an empty list. 



How to Launch Selenium WebDriver on different browsers

In this article, we will discuss on how we launch Selenium web driver in different browsers in Java. 

Before we go further with this, We need installing different jar files and making initial set up in Java, Please go through below link and other useful links to set up initial java project in eclipse with selenium jar files added to project build path.


Once we have configured eclipse and added required external libraries in the build path, we can start with a basic test in eclipse to solve following requirement: 
  It is required to perform following action on different browsers
  •         Open www.sagenda.net on browser specified by user
  •         Verify the title of the Page has Sagenda in the text.
  •      Close the browser.
Below is the self explanatory code in java using Selenium to perform the required job:


//These are the class libraries that needs to be imported
import java.io.File;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.DesiredCapabilities;

public class Iteration {

//Define Webdriver object

 WebDriver driver;

//This is the main method to drive the test flow  

public static void main(String[] args) throws InterruptedException

//There are two part in the flow for which we created the required methods 

Iteration iter = new Iteration();

//a. Launching the required Browser

iter.LaunchBrowser("chrome");

//b. Providing the url of application and condition to verified in the test. Text in title in this example

iter.homePage("https://sagenda.net", "Sagenda");

}

//Function to launch required browser

public void LaunchBrowser (String strBrowser)

{

//based on the expected browser as provided in argument of method, we will launch the required browser

if (strBrowser.trim().toLowerCase().contentEquals("ie"))

{

//Launch IE browser://Pre-Conditions: Download IE driverServer.exe from the selenium download site and provide location where it is downloaded

 File file = new File("D:\\Selenium\\IEDriverServer.exe");

System.setProperty("webdriver.ie.driver", file.getAbsolutePath()); 

driver = new  InternetExplorerDriver();

}


else if (strBrowser.trim().toLowerCase().contentEquals("firefox"))

{

driver = new  FirefoxDriver();

}

else if (strBrowser.trim().toLowerCase().contentEquals("chrome"))

{

//Pre-Conditions: Download IE driverServer.exe from the selenium download site and provide location where it is downloaded

    System.setProperty("webdriver.chrome.driver", "d://chromedriver.exe");

   DesiredCapabilities capabilities = DesiredCapabilities.chrome();

   ChromeOptions options = new ChromeOptions();

   options.addArguments("test-type");

//Provide location where chrome is currently installed.  

    String Chrome_Path = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";

   capabilities.setCapability("chrome.binary",Chrome_Path);

   capabilities.setCapability(ChromeOptions.CAPABILITY, options);

   driver = new ChromeDriver(capabilities);

}

else

{

//In case browser is not in above three , print below message 

System.out.println("This browser is currently not supported by me, Please select from IE/Firefox or chrome");

}

}

//Function to perform required action on the application

public void homePage(String url, String strTextinTitle)
{
try
{
//open the required url 
driver.get(url);
//once the url is launched, verify the title contains the required text.
//Note : In case we require exact match , we will use contentequals instead of contains
if (driver.getTitle().contains(strTextinTitle))
{
System.out.println("Title of the Page contains text :" + strTextinTitle );
}
else
{
System.out.println("Title of the Page does not contains text :" + strTextinTitle );
}
}
catch(Exception e)
{
System.out.println(e.getClass());
}
}
}