【问题标题】:Java Appium Test failed to run on AWS Device FarmJava Appium 测试无法在 AWS Device Farm 上运行
【发布时间】:2016-08-30 07:53:59
【问题描述】:

我有由 Appium Insecptor 重新录制的 Java 语言 Appium 脚本。

我的脚本将只执行 5 个步骤:

  1. 点击用户名字段

  2. 输入用户名

  3. 点击密码字段

  4. 输入密码

  5. 点击登录按钮

我想在 AWS Device Farm 上运行我的脚本。

我确实按照AWS Device Farm的document修改了我的pom.xml文件,使用Maven包mvn clean package -Dskiptests=true打包,最后将zip-with-dependencies.zip上传到AWS Device Farm。

但我的测试未能运行。 这是结果的截图

我不知道我在哪里做错了让 AWS 无法运行我的脚本。

这是我记录的,

package com.hostname.myapp;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;


public class AppiumTest {

    private static AppiumDriver<AndroidElement> wd;

    @BeforeClass
    public static void setUpClass() throws MalformedURLException {

        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("appium-version", "1.0");
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("platformVersion", "5.0.2");
        capabilities.setCapability("deviceName", "XXXXXXXXXXXX");
        capabilities.setCapability("app", "/Users/X/X.apk");
        capabilities.setCapability("appPackage", "com.hostname.myapp");
        wd = new AndroidDriver<AndroidElement>(new URL("http://0.0.0.0:4723/wd/hub"), capabilities);
        wd.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
    }

    @AfterClass
    public static void tearDownClass() {
        if (wd != null) {
            wd.quit();
        }
    }

    @Test
    public void test() throws IOException {
        wd.findElement(By.xpath("android.widget.EditText[1]")).click();
        wd.findElement(By.xpath("android.widget.EditText[1]")).sendKeys("username");
        wd.findElement(By.xpath("android.widget.EditText[2]")).click();
        wd.findElement(By.name("Android.widget.EditText[2]")).sendKeys("password");
        wd.findElement(By.xpath("android.widget.Button[1]")).click();
        wd.close();
    } 

【问题讨论】:

  • 检查相同的脚本在物理设备上是否正常工作。尝试使用wd = new AndroidDriver&lt;&gt;(new URL("http://127.0.0.1:4723/wd/hub"), capabilities); 并验证元素定位器及其值是否正确。

标签: java android maven amazon-web-services


【解决方案1】:

我在 AWS Device Farm 团队工作。

感谢您提供详细信息。这有帮助。

解决方案

  1. 所需功能:设备场忽略您已使用的所需功能。由于您在设备场中单独上传应用程序并在安排运行时选择设备,因此您在代码中使用的设备类型、名称和其他功能将不会受到尊重,并且任何依赖于它的代码很可能将无法工作。 创建一个空的所需功能对象并将其传递给 AndroidDriver 构造函数将是解决此问题的理想方法。

  2. Android 驱动程序:您使用的代码

    wd = new AndroidDriver&lt;AndroidElement&gt;(new URL("http://0.0.0.0:4723/wd/hub"), capabilities);

    应该是

    wd = new AndroidDriver&lt;AndroidElement&gt;(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

  3. 视频:我们有适用于 iOS 和 Android 的视频录制功能。当测试失败时,如果有该运行的视频,它将非常有帮助。您可以在“文件”选项卡下进行检查。可能是在运行测试时设备上出现弹出声或其他一些意外事件。在这种情况下,该视频应该让您更深入地了解。

我建议尝试这 3 项更改。如果您仍然无法继续,请告诉我。

希望这会有所帮助。

【讨论】:

  • 谢谢@Nikof,我有几个问题,因为我对 AWS 和 Appium 1 很陌生。我应该在上传之前将 Desired Capabilities 留空吗?我发现无论有没有他们都没有什么不同。 2.我把IP改成127.0.0.1后,出现不同的错误:“An element could not be located on the page using the given search parameters.”,detail here但是该参数被Appium Inspector记录了。我认为应该是正确的。 3. 是的,我知道有录像。
  • 我需要你的帮助,@Nikof =(
  • 嗨,凯文,抱歉耽搁了。 1. 是的。建议留空。 2. 能否与我分享运行 url,因为我可以使用它来查找更多详细信息,以归零问题的原因。
  • 嗨@NikofTime,我确实尝试了AWS Github 的Android 示例代码并发布了一个新问题here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 2017-07-19
  • 2020-01-03
  • 2015-11-26
相关资源
最近更新 更多