Appium Android 坎坷

原来使用的appium版本很久没升级了,最近升级了最新的appium(version 1.0.2-beta.2)和java-client(5.0.0-BETA8),却跑不起来了,debug来debug去,甚至从头从新版本建个环境做对比。

A new session could not be created

org.openqa.selenium.SessionNotCreatedException: A new session could not be created. (Original error: Requested a new session but one was in progress) (WARNING: The server did not provide any stacktrace information)

解决方案,在Appium的General Settings里面勾选:
Override Existing Sessions

java client 版本号

官方说明,直接去maven仓库中搜索
http://mvnrepository.com/artifact/io.appium/java-client

Maven 依赖冲突

Appium java-client 用的selenium是3.4版本,而项目Maven Dependencies中的selenium-api等还是2.x版本(来自于包含Web测试的测试框架包),解决方案,调整pom.xml文件的依赖顺序,java-client写在前面即可。这里靠上优先加载,是有一个从上到下的顺序的。
温习,官方文档说明:

Appium 服务端定义了官方协议的扩展,为Appium 用户提供了方便的接口来执行各种设备动作,例如在测试过程中
安装/卸载app。这就是为什么我们需要Appium 特定的客户端,而不是通用的Selenium 客户端。当然,Appium 客
户端类库只是增加了一些功能,而实际上这些功能就是简单的扩展了Selenium 客户端,所以他们仍然可以用来运行通
用的selenium会话。

另外,也可以在引用dependency时使用如下方式来排除冲突,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>com.tracenote.xx</groupId>
<artifactId>xx-x-a</artifactId>
<version>1.0.1</version>
<exclusions>
<exclusion>
<artifactId>xx-x-b</artifactId>
<groupId>com.tracenote.xx</groupId>
</exclusion>
<exclusion>
<artifactId>xx-x-c</artifactId>
<groupId>com.tracenote.xx</groupId>
</exclusion>
</exclusions>
</dependency>

TestNG

运行@Test方法提示

Could not find or load main class org.testng.remote.RemoteTestNG


程序引用TestNG jar包版本升级到了6.11,而eclipse TestNG插件仍是6.9,升级eclipse TestNG插件解决。

DDMS定位

对应DDMS属性

  • id: resrouce-id
  • name: text
  • ClassName: class
  • AccessibilityId:content-desc
  • xpath执行效率较低,尽量不要用。
    AndroidUiAutomator定位方式也是很强大,例如
1
driver.findElementByAndroidUIAutomator("new UiSelector().resourceId(\"com.tencent.mm:id/do\")");

Android Virtual Device

appium官方tutorial建议模拟器设置:
Ensure Use Host GPU is checked. Set VM Heap to 64. 32 is too small.

有时候找不到设备

Run the following commands a few times until it’s listed.
adb kill-server; adb devices

结束后没有键盘

结束后使用手机,发现该输入时无键盘,去手机设置中或直接使用adb命令检查输入法adb shell settings get secure default_input_method, 发现还是io.appium.android.ime/.UnicodeIME。尝试在driver.quit()之前重置键盘:

1
2
driver.manage().ime().activateEngine( driver.manage().ime().getAvailableEngines()
.stream().filter(x -> !x.contains("appium")).collect(Collectors.toList()).get(0));

结果发现appium在driver.quit()方法中又设置回去了,

[debug] [AndroidDriver] Resetting IME to io.appium.android.ime/.UnicodeIME


无奈,结束前直接跑一遍adb命令进行恢复设置,

1
2
3
androidTools.runCommand(adb + " shell ime set " 
+ androidTools.runCommand(adb
+ " shell ime list -s|grep -v appium -m 1"));

注意androidTools.runCommand是自行封装的执行adb命令的方法,adb使用变量是因为macOS的Java虚拟机找不到系统adb命令,需要指定全路径。