Implementation of Page Object Model in Playwright

  

What is Page Object Model (POM)?

POM is a design pattern in test automation where each web page (or component) is represented by a corresponding Java class containing all the locators and methods that interact with the page.












1. Maven Dependencies


<dependencies>
    <!-- Playwright -->
    <dependency>
        <groupId>com.microsoft.playwright</groupId>
        <artifactId>playwright</artifactId>
        <version>1.44.0</version>
    </dependency>

    <!-- Cucumber -->
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>7.16.1</version>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-testng</artifactId>
        <version>7.16.1</version>
    </dependency>

    <!-- TestNG -->
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>7.9.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>





2. Feature File (login.feature)


Feature: Login Feature

  Scenario: Successful Login
    Given User is on login page
    When User enters username "admin" and password "admin123"
    Then User should see the dashboard page





3. PlaywrightFactory.java (Utility to manage Playwright setup)


package utils;

import com.microsoft.playwright.*;

public class PlaywrightFactory {
    private static Playwright playwright;
    private static Browser browser;
    private static BrowserContext context;
    private static Page page;

    public static void initBrowser() {
        playwright = Playwright.create();
        browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false));
        context = browser.newContext();
        page = context.newPage();
    }

    public static Page getPage() {
        return page;
    }

    public static void closeBrowser() {
        browser.close();
        playwright.close();
    }
}






4. LoginPage.java (Page Object Model)


package pages;

import com.microsoft.playwright.Page;

public class LoginPage {
    private Page page;

    // Locators
    private String usernameField = "#username";
    private String passwordField = "#password";
    private String loginButton = "#loginBtn";
    private String dashboardText = "#dashboard";

    // Constructor
    public LoginPage(Page page) {
        this.page = page;
    }

    public void navigateToLoginPage() {
        page.navigate("https://example.com/login");
    }

    public void enterUsername(String username) {
        page.fill(usernameField, username);
    }

    public void enterPassword(String password) {
        page.fill(passwordField, password);
    }

    public void clickLogin() {
        page.click(loginButton);
    }

    public boolean isDashboardVisible() {
        return page.isVisible(dashboardText);
    }
}






5. LoginSteps.java (Step Definitions)


package stepdefinitions;

import com.microsoft.playwright.Page;
import io.cucumber.java.After;
import io.cucumber.java.Before;
import io.cucumber.java.en.*;
import pages.LoginPage;
import utils.PlaywrightFactory;
import org.testng.Assert;

public class LoginSteps {
    private Page page;
    private LoginPage loginPage;

    @Before
    public void setup() {
        PlaywrightFactory.initBrowser();
        page = PlaywrightFactory.getPage();
        loginPage = new LoginPage(page);
    }

    @Given("User is on login page")
    public void user_is_on_login_page() {
        loginPage.navigateToLoginPage();
    }

    @When("User enters username {string} and password {string}")
    public void user_enters_username_and_password(String username, String password) {
        loginPage.enterUsername(username);
        loginPage.enterPassword(password);
        loginPage.clickLogin();
    }

    @Then("User should see the dashboard page")
    public void user_should_see_the_dashboard_page() {
        Assert.assertTrue(loginPage.isDashboardVisible(), "Dashboard is not visible");
    }

    @After
    public void tearDown() {
        PlaywrightFactory.closeBrowser();
    }
}





6. TestRunner.java (TestNG + Cucumber Runner)


package testrunners;

import io.cucumber.testng.AbstractTestNGCucumberTests;
import io.cucumber.testng.CucumberOptions;

@CucumberOptions(
    features = "src/test/java/features",
    glue = {"stepdefinitions"},
    plugin = {"pretty", "html:target/cucumber-report.html"},
    monochrome = true
)
public class TestRunner extends AbstractTestNGCucumberTests {
}






7. TestNG XML (Optional - if running via TestNG suite)


<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="Cucumber with TestNG">
    <test name="CucumberTests">
        <classes>
            <class name="testrunners.TestRunner" />
        </classes>
    </test>
</suite>

No comments:

Post a Comment