Appium用于测试Android混合移动应用程序

时间:2017-01-10 12:53:47

标签: java android cordova selenium appium

我希望在Android上运行的Cordova之上自动测试基本的混合移动应用程序构建。我使用了Apppium。我跟着tutorial video开始了。我下载并将Selenum,selendroid和java客户端.jar文件添加到Application的构建路径中。

以下是我的代码,

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

}

我可以获得功能上下文。在切换窗口(driver.switchTo().window("WEBVIEW_0"))时,我收到类似Exception in thread "main" org.openqa.selenium.WebDriverException: CATCH_ALL: java.lang.VerifyError: io/selendroid/server/model/SelendroidWebDriver

的错误

版本:

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

1 个答案:

答案 0 :(得分:0)

经过多次尝试,使用Appium在Hybrid Mobile Application中进行了自动化测试。

基本上在Capabilities中,没有必要设置包名称和活动名称。而是获取应用程序包名称(.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());

然后不要将窗口显式切换到WEBVIEW。获取上下文并为应用程序设置特定于Webview的动态上下文。

       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();            
        }

最后使用驱动程序设置,执行操作。

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