Part 11: Page Object Model (POM) Design in Appium (Android)
What Is a Page Object Model (POM)?
The Page Object Model (POM) is a design pattern used in test automation to:
- Organize your code
- Avoid duplication
- Separate test logic from UI structure
In POM, each screen or page of your app becomes a separate Java class with:
- All element locators
- All interactions (like click, send text, etc.)
Why Use POM? — Table
Without POM
With POM
Repeating locators in every test
One place to manage locators
Messy and hard to maintain
Organized, modular structure
Hard to debug
Easy to debug or change in one place
Code is mixed with UI elements
Logic is clean and reusable
POM Project Structure Example
AppiumProject/
│
├── base/
│ └── BaseTest.java
│
├── pages/
│ ├── LoginPage.java
│ └── HomePage.java
│
├── tests/
│ └── LoginTest.java
│
└── utils/
└── DriverFactory.java
Step-by-Step Example: Login Page Using POM
Let’s create a POM structure for a simple login page with:
- Username field
- Password field
- Login button
1. BaseTest.java (Reusable setup)
package base;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.MobileElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.net.URL;
public class BaseTest {
public static AndroidDriver driver;
public void setup() {
try {
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("platformName", "Android");
caps.setCapability("platformVersion", "12");
caps.setCapability("deviceName", "Android Emulator");
caps.setCapability("automationName", "UiAutomator2");
caps.setCapability("appPackage", "com.example");
caps.setCapability("appActivity", "com.example.LoginActivity");
URL url = new URL("http://127.0.0.1:4723/wd/hub");
driver = new AndroidDriver<>(url, caps);
} catch (Exception e) {
e.printStackTrace();
}
}
public void tearDown() {
if (driver != null) {
driver.quit();
}
}
}
2. LoginPage.java (Page Object class)
package pages;
import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
public class LoginPage {
private AndroidDriver driver;
public LoginPage(AndroidDriver driver) {
this.driver = driver;
}
// Locators
private String usernameField = "com.example:id/username";
private String passwordField = "com.example:id/password";
private String loginButton = "com.example:id/loginBtn";
// Actions
public void enterUsername(String username) {
driver.findElementById(usernameField).sendKeys(username);
}
public void enterPassword(String password) {
driver.findElementById(passwordField).sendKeys(password);
}
public void tapLogin() {
driver.findElementById(loginButton).click();
}
}
3. LoginTest.java (Actual test)
package tests;
import base.BaseTest;
import pages.LoginPage;
public class LoginTest extends BaseTest {
public static void main(String[] args) {
LoginTest test = new LoginTest();
test.setup();
// Create Page Object
LoginPage loginPage = new LoginPage(driver);
// Test steps
loginPage.enterUsername("admin");
loginPage.enterPassword("1234");
loginPage.tapLogin();
test.tearDown();
}
}
Benefits of This Approach
- Easy to reuse LoginPage in multiple tests
- If the app changes, update only one file
- Clean separation of test logic and UI details
Real-World Tip:
As your app grows:
- Make one class per screen
- Add only reusable actions (like enterUsername() or tapLogin())
- Your test scripts will become much easier to read and maintain.
Summary
What We Did
Why It Matters
Created BaseTest for setup
Centralizes configuration
Created LoginPage with locators
Encapsulates UI structure
Wrote clean test in LoginTest
Improves readability & reusability
Building complex IoT systems?
Accelerate testing and deployment with our QEMU-integrated toolchain expertise.
Mastering Appium: A Complete Beginner-to-Expert Mobile Automation Guide
Part 1 : Introduction to Mobile Automation and Appium
Part 2 : Appium Architecture, Tools Setup & How Test Code Connects to Devices
Part 3 : Java Fundamentals for Test Automation
Part 4 : Next Steps: Level Up Before Real Appium Scripting
Part 5 : Setting Up the Environment (Windows & macOS)
Part 6 : Understanding UiAutomator2 (Android Engine)
Part 7 : First Appium Test Script (Android)
Part 8 : Handling Waits and Synchronization in Appium (Android)
Part 9 : Element Locator Strategies in Android (ID, XPath, etc.)
Part 10 : TestNG Integration for Test Execution
Part 10.1 : Advanced TestNG Features in Appium Framework
Part 11 : Page Object Model (POM) Design in Appium (Android)
Part 12 : Logging with Log4j & Reporting with Extent Reports (Appium - Android)
Part 10.1: Advanced TestNG Features in Appium Framework