Page Object Model
POM keeps locators and page actions in dedicated classes, keeping tests clean.
LoginPage.java
java
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 {
private final WebDriver driver;
@FindBy(id = "username")
private WebElement usernameInput;
@FindBy(id = "password")
private WebElement passwordInput;
@FindBy(css = "button[type='submit']")
private WebElement loginButton;
@FindBy(id = "error-message")
private WebElement errorMessage;
public LoginPage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
public void login(String username, String password) {
usernameInput.clear();
usernameInput.sendKeys(username);
passwordInput.clear();
passwordInput.sendKeys(password);
loginButton.click();
}
public String getErrorMessage() {
return errorMessage.getText();
}
}LoginTest.java
java
public class LoginTest extends BaseTest {
@Test
public void loginWithValidCredentials() {
LoginPage loginPage = new LoginPage(driver);
loginPage.login("[email protected]", "password123");
DashboardPage dashboard = new DashboardPage(driver);
Assert.assertTrue(dashboard.isDisplayed());
}
@Test
public void loginWithInvalidPassword() {
LoginPage loginPage = new LoginPage(driver);
loginPage.login("[email protected]", "wrong");
Assert.assertEquals(loginPage.getErrorMessage(), "Invalid credentials");
}
}