Appium Android 模拟器未关闭或测试失败

Appium Android Emulator not closing or making tests fail

我有一个 Appium 测试,我正在尝试 运行 和 Android Emulator 使用股票浏览器。此测试在 iOS 上通过,但在 Android 上它在测试之间失败了一半,因为 Android 似乎比 iOS.

对元素定位器更挑剔。

无论如何我的问题是我希望它此时会失败,因为它找不到它试图点击的元素,但是测试然后挂起(大约 10 分钟,然后被套接字超时),并且不会导致测试失败。模拟器只是保持打开状态,测试看起来正在继续 运行。

我通过 npm 安装了最新版本的 Appium。

这是我想要的功能:

        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("browserName", "browser");
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("takesScreenshot", true);
        capabilities.setCapability("version", "5.1.1");
        capabilities.setCapability("deviceName", "Android Emulator");
        capabilities.setCapability("avd", "nexus5");
        webDriver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),
                                      capabilities);

我的 Appium 日志显示如下:

        info: Got response with status 200: {"sessionId":"27038f591907917c7f2c1ce48db7d032","status":13,"value":{"message":"unknown error: Element is not clickable at point (342, 32). Other element would receive the click: <button class=\"butto...
        info: <-- POST /wd/hub/session/27038f591907917c7f2c1ce48db7d032/element/0.9723546949680895-1/click 200 825.852 ms - 381 
        info: --> GET /wd/hub/session/27038f591907917c7f2c1ce48db7d032/screenshot {}
        info: Proxying [GET /wd/hub/session/27038f591907917c7f2c1ce48db7d032/screenshot] to [GET http://127.0.0.1:9515/wd/hub/session/27038f591907917c7f2c1ce48db7d032/screenshot] with body: {}
        info: [debug] Didn't get a new command in 30 secs, shutting down...
        info: Shutting down appium session
        info: Proxying [DELETE /] to [DELETE http://127.0.0.1:9515/wd/hub/session/27038f591907917c7f2c1ce48db7d032] with no body

我希望我的测试在此时退出,因为它无法单击该元素。谁能给点建议?

谢谢

更新

添加了我截取屏幕截图的代码,这看起来像是让我的测试挂起的原因:

  public void captureScreenshot(String methodName) {
                try {
                    new File(screenshotDirectory).mkdirs();
                    String filename = methodName + ".png";
                    File screenshot = ((TakesScreenshot) webDriverService.getWebDriver()).getScreenshotAs(OutputType.FILE);
                    FileUtils.copyFile(screenshot, new File(screenshotDirectory + filename));
                } catch (Exception e) {
                    System.out.println(e.toString());
                }
            }

设法修复它必须使用一段稍微不同的代码在 android 上截取屏幕截图:

        public void captureScreenshot(String methodName) {
            try {
                new File(screenshotDirectory).mkdirs();
                String filename = methodName + ".png";
                AppiumDriver webDriver = (AppiumDriver) webDriverService.getWebDriver();
                webDriver.context("NATIVE_APP");
                File screenshot = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
                FileUtils.copyFile(screenshot, new File(screenshotDirectory + filename));
            } catch (Exception e) {
                System.out.println(e.toString());
            }
        }
    };

(我最初在这里发布了这个答案:https://discuss.appium.io/t/appium-hangs-when-taking-a-screenshot-android/5318/4?u=savishy)

我知道这是一个有点老的话题,但是在 Appium Java 客户端 3.2.0 中我遇到了这个问题,我想我会提出我的解决方案。

这是发生挂起的代码行。我知道是因为前面的 log.debug 行被打印出来了。

    log.debug(filePath);
    File file  = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

这是 Appium 服务器日志:

2015-11-26 09:20:03:085 - info: <-- POST /wd/hub/session/93df24a9-1b33-49c8-aea1-b3b768f21d97/element 200 1210.866 ms - 87 {"status":0,"value":{"ELEMENT":"1"},"sessionId":"93df24a9-1b33-49c8-aea1-b3b768f21d97"}
2015-11-26 09:20:03:101 - info: --> GET /wd/hub/session/93df24a9-1b33-49c8-aea1-b3b768f21d97/screenshot {}
2015-11-26 09:20:03:103 - debug: executing cmd: D:\vish\adt-bundle\sdk\platform-tools\adb.exe -s TA64303N7W shell "/system/bin/rm /data/local/tmp/screenshot.png; /system/bin/screencap -p /data/local/tmp/screenshot.png "

进一步调试:看/data/local/tmp

我查看了 /data/local/tmp 设备文件夹。以下是内容、权限和时间戳:

$ adb shell ls -l /data/local/tmp
-rw-rw-rw- shell    shell    20456741 2015-11-25 21:41 0978df74a3eeb9a231b2e0cb5a1f7e73.apk
-rw-rw-rw- shell    shell       48797 2015-10-10 03:23 AppiumBootstrap.jar
-rw-rw-rw- shell    shell        2554 2015-07-25 23:40 UIAutomatorTest.jar
drwxrwxrwx shell    shell             2015-07-25 23:36 dalvik-cache
-rw------- root     root         8529 2015-11-18 15:38 dump.xml
drwx------ shell    shell             2015-08-07 16:37 local
drwxrwxrwx shell    shell             2015-10-14 15:33 mobizen
-rw-rw-r-- root     root       379501 2015-11-18 15:38 screenshot.png
-rw-rw-rw- shell    shell       53503 2015-11-26 14:49 strings.json
-rw------- shell    shell       13965 2015-11-19 14:20 uidump.xml

如您所见,有一个大约一周前的文件 screenshot.png。 (大概是被旧的 Appium Java 运行 捕获了)。

下一步:尝试使用 adb 手动删除 shell

下一步 - 我尝试使用 Appium 使用的 adb shell 命令删除这个文件。这是输出。注意来自 shell?

的提示
vish@freeman /cygdrive/d/vish/ma-app-verification-android/appium-projects/AppiumAndroid
$ adb -s TA64303N7W shell "/system/bin/rm /data/local/tmp/screenshot.png"
override rw-rw-r-- root:root for '/data/local/tmp/screenshot.png'?

(鼓声)

上面看到的提示就是导致Appium挂起的原因。

幸运的是,我的 phone 已获得 root 权限,因此我能够以 root 身份手动删除有问题的屏幕截图:

vish@freeman /cygdrive/d/vish/ma-app-verification-android/appium-projects/AppiumAndroid
$ adb root

vish@freeman /cygdrive/d/vish/ma-app-verification-android/appium-projects/AppiumAndroid
$ adb shell rm /data/local/tmp/screenshot.png