Below is the code for page object model (POM) with Appium, Cucumber and Junit for Android app. Please have a look.
Maven Dependencies:
<dependencies> <!-- Appium --> <dependency> <groupId>io.appium</groupId> <artifactId>java-client</artifactId> <version>8.3.0</version> </dependency> <!-- Cucumber --> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-java</artifactId> <version>7.11.2</version> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit</artifactId> <version>7.11.2</version> <scope>test</scope> </dependency> <!-- JUnit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> </dependency> </dependencies>
Base Class for Appium Driver (
BaseTest.java)package utilities; 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<MobileElement> driver; public void initializeDriver() throws Exception { DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability("platformName", "Android"); caps.setCapability("deviceName", "emulator-5554"); // change as per your device caps.setCapability("appPackage", "com.example.app"); caps.setCapability("appActivity", "com.example.app.MainActivity"); caps.setCapability("automationName", "UiAutomator2"); driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), caps); } public void quitDriver() { if (driver != null) { driver.quit(); } } }
Cucumber Feature File (
login.feature)Feature: Login Scenario: Successful login Given App is launched When I login with valid credentials Then I should be navigated to the home page
Step Definitions (
LoginSteps.java)package stepDefinitions; import io.cucumber.java.en.*; import pages.LoginPage; import utilities.BaseTest; public class LoginSteps extends BaseTest { LoginPage loginPage; @Given("App is launched") public void app_is_launched() throws Exception { initializeDriver(); loginPage = new LoginPage(driver); } @When("I login with valid credentials") public void i_login_with_valid_credentials() { loginPage.login("admin", "admin123"); } @Then("I should be navigated to the home page") public void i_should_be_navigated_to_the_home_page() { // Add assertion logic or verification here } }
Page Class using Page Object Model (
LoginPage.java)package pages; import io.appium.java_client.MobileElement; import io.appium.java_client.android.AndroidDriver; public class LoginPage { AndroidDriver<MobileElement> driver; public LoginPage(AndroidDriver<MobileElement> driver) { this.driver = driver; } public MobileElement getUsernameField() { return driver.findElementById("com.example.app:id/username"); } public MobileElement getPasswordField() { return driver.findElementById("com.example.app:id/password"); } public MobileElement getLoginButton() { return driver.findElementById("com.example.app:id/login"); } public void login(String username, String password) { getUsernameField().sendKeys(username); getPasswordField().sendKeys(password); getLoginButton().click(); } }
Cucumber Hooks (
Hooks.java)package utilities; import io.cucumber.java.After; import io.cucumber.java.Before; public class Hooks extends BaseTest { @Before public void setup() throws Exception { initializeDriver(); } @After public void tearDown() { quitDriver(); } }
Test Runner (
TestRunner.java)package runners; import org.junit.runner.RunWith; import io.cucumber.junit.Cucumber; import io.cucumber.junit.CucumberOptions; @RunWith(Cucumber.class) @CucumberOptions( features = "src/test/resources/features", glue = {"stepDefinitions", "utilities"}, plugin = {"pretty", "html:target/cucumber-report.html"}, monochrome = true ) public class TestRunner { }