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

No comments:

Post a Comment