Page Object Model and Page Factory in Selenium

July 2024 ยท 7 minute read

Page Object Model and Page Factory are tools in Selenium that are popularly used in test automation. This tutorial will demonstrate how to use Page Object Model and Page Factory in Selenium automation projects to maintain test cases easily.

What is Page Object Model in Selenium?

Page Object Model, also known as POM, is a design pattern in Selenium that creates an object repository for storing all web elements. It helps reduce code duplication and improves test case maintenance.

In Page Object Model, consider each web page of an application as a class file. Each class file will contain only corresponding web page elements. Using these elements, testers can perform operations on the website under test.

Advantages of Page Object Model

Implementing POM in Selenium Project

As already discussed, each java class will contain a corresponding page file. This tutorial will create 2-page files.

Each of these files will contain UI elements or Objects which are present on these screens. It will also contain the operations to be performed on these elements.

Sample Project Structure for POM

page object model in selenium

BrowserStackHomePage Java File

POM in selenium - Java File
Explanation of Code

Code Snippet

package browserStackPages; import static org.testng.Assert.assertEquals; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class BrowserStackHomePage { WebDriver driver; By Header=By.xpath("//h1"); By getStarted=By.xpath("//*[@id='signupModalButton']"); public BrowserStackHomePage(WebDriver driver) { this.driver=driver; } public void veryHeader() { String getheadertext=driver.findElement(Header).getText(); assertEquals("App & Browser Testing Made Easy", getheadertext); } public void clickOnGetStarted() { driver.findElement(getStarted).click(); } }

BrowserStackSignUpPage Java File

pom in selenium

Explanation of Code

Code Snippet

package browserStackPages; import static org.testng.Assert.assertEquals; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class BrowserStackSignUpPage { WebDriver driver; By Header = By.xpath("//h1"); By userName = By.xpath("//*[@id='user_full_name']"); By businessEmail = By.xpath("//*[@id='user_email_login']"); By password = By.xpath("//*[@id='user_password']"); public BrowserStackSignUpPage(WebDriver driver) { this.driver = driver; } public void veryHeader() { String getheadertext = driver.findElement(Header).getText().trim(); assertEquals("Create a FREE Account", getheadertext); } public void enterFullName(String arg1) { driver.findElement(userName).sendKeys(arg1); } public void enterBusinessEmail(String arg1) { driver.findElement(businessEmail).sendKeys(arg1); } public void enterPasswrod(String arg1) { driver.findElement(password).sendKeys(arg1); } }

BrowserStackSetup Java File

pom in selenium

Explanation of Code

Code Snippet

