Appium 修改 Bootstrap 源码,添加自定义监听代码实现

baxia · 2018年06月22日 · 最后由 onesbyones 回复于 2018年06月25日 · 2984 次阅读

在测试的过程中,会遇到异常情况的弹框,比如应用在网络不好的情况下出现弹框,这个时候会影响到测试,可以添加一个监听及时去处理这些弹框
参考文章:
AppiumServer 源码解析:http://blog.csdn.net/wanglha/article/details/42523745
AppiumBootstrap 调试方法:http://blog.csdn.net/qq744746842/article/details/50461988
Uiatomator 调试:https://testerhome.com/topics/1358
Uiautoamator2 弹框点击:https://testerhome.com/topics/8512

1、原理基础:主要利用 bootstrap 这个作为在手机里的 “手”,实现监听
  1)bootstrap 的入口是一个继承了 UiautomatorTestCase 的测试类,实质上是一个 Uiautomator 项目
  2)uiautomator 自带的监听器可以起到监听操作弹框的作用

2、实现步骤
  1)打开 C:\Users\xxx\AppData\Roaming\npm\node_modules\appium\node_modules\appium-android-bootstrap\bootstrap 项目,阅读 bootstrap 官网(https://github.com/appium/appium-android-bootstrap/tree/master/bootstrapbootstrap 不报错))进行编译,使得项目不报错,可以编写(主要是使得
  2)在 bootstrap.java->server.listenForever->dismissCrashAlerts->registerAnrAndCrashWatchers 中添加一个监听:

  UiDevice.getInstance().registerWatcher("WIFI", new UiWatcher() {
    @Override    public boolean checkForCondition() {
      UiObject window = new UiObject(new UiSelector().textContains("等一会"));      if (window.exists()){
        Logger.debug("WIFI UnStable");        try {
          window.click();//点击等一会        } catch (UiObjectNotFoundException e) {
          Log.e(LOG_TAG, "dialog gone?", e);        }
        return true;      }
      return false;    }
  });  Log.i(LOG_TAG, "Registed GUI Exception watchers");
}

注意:不要给项目引入 Junit 包,比如添加@test这样的操作,会导致下一步操作失败
  3)进入 C:\Users\xxx\AppData\Roaming\npm\node_modules\appium\node_modules\appium-android-bootstrap\bootstrap\目录下执行:ant build
  4)进行测试:
将 jar 包 push 到手机中:adb push C:\Users\hly\AppData\Roaming\npm\node_modules\appium\node_modules\appium-android-bootstrap\bootstrap\bin\AppiumBootstrap.jar /data/local/tmp/
运行 jar 包:adb shell uiautomator runtest AppiumBootstrap.jar -c io.appium.android.bootstrap.Bootstrap

3、遇到问题解决
  1)执行 mvn install -P 4.4 报错:

[ERROR] Failed to execute goal org.codehaus.mojo:properties-maven-plugin:1.0.0:r
    ead-project-properties (default) on project google-apis-19: Properties could not
     be loaded from File: D:\tools\Android\sdk\add-ons\addon-google_apis-google-19\s
    ource.properties -> [Help 1]

解决:这一步是添加 bootstrap 的 android 依赖包,后来自己创建项目的时候发现:只要在项目中导入 android 和 uiautomator 的 jar 即可
  2)如果使用 ant 构建,出错了,查看下 android/sdk/tools/中是否有 ant 文件夹,如果没有需要寻找一个加进去。我是由于编写两外一个验证项目的时候,需要获 SDK 的 ID 值,但是在 android/sdk/tools/目录下执行的时候出现 android 关键字被弃用的报错,查找原因发现是由于 android 最新的 sdk 不支持 android 命令,更换旧版本的 sdk 中的 tools 文件夹即可。参考资料:http://forum.cocos.com/t/creator1-4-1-android/45151/22
示例 1 地址:http://www.cnblogs.com/cologne/p/4726024.html
示例 2 地址:http://www.it165.net/pro/html/201409/22071.html
我的 testerhome 提问:https://testerhome.com/topics/9140

4、遗留问题:
  1)为何在 C:\Users\xxx\AppData\Roaming\npm\node_modules\appium\node_modules\appium-uiautomator\build\lib 下的 uiautomator.js 添加-e debug true 没有生效?
  2)appium 是在什么时候对 bootstrap 进行打包的?
  3)为何使用 mvn 构建的 jar 包,修改的代码无效?
  4)mvn install -P 4.4 失败,以及构建 bootstrap 是否必须?

共收到 3 条回复 时间 点赞

楼主 能帮忙解决这个问题吗? https://testerhome.com/topics/14775

不错,不过 bootstrap 快被废弃了,appium 主要发力 ui2 了

不是即时构建的,是存放在一个目录里边。
在 appium 初始化的时候会把这个 bootstrap.jar 文件 push 到手机里
我选择的构建工具是 ant,直接编译 bootstrap.jar

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册