Pages

Page Object Model with Appium, Cucumber, and JUnit for Android App

 


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 {
}