最近由于某个 appium 的 bug,把 appium 从 1.2.0 升级到 1.3.4 ,结果跑不了了(找不到 Configurator 这个类)。查了一下相关资料,发现虽然 UIAutomator 在 API level 17 以后就有提供,但 API level 18 上做了一些调整,并且这些调整对测试有较大影响,所以在这里记录一下

目前已知的、可以感受到差异:

  1. 使用 uiautomatorviewer 查看元素时, API level 17 看不到 resource-id 这个属性(API 不支持), API 18 可以

  2. 使用 Appium 高于 1.3.4 的版本测试 4.2 时,可能会出现 java.lang.NoClassDefFoundError: com.android.uiautomator.core.Configurator 错误( 1.3.4 以后的貌似在出现这个错误前增加了对 API level 的检查,但我没测试过,不是很确定)。

代码级别的差异也很大:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/com/android/uiautomator/core/AccessibilityNodeInfoDumper.java?av=f

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r1/com/android/uiautomator/core/AccessibilityNodeInfoDumper.java?av=f

打开后可以看到差异不少,API level 18 增加了不少文件,已有文件也做了不少变更。

官方目前对于 UIAutomator 的支持情况

官方文档中对 UIAutomator 的最低支持版本已经改为:Requires Android 4.3 (API level 18) or higher.

http://developer.android.com/tools/testing-support-library/index.html#UIAutomator

同时在官网 API level 17 时查看 UIAutomator API 会提示 API level 17 不支持 UIAutomator 。因此可以认为 4.2 的 UIAutomator 已经被废弃了。

appium 对 UIAutomator 的支持情况

appium 从 1.3.4 加入对 Configurator 这个类的依赖:

https://github.com/appium/appium/commit/af58dbe9f5306da46fc7ed7aeaca15304cf6496e

https://github.com/appium/appium/commit/5149d5113700fa622adc0d50eed6e82fd93f3276

https://github.com/appium/appium/commit/3104d03b9b169377fbcce26bd79a36ed70465cab

因此基本可以确定 1.3.4 以后的 appium 在 Android 上使用非 selendroid 模式都必须是在 API level > 18 上运行。相当于 Appium 1.3.4 及以后的版本都是在 4.3+ 后才能用 UIAutomator 。 1.3.4 以前的虽然可以在 API level 17 上运行,但一些 API level 18 才支持的功能 ( 如获取节点的 resource-id 属性) 肯定支持不了。

结论

对于 API level = 17(4.2)的 Android 设备,要不使用较低版本的 appium(如果你确定功能已经够用和够稳定),要不用 selendroid 模式运行。否则你会遇到错误且不改 appium 源码无法解决。


↙↙↙阅读原文可查看相关链接,并与作者交流