Automation Using Selenium Webdriver

Monday 26 September 2016

Simple Page Object Model Example(POM)

Simple Page Object Model Frame work example

What is POM (Page Object Model) and what is the need of it?

Ans- Page Object Model Framework has now a days become very popular test automation framework in the industry and many companies are using it because of its easy test maintenance and reduces the duplication of code.The main advantage of Page Object Model is that if the UI changes for any page, it doesn’t require us to change any tests, we just need to change only the code within the page objects (Only at one place). Many other tools which are using selenium, are following the page object model.
The Page Object model provides the following advantages.
1. There is clean separation between test code and page specific code such as locators (or their use if you’re using a UI map) and layout.2. There is single repository for the services or operations offered by the page rather than having these services scattered throughout the tests.
************************------------------******************

 

Step 1: Create the Test Setup class
This the main class for page object model, where we will create Webdriver object based on the browser type passed as aparameter in textng.xml file. We will also need to pass the base page application URL in testng.xml as parameter.
In this example we have taken only two browsers the default Firefox and chrome browser. To initiate Chrome browser, we need to set the System Property by providing the chromedriver exe path.
We need to create a method to return Webdriver 'driver' where this is used for test execution.
Below is the example TestBaseSetup.class file
package com.pack.base;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;

public class TestBaseSetup {

 private WebDriver driver;
 static String driverPath = "D:\\chromedriver\";

 public WebDriver getDriver() {
  return driver;
 }

 private void setDriver(String browserType, String appURL) {
  switch (browserType) {
  case "chrome":
   driver = initChromeDriver(appURL);
   break;
  case "firefox":
   driver = initFirefoxDriver(appURL);
   break;
  default:
   System.out.println("browser : " + browserType
     + " is invalid, Launching Firefox as browser of choice..");
   driver = initFirefoxDriver(appURL);
  }
 }

 private static WebDriver initChromeDriver(String appURL) {
  System.out.println("Launching google chrome with new profile..");
  System.setProperty("webdriver.chrome.driver", driverPath
    + "chromedriver.exe");
  WebDriver driver = new ChromeDriver();
  driver.manage().window().maximize();
  driver.navigate().to(appURL);
  return driver;
 }

 private static WebDriver initFirefoxDriver(String appURL) {
  System.out.println("Launching Firefox browser..");
  WebDriver driver = new FirefoxDriver();
  driver.manage().window().maximize();
  driver.navigate().to(appURL);
  return driver;
 }

 @Parameters({ "browserType", "appURL" })
 @BeforeClass
 public void initializeTestBaseSetup(String browserType, String appURL) {
  try {
   setDriver(browserType, appURL);

  } catch (Exception e) {
   System.out.println("Error....." + e.getStackTrace());
  }
 }
 
 @AfterClass
 public void tearDown() {
  driver.quit();
 }
}Step 2: Now We will create Page Object classes. For each page we will create a separate class with constructor. We identify the locators and keep all together on just below the class. This will help us to re-use the locators for multiple methods and the main important is, we can easily find the locator and change if required.
We need to identify and list of all the possible functionalities on this page and we should write methods in such a way they are re-used. When ever there is a method to click on a button or link, we should return driver object of that page.
We will look into the below example. For method SignInBtn, we are returning after clicking on Sign In button as it is redirecting to sign in page.
BasePage.class
In the below SignInpage.class, we have methods to click on create account and sign in button. We are just verifying an error in sign in page for now in this example.
SignInPage.class
package come.pack.common.pageobjects;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class SignInPage {

private WebDriver driver;

private By headerPageText = By.cssSelector(".hidden-small");
private By createAccountLink = By.id("link-signup");
private By emailTextBox = By.id("Email");
private By passwordTextBox = By.id("Passwd");
private By loginBtn = By.id("signIn");
private By errorMsgTxt = By.id("errormsg_0_Passwd");
 
 public SignInPage(WebDriver driver) {
  this.driver=driver;
 }
 
 public String getSignInPageTitle() {
  String pageTitle = driver.getTitle();
  return pageTitle;
 }
 
 public boolean verifySignInPageTitle() {
  String expectedTitle = "Sign in - Google Accounts";
  return getSignInPageTitle().contains(expectedTitle);
 }
 
 public boolean verifySignInPageText() {
  WebElement element = driver.findElement(headerPageText);
  String pageText = element.getText();
  String expectedPageText = "Sign in with your Google Account";
  return pageText.contains(expectedPageText);
 }
  public CreateAccountPage clickonCreateAnAccount() {
   WebElement element=driver.findElement(createAccountLink);
   if(element.isDisplayed()||element.isEnabled())
    element.click();
   return new CreateAccountPage(driver);
 }
  
  public boolean verifySignIn() {
   enterUserName("test");
   enterPassword("pass");
   clickOnSignIn();
   return getErrorMessage().contains("incorrect");
  }
  
  public void enterUserName(String userName) {
   WebElement emailTxtBox = driver.findElement(emailTextBox);
   if(emailTxtBox.isDisplayed())
    emailTxtBox.sendKeys(userName);
  }
  
  public void enterPassword(String password) {
   WebElement passwordTxtBox = driver.findElement(passwordTextBox);
   if(passwordTxtBox.isDisplayed())
    passwordTxtBox.sendKeys(password);
  }
  
  public void clickOnSignIn() {
   WebElement signInBtn = driver.findElement(loginBtn);
   if(signInBtn.isDisplayed())
    signInBtn.click();
  }
  
  public String getErrorMessage() {
   String strErrorMsg = null;
   WebElement errorMsg = driver.findElement(errorMsgTxt);
   if(errorMsg.isDisplayed()&&errorMsg.isEnabled())
    strErrorMsg = errorMsg.getText();
   return strErrorMsg;
  }
}CreateAccountPage.class
package come.pack.common.pageobjects;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class CreateAccountPage {

 private WebDriver driver;
 private By headerPageTxt = By.cssSelector(".signuponepage.main.content.clearfix>h1");
 public CreateAccountPage(WebDriver driver) {
  this.driver=driver;
 }
 
 public String getPageTitle() {
  String title = driver.getTitle();
  return title;
 }
 
 public boolean verifyPageTitle() {
  String pageTitle = "Create your Google Account";
  return getPageTitle().contains(pageTitle);
 }
 public boolean verifyCreateAccountPageText() {
  WebElement element = driver.findElement(headerPageTxt);
  String pageText ="Create your Google Account";
  return element.getText().contains(pageText);
 }
 
 public void createAccount() {
  //need to write steps for creating an account
 }
}
Step 3: Now we will see how to write Tests for the above pages. For all the page Objects, we will now create Tests for each page. Which will help us in easy maintainability. if there is any change in the UI, we can simply change in one Page one place. We will see first example test for "BasePageTest.class".
In the below example we verifying home page by taking the title. We have written a method in BasePage and we are just calling it here.
'package com.pack.common.tests;

