Search code examples
javaandroidcordovaseleniumappium

Appium to test Android Hybrid Mobile Application


I want to automate test a basic Hybrid Mobile Application build on top of Cordova running in Android. I used Apppium for that. I followed the tutorial video to get started. I downloaded and Added Selenum, selendroid and java client .jar files to the build path of the Application.

Below is my code,

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.Set;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.MobileCapabilityType;

public class AppiumTest {

    public static void main(String[] args) throws MalformedURLException, InterruptedException {

        URL serverAddress = new URL("http://0.0.0.0:4723/wd/hub");
        WebDriver driver =  new AndroidDriver<MobileElement>(serverAddress, getDesiredCapabilities());

        try{            
            Set<String> contextNames = ((AppiumDriver<MobileElement>) driver).getContextHandles();
            for (final String contextName : contextNames) {
                  System.out.println(contextName);
                  if (contextName.contains("WEBVIEW_0")) {
                      Thread.sleep(3000);
                      driver.switchTo().window("WEBVIEW_0");
                  }
                }

            //Change color to Red
            driver.findElement(By.cssSelector("p.recieved")).click();
            Thread.sleep(2000);

            //Change color to Red
            driver.findElement(By.cssSelector("recieved")).click();
            Thread.sleep(2000);

            driver.get("http//appium.io/");
            Thread.sleep(2000);
        }
        finally {
            driver.quit();
        }
        System.out.println("Driver "+driver);
    }

    public static DesiredCapabilities getDesiredCapabilities() {

        DesiredCapabilities capability = new DesiredCapabilities();

        capability.setCapability(MobileCapabilityType.AUTOMATION_NAME, "selendroid");
        capability.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
        capability.setCapability("platformVersion", "4.4.4");
        capability.setCapability("deviceName", "Android-Dev");
        capability.setCapability("app",
                "C:/Joseph/Appium/HybridProject/AppiumTest/platforms/android/build/outputs/apk/android-debug.apk");
        capability.setCapability("appPackage", "com.joseph.appiumtest");
        capability.setCapability("appActivity", ".MainActivity");

        return capability;
    }

}

I can able to get the Capabilities and Contexts. On switching the window (driver.switchTo().window("WEBVIEW_0")), I am getting error like Exception in thread "main" org.openqa.selenium.WebDriverException: CATCH_ALL: java.lang.VerifyError: io/selendroid/server/model/SelendroidWebDriver

Versions :

  • Android : 4.4.4
  • Appium : 1.6.3
  • Selenium : 3.0.1
  • Selendroid: 0.17.0

Solution

  • After lots of tries, got the Automation testing in Hybrid Mobile Application using Appium worked.

    Basically in Capabilities, its not necessary to set the package name and activity name. Instead get the file path of the Application package name(.apk).

            File app= new File("project/platforms/android/build/outputs/apk/android-debug.apk");
            DesiredCapabilities capabilities= new DesiredCapabilities();
            capabilities.setCapability("deviceName", "Android-Dev");
            capabilities.setCapability("platformVersion", "4.4.4");
            capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "MobilePlatform.ANDROID");
            capabilities.setCapability("app", app.getAbsolutePath());
    

    Then do not explicitly switch the window to WEBVIEW. Get the context and set the dynamic context of Webview particular for the Application.

           try {
                Set<String> contextNames = ((AppiumDriver) driver).getContextHandles();
                for (String contextName : contextNames) {
                    System.out.println(contextName);
                    if (contextName.contains("WEBVIEW")) {
                        ((AppiumDriver<MobileElement>) driver).context(contextName);
                    }
                }
            }
            catch(Exception e){
                e.printStackTrace();            
            }
    

    And finally with the driver set, do the action.

    driver.findElement(By.xpath("//*[@id='login']")).click();