# Selenium — Page Object Model ## Base Page Class ```java public abstract class BasePage { protected WebDriver driver; protected WebDriverWait wait; public BasePage(WebDriver driver) { this.driver = driver; this.wait = new WebDriverWait(driver, Duration.ofSeconds(10)); } protected WebElement waitForVisible(By locator) { return wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); } protected WebElement waitForClickable(By locator) { return wait.until(ExpectedConditions.elementToBeClickable(locator)); } protected void type(By locator, String text) { WebElement el = waitForVisible(locator); el.clear(); el.sendKeys(text); } protected void click(By locator) { waitForClickable(locator).click(); } protected String getText(By locator) { return waitForVisible(locator).getText(); } protected boolean isDisplayed(By locator) { try { return waitForVisible(locator).isDisplayed(); } catch (Exception e) { return false; } } } ``` ## Concrete Page Object ```java public class LoginPage extends BasePage { private By usernameField = By.id("username"); private By passwordField = By.id("password"); private By loginButton = By.cssSelector("button[type='submit']"); private By errorMessage = By.cssSelector(".error-message"); public LoginPage(WebDriver driver) { super(driver); } public LoginPage navigate() { driver.get("https://example.com/login"); waitForVisible(usernameField); return this; } public DashboardPage loginAs(String username, String password) { type(usernameField, username); type(passwordField, password); click(loginButton); return new DashboardPage(driver); } public String getErrorMessage() { return getText(errorMessage); } } ``` ## Page Factory Pattern ```java import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class LoginPage { @FindBy(id = "username") private WebElement usernameField; @FindBy(id = "password") private WebElement passwordField; @FindBy(css = "button[type='submit']") private WebElement loginButton; public LoginPage(WebDriver driver) { PageFactory.initElements(driver, this); } public void login(String user, String pass) { usernameField.sendKeys(user); passwordField.sendKeys(pass); loginButton.click(); } } ```