这几天阅读了一下atx
的代码,顺便发现群里这两天一些伙伴想知道具体u2
是如何和手机进行交互的? 其实相关的交互流程已经有人写好了,就像我下面这段是直接抄过来的,建议初学的小伙伴尽量把atx
的帖子都阅读一遍,心里初步会有一个他具体能做什么有一个了解.
ATX(AutomatorX) 是一款开源的自动化测试工具,支持测试 iOS 平台和 Android 平台的原生应用、游戏、Web 应用。 使用 Python 来编写测试用例,混合使用图像识别,控件定位技术来完成游戏的自动化。附加专用的 IDE 来完成脚本的快速编写
pip3 install -U uiautomator2
安装 uiautomator2
python3 -m uiautomator2 init
安装包含httprpc
服务的apk
到手机 +atx-agent, minicap, minitouch
注: 要有一个好的网络,如果第一步 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, 其余的函数自己看看吧.
这个项目的主要目的是为了屏蔽不同安卓机器的差异,然后开放出统一的 HTTP 接口供 openatx/uiautomator2使用。项目最终会发布成一个二进制程序,运行在 Android 系统的后台。
以上内容摘录官方 github 说明,着就是为啥atx 可以脱机使用
也就是我们前面画的图, 我们和手机所有的交互都是通过agent
然不是直接和uiautomator
, api 接口描述可以看官方的 readme
每个接口对应的 web 服务的路由可以查看这里 httpserver
这里可以看出/jsonrpc/0
ping
等一些请求是发送给uiautomator
执行的, 如果一些请求不好用,可以判断出到底是agent
还是uiautomator
出了问题.
最后这里就是agent
的启动部分代码 , 希望对你有所帮助.
项目地址 https://github.com/openatx/uiautomator2