import org.openqa.selenium.WebDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import com.pack.base.TestBaseSetup;
import come.pack.common.pageobjects.BasePage;

public class BasePageTest extends TestBaseSetup{
 
 private WebDriver driver;
 
 @BeforeClass
 public void setUp() {
  driver=getDriver();
 }
 
 @Test
 public void verifyHomePage() {
  System.out.println("Home page test...");
  BasePage basePage = new BasePage(driver);
  Assert.assertTrue(basePage.verifyBasePageTitle(), "Home page title doesn't match");
 }

}
We will look into the next test 'SignInPageTest'. In the below test, we are verifying page title, page text, and Sign in functionality. For all these verifications we have defined methods in SignInPage class which we are calling from tests.
package com.pack.common.tests;

import org.openqa.selenium.WebDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import com.pack.base.TestBaseSetup;

import come.pack.common.pageobjects.BasePage;
import come.pack.common.pageobjects.SignInPage;

public class SignInPageTest extends TestBaseSetup{
private WebDriver driver;
private SignInPage signInPage;
private BasePage basePage;
 
 @BeforeClass
 public void setUp() {
  driver=getDriver();
 }
  
 @Test
 public void verifySignInFunction() {
  System.out.println("Sign In functionality details...");
  basePage = new BasePage(driver);
  signInPage = basePage.clickSignInBtn();
  Assert.assertTrue(signInPage.verifySignInPageTitle(), "Sign In page title doesn't match");
  Assert.assertTrue(signInPage.verifySignInPageText(), "Page text not matching");
  Assert.assertTrue(signInPage.verifySignIn(), "Unable to sign in");

 }

}
Now the create test 'CreateAnAccountTest'. Now we should be able to understand the verification that we are doing in the below test.
package com.pack.common.tests;

import org.openqa.selenium.WebDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import com.pack.base.TestBaseSetup;

import come.pack.common.pageobjects.BasePage;
import come.pack.common.pageobjects.CreateAccountPage;
import come.pack.common.pageobjects.SignInPage;

public class CreateAnAccounTest extends TestBaseSetup {
 private WebDriver driver;
 private SignInPage signInPage;
 private BasePage basePage;
 private CreateAccountPage createAccountPage;
  
  @BeforeClass
  public void setUp() {
   driver=getDriver();
  }
  
  @Test
  public void verifyCreateAnAccounPage() {
   System.out.println("Create An Account page test...");
   basePage = new BasePage(driver);
   signInPage = basePage.clickSignInBtn();
   createAccountPage = signInPage.clickonCreateAnAccount();
   Assert.assertTrue(createAccountPage.verifyPageTitle(), "Page title not matching");
   Assert.assertTrue(createAccountPage.verifyCreateAccountPageText(), "Page text not matching");
  }
  
  public void verifySignInFunction() {
   
  }

}
Step 4: We are done with Base Setup, Page Objects creation, Tests creation. Now we will execute them using 'testng.xml' file. We will add the classes which we want to test.
Remember we need to pass the parameters 'browserType' and 'appURL' for the base Setup class.
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Page Object test example">
<parameter name="appURL" value="https://www.google.co.in/"/>
<parameter name="browserType" value="firefox"/>
  <test name="sample test">
    <classes>
      <class name="com.pack.common.tests.HomePageTest"/>
      <class name="com.pack.common.tests.SignInPageTest"/>
      <class name="com.pack.common.tests.CreateAnAccounTest"/>
    </classes>
  </test>
