这几天阅读了一下atx的代码,顺便发现群里这两天一些伙伴想知道具体u2是如何和手机进行交互的? 其实相关的交互流程已经有人写好了,就像我下面这段是直接抄过来的,建议初学的小伙伴尽量把atx的帖子都阅读一遍,心里初步会有一个他具体能做什么有一个了解.

框架介绍

ATX(AutomatorX) 是一款开源的自动化测试工具,支持测试 iOS 平台和 Android 平台的原生应用、游戏、Web 应用。 使用 Python 来编写测试用例,混合使用图像识别,控件定位技术来完成游戏的自动化。附加专用的 IDE 来完成脚本的快速编写


安装和初始化

注: 要有一个好的网络,如果第一步 install执行失败的,没啥好问的,都是你网络的问题

初始化说明

大家看到很多帖子都说明需要初始化,但是它具体执行了什么呢?如果出现问题我们又改如何解决呢?这时候我们可以看一下他里面具体做了啥.
初始化源码连接地址 从源代码中可以看出来,一种需要下载 5 个东西, app-uiautomator.apk app-uiautomator-test.apk atx_agent minicap minitouch 具体的作用就不介绍了, 反正大家都知道的.

初始化入口函数,图片如下,源代码位置 命令入口定义的位置

从上述代码中发现,会获取本机连接的adb 设备 然后执行 install 操作, 对应代码如下:

def install(self, server_addr=None):
    self.logger.info("Install minicap, minitouch")
    self.push_url(self.minitouch_url)
    if self.abi == "x86":
        self.logger.info(
            "abi:x86 seems to be android emulator, skip install minicap")
    elif int(self.sdk) >= 29:
        self.logger.info("Android Q (sdk:29) has no minicap resource")
    else:
        for url in self.minicap_urls:
            self.push_url(url)

    self.logger.info(
        "Install com.github.uiautomator, com.github.uiautomator.test %s",
        __apk_version__)

    if self.is_apk_outdate():
        self.shell("pm", "uninstall", "com.github.uiautomator")
        self.shell("pm", "uninstall", "com.github.uiautomator.test")
        for url in self.apk_urls:
            path = self.push_url(url, mode=0o644)
            package_name = "com.github.uiautomator.test" if "test.apk" in url else "com.github.uiautomator"
            if os.getenv("TMQ"):
                # used inside TMQ platform
                self.shell(
                    "CLASSPATH=/sdcard/tmq.jar", "exec", "app_process",
                    "/system/bin",
                    "com.android.commands.monkey.other.InstallCommand",
                    "-r", "-v", "-p", package_name, path)
            else:
                self.shell("pm", "install", "-r", "-t", path)
    else:
        self.logger.info("Already installed com.github.uiautomator apks")

    self.logger.info("Install atx-agent %s", __atx_agent_version__)
    path = self.push_url(self.atx_agent_url,
                         tgz=True,
                         extract_name="atx-agent")
    args = [path, "server", "--nouia", "-d"]
    if server_addr:
        args.extend(['-t', server_addr])
    self.shell(path, "server", "--stop")
    self.shell(*args)

    self.logger.info("Check install")
    self.check_atx_agent_version()
    print("Successfully init %s" % self._device)

总结起来就是下载安装两个 apk, 下载三个文件在/data/local/tmp ,然后启动 agent, 其余的函数自己看看吧.

agent 说明

这个项目的主要目的是为了屏蔽不同安卓机器的差异,然后开放出统一的 HTTP 接口供 openatx/uiautomator2使用。项目最终会发布成一个二进制程序,运行在 Android 系统的后台。

以上内容摘录官方 github 说明,着就是为啥atx 可以脱机使用也就是我们前面画的图, 我们和手机所有的交互都是通过agent 然不是直接和uiautomator, api 接口描述可以看官方的 readme

每个接口对应的 web 服务的路由可以查看这里 httpserver

这里可以看出/jsonrpc/0 ping 等一些请求是发送给uiautomator执行的, 如果一些请求不好用,可以判断出到底是agent还是uiautomator出了问题.

最后这里就是agent启动部分代码 , 希望对你有所帮助.

扩展阅读

项目地址 https://github.com/openatx/uiautomator2

  1. ATX 安卓设备集群管理 atx-server https://testerhome.com/topics/11546
  2. 浅谈自动化测试工具 https://testerhome.com/topics/11357


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