Handling Page Elements with Page Object Model in TestNG

In the world of automated testing, maintaining readability, reusability, and scalability is crucial for managing complex test cases. One of the most effective design patterns that address these needs is the Page Object Model (POM). This pattern not only improves code organization but also simplifies interactions with web elements. In this blog post, we will explore how to implement the Page Object Model in TestNG for handling page elements effectively.

What is the Page Object Model?

The Page Object Model is a design pattern that encapsulates the elements of a web page and their behaviors into a separate class known as the Page Object. Each page of the application has its corresponding Page Object class, which contains methods that represent actions that can be performed on that page. This separation of concerns allows for a cleaner, more maintainable codebase.

Benefits of Using POM

  1. Improved Maintainability: Changes in the UI only require updates in one place (the page class), rather than throughout all the test scripts.
  2. Reusability: Common actions and elements can be reused across different test cases.
  3. Enhanced Readability: Test scripts become more readable, making it easier for team members to understand the test flow.
  4. Reduced Code Duplication: By centralizing element locators and actions, you reduce redundancy in your test scripts.

Setting Up a TestNG Project with POM

Step 1: Create the Project Structure

Let’s create a basic structure for our TestNG project:

/YourProject

    ├── /src

    │   ├── /main

    │   └── /test

    │       ├── /java

    │       │   ├── /pages

    │       │   ├── /tests

    │       │   └── /utils

    │       └── /resources

    └── pom.xml

Step 2: Add Dependencies

Add the necessary dependencies to your pom.xml file:

<dependencies>

    <!-- Selenium Java -->

    <dependency>

        <groupId>org.seleniumhq.selenium</groupId>

        <artifactId>selenium-java</artifactId>

        <version>4.x.x</version>

    </dependency>

    <!-- TestNG -->

    <dependency>

        <groupId>org.testng</groupId>

        <artifactId>testng</artifactId>

        <version>7.x.x</version>

        <scope>test</scope>

    </dependency>

</dependencies>

Step 3: Create a Page Object Class

Let’s create a simple login page object class that contains methods for interacting with login elements.

package pages;


import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.support.FindBy;

import org.openqa.selenium.support.PageFactory;


public class LoginPage {

    WebDriver driver;


    @FindBy(id = "username")

    WebElement usernameField;


    @FindBy(id = "password")

    WebElement passwordField;


    @FindBy(id = "loginButton")

    WebElement loginButton;


    public LoginPage(WebDriver driver) {

        this.driver = driver;

        PageFactory.initElements(driver, this);

    }


    public void enterUsername(String username) {

        usernameField.sendKeys(username);

    }


    public void enterPassword(String password) {

        passwordField.sendKeys(password);

    }


    public void clickLogin() {

        loginButton.click();

    }

}

Step 4: Create a Test Class

Now, let’s create a test class that utilizes the LoginPage class.

package tests;


import org.openqa.selenium.WebDriver;

import org.openqa.selenium.chrome.ChromeDriver;

import org.testng.annotations.AfterClass;

import org.testng.annotations.BeforeClass;

import org.testng.annotations.Test;

import pages.LoginPage;


public class LoginTest {

    WebDriver driver;

    LoginPage loginPage;


    @BeforeClass

    public void setUp() {

        // Set up the Chrome driver and initialize the LoginPage

        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");

        driver = new ChromeDriver();

        driver.get("http://example.com/login");

        loginPage = new LoginPage(driver);

    }


    @Test

    public void testLogin() {

        loginPage.enterUsername("testuser");

        loginPage.enterPassword("password");

        loginPage.clickLogin();

        

        // Add assertions to verify successful login

    }


    @AfterClass

    public void tearDown() {

        driver.quit();

    }

}

Step 5: Run Your Tests

You can run your tests using your favorite IDE or via the command line with Maven:

mvn clean test


Followers