</suite>
The above Page Object Model framework is the simple one without using any Build tools, Loggers, Listeners and Utilities. In the next coming post we will add all these things and design a Robust Page Object Model Framework which are used in the Industry.
The below are the list of things which are commonly used in the Real time Page Object Model Framework.
1. Selenium Webdriver with Java
2. Maven Build Tool
3. TestNG (We will user TestNG Listeners also)
4. Log4j
5. Eclipse IDE
Simple Page Object Model Example(POM)

Simple Page Object Model Example(POM)

Simple Page Object Model Frame work example

What is POM (Page Object Model) and what is the need of it?

Ans- Page Object Model Framework has now a days become very popular test automation framework in the industry and many companies are using it because of its easy test maintenance and reduces the duplication of code.The main advantage of Page Object Model is that if the UI changes for any page, it doesn’t require us to change any tests, we just need to change only the code within the page objects (Only at one place). Many other tools which are using selenium, are following the page object model.
The Page Object model provides the following advantages.
1. There is clean separation between test code and page specific code such as locators (or their use if you’re using a UI map) and layout.2. There is single repository for the services or operations offered by the page rather than having these services scattered throughout the tests.
************************------------------******************

 

Step 1: Create the Test Setup class
This the main class for page object model, where we will create Webdriver object based on the browser type passed as aparameter in textng.xml file. We will also need to pass the base page application URL in testng.xml as parameter.
In this example we have taken only two browsers the default Firefox and chrome browser. To initiate Chrome browser, we need to set the System Property by providing the chromedriver exe path.
We need to create a method to return Webdriver 'driver' where this is used for test execution.
Below is the example TestBaseSetup.class file
package com.pack.base;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;

public class TestBaseSetup {

 private WebDriver driver;
 static String driverPath = "D:\\chromedriver\";

 public WebDriver getDriver() {
  return driver;
 }

 private void setDriver(String browserType, String appURL) {
  switch (browserType) {
  case "chrome":
   driver = initChromeDriver(appURL);
   break;
  case "firefox":
   driver = initFirefoxDriver(appURL);
   break;
  default:
   System.out.println("browser : " + browserType
     + " is invalid, Launching Firefox as browser of choice..");
   driver = initFirefoxDriver(appURL);
  }
 }

 private static WebDriver initChromeDriver(String appURL) {
  System.out.println("Launching google chrome with new profile..");
  System.setProperty("webdriver.chrome.driver", driverPath
    + "chromedriver.exe");
  WebDriver driver = new ChromeDriver();
  driver.manage().window().maximize();
  driver.navigate().to(appURL);
  return driver;
 }

 private static WebDriver initFirefoxDriver(String appURL) {
  System.out.println("Launching Firefox browser..");
  WebDriver driver = new FirefoxDriver();
  driver.manage().window().maximize();
  driver.navigate().to(appURL);
  return driver;
 }

 @Parameters({ "browserType", "appURL" })
 @BeforeClass
 public void initializeTestBaseSetup(String browserType, String appURL) {
  try {
   setDriver(browserType, appURL);

  } catch (Exception e) {
   System.out.println("Error....." + e.getStackTrace());
  }
 }
 
 @AfterClass
 public void tearDown() {
  driver.quit();
 }
}Step 2: Now We will create Page Object classes. For each page we will create a separate class with constructor. We identify the locators and keep all together on just below the class. This will help us to re-use the locators for multiple methods and the main important is, we can easily find the locator and change if required.
We need to identify and list of all the possible functionalities on this page and we should write methods in such a way they are re-used. When ever there is a method to click on a button or link, we should return driver object of that page.
We will look into the below example. For method SignInBtn, we are returning after clicking on Sign In button as it is redirecting to sign in page.
BasePage.class
In the below SignInpage.class, we have methods to click on create account and sign in button. We are just verifying an error in sign in page for now in this example.
SignInPage.class
package come.pack.common.pageobjects;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class SignInPage {

private WebDriver driver;

private By headerPageText = By.cssSelector(".hidden-small");
private By createAccountLink = By.id("link-signup");
private By emailTextBox = By.id("Email");
private By passwordTextBox = By.id("Passwd");
private By loginBtn = By.id("signIn");
private By errorMsgTxt = By.id("errormsg_0_Passwd");
 
 public SignInPage(WebDriver driver) {
  this.driver=driver;
 }
 
 public String getSignInPageTitle() {
  String pageTitle = driver.getTitle();
  return pageTitle;
 }
 
 public boolean verifySignInPageTitle() {
  String expectedTitle = "Sign in - Google Accounts";
  return getSignInPageTitle().contains(expectedTitle);
 }
 
 public boolean verifySignInPageText() {
  WebElement element = driver.findElement(headerPageText);
  String pageText = element.getText();
  String expectedPageText = "Sign in with your Google Account";
  return pageText.contains(expectedPageText);
 }
  public CreateAccountPage clickonCreateAnAccount() {
   WebElement element=driver.findElement(createAccountLink);
   if(element.isDisplayed()||element.isEnabled())
    element.click();
   return new CreateAccountPage(driver);
 }
  
  public boolean verifySignIn() {
   enterUserName("test");
   enterPassword("pass");
   clickOnSignIn();
   return getErrorMessage().contains("incorrect");
  }
  
  public void enterUserName(String userName) {
   WebElement emailTxtBox = driver.findElement(emailTextBox);
   if(emailTxtBox.isDisplayed())
    emailTxtBox.sendKeys(userName);
  }
  
  public void enterPassword(String password) {
   WebElement passwordTxtBox = driver.findElement(passwordTextBox);
   if(passwordTxtBox.isDisplayed())
    passwordTxtBox.sendKeys(password);
  }
  
  public void clickOnSignIn() {
   WebElement signInBtn = driver.findElement(loginBtn);
   if(signInBtn.isDisplayed())
    signInBtn.click();
  }
  
  public String getErrorMessage() {
   String strErrorMsg = null;
   WebElement errorMsg = driver.findElement(errorMsgTxt);
   if(errorMsg.isDisplayed()&&errorMsg.isEnabled())
    strErrorMsg = errorMsg.getText();
   return strErrorMsg;
  }
}CreateAccountPage.class
package come.pack.common.pageobjects;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class CreateAccountPage {

 private WebDriver driver;
 private By headerPageTxt = By.cssSelector(".signuponepage.main.content.clearfix>h1");
 public CreateAccountPage(WebDriver driver) {
  this.driver=driver;
 }
 
 public String getPageTitle() {
  String title = driver.getTitle();
  return title;
 }
 
 public boolean verifyPageTitle() {
  String pageTitle = "Create your Google Account";
  return getPageTitle().contains(pageTitle);
 }
 public boolean verifyCreateAccountPageText() {
  WebElement element = driver.findElement(headerPageTxt);
  String pageText ="Create your Google Account";
  return element.getText().contains(pageText);
 }
 
 public void createAccount() {
  //need to write steps for creating an account
 }
}
Step 3: Now we will see how to write Tests for the above pages. For all the page Objects, we will now create Tests for each page. Which will help us in easy maintainability. if there is any change in the UI, we can simply change in one Page one place. We will see first example test for "BasePageTest.class".
In the below example we verifying home page by taking the title. We have written a method in BasePage and we are just calling it here.
'package com.pack.common.tests;

