Object Repository in Selenium Using Page Factory With Inner Class – Handling a Page Which Has Many Webelements

Hello Folks,

You must have seen a web page which contains many divisions or multiple web elements and similar web elements in multiple divisions. Creating a web element repository for such pages is difficult in some cases which are given below:

  • If you have many web elements in a page, Selecting desired web elements while using is difficult. As soon as you type connector (dot (.) ) operator , it will list all the web elements present in that page and you need to search from them. However this can be made simpler using Naming Convention approach.
  • If you have common web elements in multiple division of same web page, you need to provide proper differentiation in names so that anyone can easily identify desired one.

 

We can resolve above issues using inner class concept of Java. We can divide each section as a static inner class. It will also initialise only particular section web elements instead of all web elements of page.

Sample code:

package PageObjectModelWithInnerClass;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;



public class Page_Login {
	

    // Create an account section	
	public static class createAnAccount
	{
		// Initializing only createAnAccount members
		public  static createAnAccount getcreateAnAccount(WebDriver driver) {
			return PageFactory.initElements(driver, createAnAccount.class);
		}
		
		@FindBy(id="email_create")
		public  WebElement txt_emailAddress;
		
		
		@FindBy(id="SubmitCreate")
		public  WebElement btn_createAccount;
		
		@FindBy(xpath="//h3[text()='Create an account']")
		public  WebElement lbl_createAnAccount;
		
		@FindBy(xpath="//p[text()='Please enter your email address to create an account.']")
		public  WebElement lbl_createAnAccountDesc;
		
		
	}
	
	// Already registered section
	public static class alreadyRegistered
	{
		
		// Initializing only createAnAccount members
		public  static alreadyRegistered getalreadyRegistered(WebDriver driver) {
			return PageFactory.initElements(driver, alreadyRegistered.class);
		}
		
		
		@FindBy(id="email")
		public static WebElement txt_emailAddress;
		
		
		@FindBy(id="passwd")
		public static WebElement txt_password;
		
		
		@FindBy(id="SubmitLogin")
		public static WebElement btn_login;
		
		@FindBy(xpath="//h3[text()='Create an account']//a[text()='Forgot your password?']")
		public static WebElement lnk_forgotPassword;
		
				
		
	}
}

In Test script class, you just need to access required inner class as below:

package PageObjectModelWithInnerClass;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class CreateAnAccount {
	
	public static void main(String[] args) {
		
		System.setProperty("webdriver.chrome.driver","./exefiles/chromedriver.exe");
		WebDriver driver= new ChromeDriver();
		driver.manage().window().maximize();
		driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
		driver.get("http://automationpractice.com/index.php?controller=authentication&back=my-account");
		
		// Access inner class directly by its name as I have declared it as static 
		Page_Login.createAnAccount.getcreateAnAccount(driver).txt_emailAddress.sendKeys("mse@gmail.com");
		
		
		
		
	}

}

Hope this will be helpful for you to create an object repository for a page which has multiple divisions and web elements.

If you have any doubt, feel free to comment below.
If you like my posts, please like, comment, share and subscribe.
#ThanksForReading
#HappySelenium

2 thoughts on “Object Repository in Selenium Using Page Factory With Inner Class – Handling a Page Which Has Many Webelements

Leave a Reply to bibhuti jha Cancel reply

Your email address will not be published. Required fields are marked *