Below is the code for page object model (POM) with Appium, Cucumber and Testng for Android app. Please have a look.
Maven Dependencies:
<dependencies> <!-- Appium Java client --> <dependency> <groupId>io.appium</groupId> <artifactId>java-client</artifactId> <version>8.5.1</version> </dependency> <!-- Cucumber --> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-java</artifactId> <version>7.14.0</version> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-testng</artifactId> <version>7.14.0</version> </dependency> <!-- TestNG --> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>7.9.0</version> <scope>test</scope> </dependency> </dependencies>
Driver Setup –
DriverManager.javapackage utilities; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.remote.MobileCapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; import java.net.URL; public class DriverManager { private static AndroidDriver driver; public static AndroidDriver getDriver() { if (driver == null) { try { DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android"); caps.setCapability(MobileCapabilityType.DEVICE_NAME, "emulator-5554"); caps.setCapability(MobileCapabilityType.APP, "path/to/your.apk"); caps.setCapability(MobileCapabilityType.AUTOMATION_NAME, "UiAutomator2"); driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), caps); } catch (Exception e) { e.printStackTrace(); } } return driver; } public static void quitDriver() { if (driver != null) { driver.quit(); driver = null; } } }
Feature File –
login.featureFeature: Login Feature Scenario: Successful login Given User is on login screen When User enters "admin" and "password123" Then User should be navigated to home screen
Cucumber Step Definitions –
LoginSteps.javapackage stepDefinitions; import io.cucumber.java.After; import io.cucumber.java.Before; import io.cucumber.java.en.*; import pages.LoginPage; import utilities.DriverManager; public class LoginSteps { LoginPage loginPage; @Before public void setup() { loginPage = new LoginPage(DriverManager.getDriver()); } @Given("User is on login screen") public void user_on_login_screen() { // App launches automatically; use this step to ensure user is at the login screen } @When("User enters {string} and {string}") public void user_enters_credentials(String username, String password) { loginPage.login(username, password); } @Then("User should be navigated to home screen") public void verify_login_success() { // Assert some element on home screen } @After public void tearDown() { DriverManager.quitDriver(); } }
Page Object Class –
LoginPage.javapackage pages; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.pagefactory.AppiumFieldDecorator; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class LoginPage { AndroidDriver driver; public LoginPage(AndroidDriver driver) { this.driver = driver; PageFactory.initElements(new AppiumFieldDecorator(driver), this); } @FindBy(id = "com.example:id/username") WebElement usernameField; @FindBy(id = "com.example:id/password") WebElement passwordField; @FindBy(id = "com.example:id/loginBtn") WebElement loginButton; public void login(String username, String password) { usernameField.sendKeys(username); passwordField.sendKeys(password); loginButton.click(); } }
Cucumber + TestNG Runner –
TestRunner.javapackage runner; import io.cucumber.testng.AbstractTestNGCucumberTests; import io.cucumber.testng.CucumberOptions; @CucumberOptions( features = "src/test/java/features", glue = {"stepDefinitions"}, plugin = {"pretty", "html:target/cucumber-report.html"}, monochrome = true ) public class TestRunner extends AbstractTestNGCucumberTests { }
Run the Tests:
mvn clean test