import org.openqa.selenium.WebDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import com.pack.base.TestBaseSetup;
import come.pack.common.pageobjects.BasePage;

public class BasePageTest extends TestBaseSetup{
 
 private WebDriver driver;
 
 @BeforeClass
 public void setUp() {
  driver=getDriver();
 }
 
 @Test
 public void verifyHomePage() {
  System.out.println("Home page test...");
  BasePage basePage = new BasePage(driver);
  Assert.assertTrue(basePage.verifyBasePageTitle(), "Home page title doesn't match");
 }

}
We will look into the next test 'SignInPageTest'. In the below test, we are verifying page title, page text, and Sign in functionality. For all these verifications we have defined methods in SignInPage class which we are calling from tests.
package com.pack.common.tests;

import org.openqa.selenium.WebDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import com.pack.base.TestBaseSetup;

import come.pack.common.pageobjects.BasePage;
import come.pack.common.pageobjects.SignInPage;

public class SignInPageTest extends TestBaseSetup{
private WebDriver driver;
private SignInPage signInPage;
private BasePage basePage;
 
 @BeforeClass
 public void setUp() {
  driver=getDriver();
 }
  
 @Test
 public void verifySignInFunction() {
  System.out.println("Sign In functionality details...");
  basePage = new BasePage(driver);
  signInPage = basePage.clickSignInBtn();
  Assert.assertTrue(signInPage.verifySignInPageTitle(), "Sign In page title doesn't match");
  Assert.assertTrue(signInPage.verifySignInPageText(), "Page text not matching");
  Assert.assertTrue(signInPage.verifySignIn(), "Unable to sign in");

 }

}
Now the create test 'CreateAnAccountTest'. Now we should be able to understand the verification that we are doing in the below test.
package com.pack.common.tests;

import org.openqa.selenium.WebDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import com.pack.base.TestBaseSetup;

import come.pack.common.pageobjects.BasePage;
import come.pack.common.pageobjects.CreateAccountPage;
import come.pack.common.pageobjects.SignInPage;

public class CreateAnAccounTest extends TestBaseSetup {
 private WebDriver driver;
 private SignInPage signInPage;
 private BasePage basePage;
 private CreateAccountPage createAccountPage;
  
  @BeforeClass
  public void setUp() {
   driver=getDriver();
  }
  
  @Test
  public void verifyCreateAnAccounPage() {
   System.out.println("Create An Account page test...");
   basePage = new BasePage(driver);
   signInPage = basePage.clickSignInBtn();
   createAccountPage = signInPage.clickonCreateAnAccount();
   Assert.assertTrue(createAccountPage.verifyPageTitle(), "Page title not matching");
   Assert.assertTrue(createAccountPage.verifyCreateAccountPageText(), "Page text not matching");
  }
  
  public void verifySignInFunction() {
   
  }

}
Step 4: We are done with Base Setup, Page Objects creation, Tests creation. Now we will execute them using 'testng.xml' file. We will add the classes which we want to test.
Remember we need to pass the parameters 'browserType' and 'appURL' for the base Setup class.
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Page Object test example">
<parameter name="appURL" value="https://www.google.co.in/"/>
<parameter name="browserType" value="firefox"/>
  <test name="sample test">
    <classes>
      <class name="com.pack.common.tests.HomePageTest"/>
      <class name="com.pack.common.tests.SignInPageTest"/>
      <class name="com.pack.common.tests.CreateAnAccounTest"/>
    </classes>
  </test>
