因为项目组准备搞 UI 自动化,所以把已经 2 年没用过的 appium 捡起来重新看了看,在这里总结一下
adt
安装包jdk
环境ant
编译环境(把生成的local.properties
文件放到 clone 下来的bootstrap
目录下)更好的办法就是使用 adb 命令一次性把权限申请下来
Bootstrap.java
package io.appium.android.bootstrap;
...
SocketServer server;
try {
server = new SocketServer(4724);
//入口
server.listenForever(disableAndroidWatchers, acceptSSLCerts);
} catch (final SocketServerException e) {
Logger.error(e.getError());
System.exit(1);
}
...
SocketSever.java
//处理crash
dismissCrashAlerts();
final TimerTask updateWatchers = new TimerTask() {
@Override
public void run() {
try {
watchers.check();
} catch (final Exception e) {
}
}
};
timer.scheduleAtFixedRate(updateWatchers, 100, 100);
}
//证书弹框
if (acceptSSLCerts) {
Logger.debug("Accepting SSL certificate errors.");
acceptSSLCertificates();
}
SocketSever.java
public void dismissPermissionAlerts() {
try {
new UiWatchers().registerPermissonWatcher();
Logger.debug("Registered permission watchers.");
} catch (final Exception e) {
Logger.debug("Unable to register permission watchers.");
}
}
UiWatchers.java
//新增
public void registerPermissonWatcher() {
UiDevice.getInstance().registerWatcher("PERMISSION", new UiWatcher() {
@Override
public boolean checkForCondition() {
final UiObject window = new UiObject(new UiSelector()
.resourceId("com.android.packageinstaller:id/permission_message"));
if (window.exists()) {
String errorText = null;
try {
errorText = window.getText();
} catch (final UiObjectNotFoundException e) {
// TODO: handle exception
Log.e(LOG_TAG, "dialog gone?", e);
}
onPermissionDetected(errorText);
postPermissionHandler();
return true;
}
return false;
}
});
}
ant 构建 jar 包:在bootstrap
目录下,使用命令行 ant build
把生成的 jar 包替换掉 appium 安装目录下的:
AppData\\Roaming\\npm\\node_modules\\appium\\node_modules\\_appium-android-bootstrap\@2.10.1\@appium-android-bootstrap\\bootstrap\\bin\\AppiumBootstrap.jar
名字最好一样
因为我们的登录输入框,使用了稍微人性化的设计,所以使得在使用 appium 的键盘输入时,经常会丢失文本。比如:
然后试了下adb
命令是不会丢失。好吧,看了下appium server
的日志,发现可以用切换输入法来解决,不然用adb
是不支持中文字符的。
方法如下
adb shell settings get secure default_input_method
adb shell ime enable io.appium.android.ime/.UnicodeIME
adb shell ime set io.appium.android.ime/.UnicodeIME
装了一最新版本的 appium,不知道为什么在去掉浮层的时候,会找不到原生的元素,后边再打算看看