category-iconOTHERS

PageFactory vs. Page Object Model (POM): Key Differences in Selenium Automation

16 Aug 2025070

Understanding the difference between PageFactory and the Page Object Model (POM) is essential for building maintainable and efficient automated test frameworks. Here's a concise comparison to guide your decision-making.


Page Object Model (POM)

POM is a widely adopted design pattern in test automation that promotes clean code architecture and reusability:

  • Creates an Object Repository for web UI elements to minimize code duplication.
  • Each web page is represented by a dedicated Page Class containing methods that interact with its WebElements.
  • Clearly separates UI operations from verification logic, improving readability and maintainability.
  • Encourages method reuse and assigns intuitive names to actions, making test scripts easier to understand and map to UI behavior.


PageFactory in Selenium


PageFactory is a Selenium WebDriver feature that simplifies the initialization of Page Objects:

  • Built on top of POM, it uses annotations like @FindBy to locate elements without explicitly calling findElement().
  • Supports various locator strategies: id, name, xpath, css, className, tagName, linkText, and partialLinkText.
  • Automatically initializes WebElements when the Page Object is instantiated.


Limitations of PageFactory

Despite its convenience, PageFactory has notable drawbacks that have led Selenium contributors to discourage its use:

  • No element caching by default: Each interaction re-fetches the element, which can degrade performance.
  • The optional @CacheLookup annotation can cause StaleElementReferenceException if the DOM updates, making cached elements invalid.
  • Considered cumbersome and error-prone, offering little advantage over direct element location in runtime code.

 

Code Examples

Page Object Model Example


public class LoginPage {

private WebDriver driver;

// Constructor

public LoginPage(WebDriver driver) {

this.driver = driver;

}

// Locators

private By username = By.id("username");

private By password = By.id("password");

private By loginButton = By.id("login");

// Methods

public void enterUsername(String user) {

driver.findElement(username).sendKeys(user);

}

public void enterPassword(String pass) {

driver.findElement(password).sendKeys(pass);

}

public void clickLogin() {

driver.findElement(loginButton).click();

}

}


 

PageFactory Example


public class LoginPage {

@FindBy(id = "username")

WebElement username;

@FindBy(id = "password")

WebElement password;

@FindBy(id = "login")

WebElement loginButton;

// Constructor

public LoginPage(WebDriver driver) {

PageFactory.initElements(driver, this);

}

// Methods

public void enterUsername(String user) {

username.sendKeys(user);

}

public void enterPassword(String pass) {

password.sendKeys(pass);

}

public void clickLogin() {

loginButton.click();

}

}


seleniumpompageobjectmodelpagefactoryseleniumautomation