</suite>
The above Page Object Model framework is the simple one without using any Build tools, Loggers, Listeners and Utilities. In the next coming post we will add all these things and design a Robust Page Object Model Framework which are used in the Industry.
The below are the list of things which are commonly used in the Real time Page Object Model Framework.
1. Selenium Webdriver with Java
2. Maven Build Tool
3. TestNG (We will user TestNG Listeners also)
4. Log4j
5. Eclipse IDE

Selenium Webdriver Methods With Examples

Selenium Webdriver Methods



Selenium WebDriver methods with Examples

1.Browser Back and Forward (NAVIGATION)

Steps to implement Browser back and forward through Selenium Web Driver
1. Create Driver for any Browser(Mozilla)
2. Go to the URL
3. Navigate to some page in website.
4. Use Selenium code to Navigate Back to Main Page.
CODE: driver.navigate().back();
           driver.navigate().forward();
Example

WebDriver driver =new FirefoxDriver();
driver.get("http://seleniumhq.org/");
driver.findElement(By.linkText("Download")).click();
Thread.sleep(3000);            //delay
driver.navigate().back();
driver.navigate().forward();
------------------------------------------------------------------------------------------------------------------------------

2.Handling DRAG and DROP


Steps to Handle Drag and Drop through Selenium Web Driver

1. Create Driver for any Browser(Mozilla)
2. Go to the URL
3. Create an Action object for Driver
4. Fetch and create WebElement object for the SOURCE element.
5. Fetch  and create WebElement object for the DESTINATION element.
6.Perform ACTION
  1.Click and Hold the source WebElement
  2.Move to destination WebElement
  3.Release the Element.

Example

WebDriver driver = new FirefoxDriver();
driver.get("http://www.ericbieller.com/examples/dragdrop/");
driver.manage().timeouts().implicitlyWait(3,TimeUnit.MINUTES);

Actions act = new Actions(driver);
WebElement src = driver.findElement(By.xpath("//div[@id='items']/div[1]"));
WebElement des = driver.findElement(By.id("trash"));

act.clickAndHold(src).build().perform();                //For each action we need to build and Perform
act.moveToElement(des).build().perform();
act.release(des).build().perform();
------------------------------------------------------------------------------------------------------------------------------

3.Making Single Select in Drop down (Option List)


Steps to make Single Select in Drop down through Selenium Web Driver.

1. Create Driver for any Browser(Mozilla)
2. Go to the URL
3. Fetch the Drop Down element and create an object as WebElement.
4. Create an Select object for the Drop Down Element object.
5. Create a List and collect all Options through Select Object.
6. Create a Iterator object for the List.
7. Get the size of the List.
8. Loop through and check for required element.

Example

WebElement element = driver.findElement(By.name("selectedCustomer"));
Select dd= new Select(element);
List allOptions= dd.getOptions();

//To go through the list, we can use an Iterator. 
//Iterator should be of the same type as the List
//which is WebElement in this case.

Iterator it = allOptions.iterator();
//Using while loop, we can iterate till the List has 
//a next WebElement [hasNext() is true]
//number of items in the list
System.out.println(allOptions.size());

while(it.hasNext()){
//When you say it.next(), it points to a particular
//WebElement in the List.
WebElement el = it.next();
 //Check for the required element by Text and click it
if(el.getText().equals("mango")){
  System.out.println(el.getAttribute("value"));
   el.click();
}
}

------------------------------------------------------------------------------------------------------------------------------

4.Making Single Select in Drop down (By INDEX, VALUE, TEXT)

Steps to make Single Select in Drop down through Selenium Web Driver.

1. Create Driver for any Browser(Mozilla)
2. Go to the URL
3. Fetch the Drop Down element and create an object as WebElement.
4. Convert the Drop Down Element in to Select object.
5. Select by INDEX
6. Select by VALUE
7. Select by VISIBLE TEXT

Example


WebElement customerdd = driver.findElement(By.name("customerProject.shownCustomer"));
//convert the element to select object
Select cust = new Select(customerdd);
cust.selectByIndex(1);                                       //Select by Index
Thread.sleep(3000);
cust.selectByValue("2");                                   //Select by Value
Thread.sleep(3000);
cust.selectByVisibleText("mango");                //Select by Visible Text
------------------------------------------------------------------------------------------------------------------------------


5.Multiple Select List Box Window

Steps to make Multiple Select in Drop down through Selenium Web Driver.

1. Create Driver for any Browser(Mozilla)
2. Go to the URL
3. Fetch the Drop Down element and create an object as WebElement.
4. Convert the Drop Down Element in to Select object.
5. Select by Index(Start index) 
6. Select by Index(End index)

Example


WebElement userdd = driver.findElement(By.name("users"));
Select usr = new Select(userdd);
usr.selectByIndex(0);                     //Select by Index(From Start location)
usr.selectByIndex(2);                     //Select by index(To End Location)

------------------------------------------------------------------------------------------------------------------------------


6.Multiple Select List Box Window - DESELECT

Steps to make Deselect in Drop down through Selenium Web Driver.

1. Create Driver for any Browser(Mozilla)
2. Go to the URL
3. Fetch the Drop Down element and create an object as WebElement.
4. Convert the Drop Down Element in to Select object.
5. Select by Index(Start index) 
6. Select by Index(End index)