package browserStackSetup; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import browserStackPages.BrowserStackHomePage; import browserStackPages.BrowserStackSignUpPage; public class BrowserStackSetup { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; BrowserStackHomePage objBrowserStackHomePage; BrowserStackSignUpPage objBrowserStackSignUpPage; @BeforeTest public void setup() { System.setProperty("webdriver.chrome.driver", "C:\\BrowserStack\\chromedriver.exe"); driver = new ChromeDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://www.browserstack.com/"); } @Test(priority = 1) public void navigate_to_homepage_click_on_getstarted() { objBrowserStackHomePage = new BrowserStackHomePage(driver); objBrowserStackHomePage.veryHeader(); objBrowserStackHomePage.clickOnGetStarted(); } @Test(priority = 2) public void enter_userDetails() { objBrowserStackSignUpPage = new BrowserStackSignUpPage(driver); objBrowserStackSignUpPage.veryHeader(); objBrowserStackSignUpPage.enterFullName("TestUser"); objBrowserStackSignUpPage.enterBusinessEmail("TestUser@gmail.com"); objBrowserStackSignUpPage.enterPasswrod("TestUserPassword"); } }

Run Selenium Tests

What is Page Factory in Selenium?

Page Factory is a class provided by Selenium WebDriver to support Page Object Design patterns. In Page Factory, testers use @FindBy annotation. The initElements method is used to initialize web elements.

Implementing Page Factory in Selenium Project

This will try to use the same project used for the POM Model. It will reuse the 2-page files and implement Page Factory.

As discussed earlier, each of these files will only contain UI elements or Objects present on these screens along with the operations to be performed on these elements.

Sample Project Structure for Page Factory

The project structure will not change as the same project is being used. As already mentioned, Page Factory supports Page Object Model design pattern.

page factory in selenium

BrowserStackHomePage Java File

page factory in selenium - java file

Explanation of Code

Code Snippet

package browserStackPages; import static org.testng.Assert.assertEquals; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class BrowserStackHomePage { WebDriver driver; @FindBy(xpath = "//h1") WebElement Header; @FindBy(xpath = "//*[@id='signupModalButton']") WebElement getStarted; public BrowserStackHomePage(WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); } public void veryHeader() { String getheadertext = Header.getText(); assertEquals("App & Browser Testing Made Easy", getheadertext); } public void clickOnGetStarted() { getStarted.click(); } }

BrowserStackSignUpPage Java File

page factory in selenium - Sign up page

Explanation of Code

Code Snippet

package browserStackPages; import static org.testng.Assert.assertEquals; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class BrowserStackSignUpPage { WebDriver driver; @FindBy(xpath = "//h1") WebElement Header; @FindBy(xpath = "//*[@id='user_full_name']") WebElement userName; @FindBy(xpath = "//*[@id='user_email_login']") WebElement businessEmail; @FindBy(xpath = "//*[@id='user_password']") WebElement password; public BrowserStackSignUpPage(WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); } public void veryHeader() { String getheadertext = Header.getText().trim(); assertEquals("Create a FREE Account", getheadertext); } public void enterFullName(String arg1) { userName.sendKeys(arg1); } public void enterBusinessEmail(String arg1) { businessEmail.sendKeys(arg1); } public void enterPasswrod(String arg1) { password.sendKeys(arg1); } }

BrowserStackSetup Java File

page factory in selenium - sample project
Explanation of Code

Code Snippet

package browserStackSetup; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import browserStackPages.BrowserStackHomePage; import browserStackPages.BrowserStackSignUpPage; public class BrowserStackSetup { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; BrowserStackHomePage objBrowserStackHomePage; BrowserStackSignUpPage objBrowserStackSignUpPage; @BeforeTest public void setup() { System.setProperty("webdriver.chrome.driver", "C:\\BrowserStack\\chromedriver.exe"); driver = new ChromeDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://www.browserstack.com/"); } @Test(priority = 1) public void navigate_to_homepage_click_on_getstarted() { objBrowserStackHomePage = new BrowserStackHomePage(driver); objBrowserStackHomePage.veryHeader(); objBrowserStackHomePage.clickOnGetStarted(); } @Test(priority = 2) public void enter_userDetails() { objBrowserStackSignUpPage = new BrowserStackSignUpPage(driver); objBrowserStackSignUpPage.veryHeader(); objBrowserStackSignUpPage.enterFullName("TestUser"); objBrowserStackSignUpPage.enterBusinessEmail("TestUser@gmail.com"); objBrowserStackSignUpPage.enterPasswrod("TestUserPassword"); } }

Test Result

page object model with pagefactory in selenium

Try Selenium Testing on a Real Device Cloud

Difference between Page Object Model & Page Factory in Selenium

Page Object ModelPage Factory
Finding web elements using ByFinding web elements using @FindBy
POM does not provide lazy initializationPage Factory does provide lazy initialization
Page Object Model is a design patternPageFactory is a class that implements the Page Object Model design pattern.
In POM, one needs to initialize every page object individuallyIn PageFactory, all page objects are initialized by using the initElements() method

Run the code to test the workings of the Page Object Model (POM) and Page Factory. Since these are important Selenium functions, testers need to be able to use them with ease and accuracy for Selenium automation. This will help them streamline automation testing efforts and get results quicker.

ncG1vNJzZmivp6x7o77OsKqeqqOprqS3jZympmeXqralsY6pmKCdXaSvq7HCrWSmp5SauW61zWaqnqSVo7a2uQ%3D%3D