首页 文章

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

提问于
浏览
1

我想在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;
    }

}

我能够得到 CapabilitiesContexts . 在切换窗口( 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

  • Selenium:3.0.1

  • Selendroid:0.17.0

1 回答

  • 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 . 获取上下文并设置特定于Application的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();
    

相关问题