Example

WebElement userdd = driver.findElement(By.name("users"));
Select usr = new Select(userdd);
usr.selectByIndex(0);
usr.selectByIndex(2);



//You can deselect the options
usr.deselectAll();                                          //Deselect ALL selected elements
//or
usr.deselectByIndex(0);                              //Deselect By using Index
//or
usr.deselectByValue(value);                       //Deselect By using Value
//or
usr.deselectByVisibleText(text);                 //Deselect By using Text

------------------------------------------------------------------------------------------------------------------------------


7.iFRAMES - How to handle Frames in Web Driver

Steps to get Source of each iFrame through Selenium Web Driver.

1. Create Driver for any Browser(Mozilla)
2. Go to the URL
3. Make a List containing FRAME web elements of a Web Page.
4. Get the Size of Frames.
5. Loop though and print the Source of each Frame

Example


/*times of india website - multiple frames*/

driver.get("http://timesofindia.indiatimes.com/");

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

List frms= driver.findElements(By.tagName("iframe"));  //Frame List

System.out.println(frms.size());
for(int i=0;i
{
System.out.println(frms.get(i).getAttribute("src"));
}
------------------------------------------------------------------------------------------------------------------------------


8.iFRAMES - How to perform action in Frames

Steps to perform Action in iFrame through Selenium Web Driver.

1. Create Driver for any Browser(Mozilla)
2. Go to the URL
3. Fetch iFrame element and create an Web Element object.
4. Using iFrame Web Element object, switch to IFrame.
5. Perform SendKeys/ Click action in iFrame.

Example


WebElement ifr = driver.findElement(By.xpath("//iframe[@src='/poll.cms']"));
driver.switchTo().frame(ifr);                                     //Switch to iFrame
driver.findElement(By.id("mathuserans2")).sendKeys("8");  //Perform Action in iFrame

------------------------------------------------------------------------------------------------------------------------------

9.iFRAMES - How to switch to a perticular Frame through index

Steps to switch to perticular iFrame by index through Selenium Web Driver.


1. Create Driver for any Browser(Mozilla)
2. Go to the URL
3. Make a List containing FRAME web elements of a Web Page.
4. Get the Size of Frames.
5. Switch to required iFrame through index.


Example

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

List frms= driver.findElements(By.tagName("iframe"));

System.out.println(frms.size());
driver.switchTo().frame(0);
driver.findElement(By.id("clicktripad")).click();

------------------------------------------------------------------------------------------------------------------------------


10. TABS / New Window


When Browser opens in a new window or in a new tab, Web Driver cannot shift the control to the new Window/ Tab. We need to collect the window handles in a page. Whenever a new window opens we need to iterate and shift to the latest window handle.

TABS/New Window - 1

Steps to iterate through the Window Handles

1. Create Driver for any Browser(Mozilla)
2. Go to the URL
3. Collect Window Handles through Set
4. Create an iterator to iterate through Window Handles.
5. At First iterator will not be pointing to any Window Handle, only First increment Points to First Window Handle, Second increment Points to second iterator.


Set windowHandles = driver.getWindowHandles();
Iterator it = windowHandles.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
------------------------------------------------------------------------------------------------------------------------------

TABS/New Window - 2

When two browsers are opened and Web Driver need to shift the control from Parent Window to Child Window. 

Please follow the steps mentioned below.


1. Create Driver for any Browser(Mozilla)
2. Go to the URL
3. Collect Window Handles through Set
4. Create an iterator to iterate through Window Handles.
5. Increment the iterator and store the Window Handle as Parent.
6. Increment the iterator and store next Window Handle as Child.
7. Switch to Child Browser using Child Window Handle.


Set windowHandles = driver.getWindowHandles();
Iterator it = windowHandles.iterator();


String parentBrowser= it.next();
String childBrowser = it.next();
driver.switchTo().window(childBrowser);

------------------------------------------------------------------------------------------------------------------------------


TABS/New Window - 3

When second browser is closed/you close it and Web Driver need to shift the control from Child Window to Parent Window. 

Please follow the steps mentioned below.


1. Create Driver for any Browser(Mozilla)
2. Go to the URL
3. Collect Window Handles through Set
4. Create an iterator to iterate through Window Handles.
5. Increment the iterator and store the Window Handle as Parent.
6. Increment the iterator and store next Window Handle as Child.
7. Switch to Child Browser using Child Window Handle.
8. When Child browser get closed, Switch from Child browser to Parent Window.


Set windowHandles = driver.getWindowHandles();
Iterator it = windowHandles.iterator();

String parentBrowser= it.next();
String childBrowser = it.next();
driver.switchTo().window(childBrowser);
Thread.sleep(3000);

driver.close(); //close the current window(Child Browser)
driver.switchTo().window(parentBrowser); //Switch to Parent Browser


------------------------------------------------------------------------------------------------------------------------------

11. CALENDAR popups

Calendar PopUp - 1

Normal Calender(current month) Popup can be handled in the following way.

1. Create Driver for any Browser(Mozilla)
2. Go to the URL
3. Fetch the Calender element and click to open.
4. Fetch the required date through xpath and click.


/*IRCTC calendar*/
driver.findElement(By.id("calendar_icon1")).click();
driver.findElement(By.xpath("//div[@id='CalendarControl']/table[tbody[tr[td[text()='October 2012']]]]/descendant::a[text()='5']")).click();

------------------------------------------------------------------------------------------------------------------------------

Calendar PopUp - 2 (Customized wait)

 In a Calender if we want to click on future month which is not currently displayed, we need to click on next link until we get the required month.
           This can be done by writing Customized wait. Check for particular date element in each month, if not found move to next month.

/*makemytrip calendar*/

driver.get("http://www.makemytrip.com/");
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.findElement(By.id("deptDateRtripimgExact")).click(); //find Calendar
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
boolean flag=true;
while(flag){
  try {
WebElement el = driver.findElement(By.xpath("//div[contains(@class,'ui-datepicker-group') and descendant::span[text()='March']]/descendant::a[text()='5']")); // Required future date
if(el !=null)   //Check if the required date element is found or not
       {
el.click(); // if required Date is found, then click  the date
flag=false;
}
    } 
catch (Exception e) { //Catches exception if no element found
try {
Thread.sleep(500);
driver.findElement(By.xpath("//a[@title='Next']")).click(); //Click on next month
}
catch (InterruptedException e1) 
      {
// TODO Auto-generated catch block
 e1.printStackTrace();
      }
  }

------------------------------------------------------------------------------------------------------------------------------


12. Drop Down MENU



 In order to click on an menu item, first we need to move the mouse over Parent menu, later we can click on any of the Menu child item.

Please follow the steps mentioned below.


1. Create Driver for any Browser(Mozilla)
2. Go to the URL
3. Fetch the MENU Parent element and create a WebElement object.
4. Create an Action object for Driver
5. Through Action object, move to Parent element.
6. Give a Delay for menu items to be displayed.
7. Fetch the Child item through xpath and Click on it.


WebElement parentMenu = driver.findElement(By.linkText("Tourist Trains"));
Actions act = new Actions(driver); // Create an Action object
//move to the parent menu item
act.moveToElement(parentMenu).build().perform(); 
Thread.sleep(3000);   //wait till the child items are displayed
driver.findElement(By.linkText("Bharat Tirth")).click();

------------------------------------------------------------------------------------------------------------------------------


13. Context Click (Right Click)

We can use keyboard keys to Make a Right Click.

Please follow the steps mentioned below.


1. Create Driver for any Browser(Mozilla).
2. Go to the URL.
3. Fetch the MENU Parent element and create a WebElement object.
4. Create an Action Object for Driver.
5. Through Action Object, make a Context Click on Menu Parent object.
6. Through Action Object, send keys for ARROW_DOWN/ARROW_UP/Keys.ENTER.


Example

WebElement parentMenu = driver.findElement(By.linkText("Tourist Trains"));

Actions act = new Actions(driver); //Create Action object for Driver

act.contextClick(parentMenu).build().perform(); //Context Click

act.sendKeys(Keys.ARROW_RIGHT).build().perform();
Thread.sleep(1000);
act.sendKeys(Keys.ARROW_DOWN).build().perform();
Thread.sleep(1000);
act.sendKeys(Keys.ENTER).build().perform();

------------------------------------------------------------------------------------------------------------------------------


14. JAVA SCRIPT example

We can use java script command to perform actions.
We can write code to fill up the text box through java script.

Please follow the steps mentioned below.

1. Create Driver for any Browser(Mozilla).
2. Go to the URL.
3. Create Java Script executor object for the Driver.
4. Store the Java Script command in a String Variable.
5. Java Script Executor object executes the command in the Variable.



JavascriptExecutor js = (JavascriptExecutor) driver;
String jsCmd = "document.getElementsByName('city')[0].value='ban'";
js.executeScript(jsCmd);

------------------------------------------------------------------------------------------------------------------------------

15. Multiple Elements

We can count the number of links present in the page. We can also print the link text of each Web link.


Please follow the steps mentioned below.

1. Create Driver for any Browser(Mozilla).
2. Go to the URL.
3. Fetch elements with tag //a in the entire page, store it in a List.
4. Get the count of Links present in the Page.
5. Loop through the links and print the Attributes 


List allLinks= driver.findElements(By.xpath("//a"));
//display the count of links in the page
System.out.println(allLinks.size());
//display the text for each link on the page
for(int i=0;i
{
        //display href for each link
System.out.println(allLinks.get(i).getAttribute("href"));
//display text for each link
System.out.println(allLinks.get(i).getText());
//perform click action
allLinks.get(i).click();

}

------------------------------------------------------------------------------------------------------------------------------

16. Other Browser (Internet Explorer)


Using Internet Explorer with Web Driver.

Please follow the steps mentioned below.
1. Set System Property for the Driver and give path of the IE Driver.
2. Create an Web Driver Object.
3. Open an URL


System.setProperty("webdriver.ie.driver", "D:\\sel\\browserdrivers\\IEDriverServer.exe");


WebDriver driver =new InternetExplorerDriver();
driver.get("www.google.com");

------------------------------------------------------------------------------------------------------------------------------


17. Other Browser (Chrome)


Using Chrome with Web Driver.

Please follow the steps mentioned below.

1. Set System Property for the Driver and give path of the Chrome Driver.
2. Create an Web Driver Object.
3. Open an URL



System.setProperty("webdriver.chrome.driver", "D:\\sel\\browserdrivers\\Chromedriver.exe");

WebDriver driver = new ChromeDriver();
driver.get("www.google.com");

------------------------------------------------------------------------------------------------------------------------------


18. PROXY settings.

Please follow the steps mentioned below.

1. Import Selenium.Proxy
2. Create a Profile object for Firefox
3. Create a string variable with value.
4. Create a Proxy object.
5. Set the values through proxy.
6. Set the proxy preference to proxy object using profile object.
7. Pass the profile object to Firefox Driver.



import org.openqa.Selenium.Proxy

FirefoxProfile profile = new FirefoxProfile();
String PROXY = "xx.xx.xx.xx:xx";
Proxy proxy = new Proxy();
proxy.HttpProxy=PROXY;
proxy.FtpProxy=PROXY;
proxy.SslProxy=PROXY;
profile.SetProxyPreferences(proxy);
FirefoxDriver driver = new FirefoxDriver(profile);



------------------------------------------------------------------------------------------------------------------------------

19. Page Onload authentication

Sometimes when you are Automating Web pages, you may come across Page onload Authentication window. This window is not java popup/div. It is windows popup. Selenium directly cannot handle this windows popup.
Hence we use Autoit sowftware tool. Through Selenium we can handle this situation using Autoit.

Please follow the steps mentioned below.

1.Download Autoit from the following URl
  ( http://www.autoitscript.com/site/autoit/downloads/ )
2.Install downloaded software.
3. Open Script Editor
   Start=>ProgramFiles=>AutoIt =>SciTE Script Editor.
4.Open Object Identifier.
  Start=>ProgramFiles=>AutoIt =>AutoIt Window Info.
5.Drag and Drop finder tool in AutoIt Window Info, to the Window you need to     identify.
6.Collect the Title Name of window from (AutoIt Window Info.)
7.Write the Script in the Editor.
----------------------------------------------------AUTOIT CODE-----------------------------------------------------

WinWaitActive("Authentication Required")
Send("admin")
Send("{TAB} admin{TAB} {ENTER}")

------------------------------------------------------------------------------------------------------------------------------
8.Save the file as default save.(Authentication1.exe)
9.RUN/Compile the SCRIPT, it creates an exe.
10.Mention the exe path in the Program before creation of Driver.

EXAMPLE:


Process P = Runtime.getRuntime().exec("D:\\java_prj\\SELENIUM WEBDRIVER\\AUTOIT\\Authentication1.exe");
WebDriver driver = new FirefoxDriver();
driver.get("http://192.168.1.1");

------------------------------------------------------------------------------------------------------------------------------

20. File Download

Please follow the steps mentioned below.


1. Create a PROFILE object of Browser.
2. Set Preference, by giving Download destination Directory.
3. Set Preference, by giving Default Folder. 0 => Desktop, 1=>System Default Location, 2 => Indicates a custom Folder Location
4. Set Preference, A comma-separated list of MIME types to save to disk without asking what to use to open the file. Default value is an empty string.

After coding the above mentioned steps, now start the driver and click on Download button/link.
1. Create Driver for any Browser(Mozilla).
2. Go to the URL.
3. Fetch the Download web element and click.


FirefoxProfile Prof = new FirefoxProfile();
Prof.setPreference("browser.download.dir", "D:\\java prj");
Prof.setPreference("browser.download.folderList", 2);
Prof.setPreference("browser.helperApps.neverAsk.saveToDisk","application/zip");

WebDriver driver = new FirefoxDriver(Prof);
driver.get("http://seleniumhq.org/download/");
driver.manage().timeouts().implicitlyWait(3,TimeUnit.MINUTES);
driver.findElement(By.xpath("//a[@name='client-drivers']/table/tbody/tr[1]/td[4]/a")).click();

------------------------------------------------------------------------------------------------------------------------------

21. File Upload

Please follow the steps mentioned below.


1. Create Driver for any Browser(Mozilla).
2. Go to the URL.
3. Store the Source path of file in a variable.
4. Fetch the Upload web element text box and give path using variable.
5. Fetch the upload button and click


WebDriver driver = new FirefoxDriver();
driver.get("http://www.2shared.com/");
String FilePath = "C:\\Users\\abc\\Desktop\\test.xml";
driver.findElement(By.id("upField")).sendKeys(FilePath);
driver.findElement(By.xpath("//input[@type='image']")).click();
------------------------------------------------------------------------------------------------------------------------------


22. Handling JAVA ALERT

Sometimes you may get alerts as anticipated(through Insert/update/delete operation in database). These may be JAVA alerts.
Please follow the steps mentioned below to handle  Alerts.


1. Create Driver for any Browser(Mozilla).
2. Go to the URL.
3. You get an alert asking to click on 'YES' or 'NO' button.
4. First Confirm if it is JAVA alert window.
5. Write a code to switch the control to Alert window.
6. In the Alert window, either ACCEPT by clicking on 'YES'
    or CANCEL by clicking on 'NO'.


WebDriver driver = new FirefoxDriver();
driver.get("http://www.2shared.com/");
driver.manage().timeouts().implicitlyWait(3,TimeUnit.MINUTES);

Alert alert = driver.switchTo().alert();
alert.accept();
//or
alert.dismiss();