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