通用技术 Root 下手机用 UiAutomator 脚本实现一键下载、安装和登陆测试包的方法

哈喽 · 2017年03月23日 · 最后由 JMY 回复于 2018年06月10日 · 2170 次阅读

前排表示我用了 Markdown,友军勿拉黑

公司的测试包是放在 Ftp 上的,更新频率也不慢,所以我们经常经历 “手机与电脑 USB 数据线相连-->打开 PC 浏览器-->点击下载-->用 adb 或者第三方工具将包装到手机上-->打开 app 输入常用的测试账号点击登陆” 这么一个过程。

之前参考社区中关于 AccessibilityService 应用的帖子:https://testerhome.com/topics/3800https://testerhome.com/topics/3750 写过一个自动下载安装的 app,但是存在应用进程杀掉后,服务也会关闭的问题,然后就导致了得经常的去打开服务的问题。最近因为某些原因,测试机需要 root,想起以前写 UiAutomator,尝试了下写了个 app,在 Root 状态下,无需 USB 数据线连接电脑,自动下载测试包后以 root 权限调用 UiAutomator 脚本实现安装和登陆。

实现效果:

代码放在 Github:https://github.com/xuchaochao/autologin.git

主要有由三部分构成:

1.UiAutomator 脚本的 InstallAndLogin

2.打包并推送到手机 RootLogin.py 脚本

3.app 部分的 autologin

怎么玩:

首先在 InstallAndLogin 中:

写了打开需要登陆的 app 的登录界面以及输入账号和密码的操作,可能还得根据自己的特殊机型做下适配,这个不同 app 当然是不同的控件,需要自己重写。

然后在 RootLogin.py 中:

android create uitest-project -n 手机号码 -t 2 -p InstallAndLogin 的路经地址
打开 InstallAndLogin 下的 build.xml,改 help-->build
ant -buildfile InstallAndLogin 下的 build.xml 路经地址
adb -s 你的 androidID push 打包好的登陆的手机号码.jar /data/local/tmp/
adb -s 你的 androidID shell uiautomator runtest 打包好的登陆的手机号码.jar -c Login.Login
使用的话,填上你的账号和密码还有改成你自己电脑上的地址,其他的都是很通用的。

最后 autologin 的作用是:

让该 app 获得 root 授权然后点击相应按钮执行相应功能,如果 root 了的话就都能玩了,可以根据需求下载对应环境的测试包,可以只是下载安装,可以只是登陆操作,也可以一键实现下载安装并登陆;对于多个测试账号的同学,可以自己多写几个登陆脚本,多在 app 中写几个手机号对应的登陆按钮就好了。(不 root 的用户就点击安装也能自动下载安装,但是不能自动登陆)

据说秀代码的话加精的可能性会增大,下面是看起来比较关键的部分,就是一个如果 root 了那么就用 pm 命令安装 app,用 uiautomator runtest 手机号码.jar 执行登陆操作;不 root 的话就用 AccessibilityService 去安装。

private void login(String path) {
      if (hasRootPerssion()) {
          toast("安装登录中...");
          try {
              Process process = null;
              process = Runtime.getRuntime().exec("su");
              os = new DataOutputStream(process.getOutputStream());
              os.writeBytes("pm install -r " + path + "\n");
              os.writeBytes("uiautomator runtest 18scdsdcsdc4.jar --nohup -c Login.Login"+ "\n");
              os.writeBytes("exit\n");
              os.flush();
              os.close();
          } catch (Exception e) {
          }
      } else {
          if (!hasEnv()) {
              toast("未Root用户需打开辅助服务...");
              Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
              startActivityForResult(intent, 0);
          } else {
              if (path == "Dev") {
                  toast("自动安装中...");
                  startInstall("app-DT1.apk");
              } else {
                  toast("自动安装中...");
                  startInstall("app-" + path + ".apk");
              }
          }
      }
  }

另外 iOS 的安装包也在 Ftp 上,以后再写写 iOS 的怎么玩。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 3 条回复 时间 点赞

是不是得切换个马甲自顶一下。。。

赞一下,期待 iOS 的

os.writeBytes("uiautomator runtest 18267990494.jar --nohup -c Login.Login"+ "\n"); 请问这行命令中的 jar 包放在那个位置?

哈喽 关闭了讨论 02月29日 13:35
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册