ATX 另一种在 Android 手机内执行 UI 自动化测试方法-Termux

linpengcheng · 2019年01月22日 · 最后由 hmonline 回复于 2021年11月25日 · 6333 次阅读

之前写过一篇帖子 ATX-uiautomator2 使用 QPython 在 Android 手机内执行自动化
通过 qpython 来实现手机内执行 python 脚本运行 UI 自动化,但是 qpython 是直接将 uiautomator2 的整个库文件夹 push 到手机,在安装 pip 相关依赖包的时候也挺麻烦的。
后来发现了一个 Android 端的神器-- Termux

Termux 是一款开源且不需要 root,运行在 Android 终端上极其强大的 linux 模拟器,支持 apt 管理软件包,完美支持 python,ruby,go,nodejs。

通过 termux 可以安装好 python 环境 下载需要的 pip 库,使得在手机端可以直接运行起来 python 编写的自动化的脚本成为可能。

1、安装 Termux

Termux 仅支持 Android 5.0 及以上版本。在国内建议使用F-Droid安装 Termux(先下载安装 F-Droid,再在 F-Droid 内部搜索 Termux,然后点击安装)

在桌面点击安装后的 Termux 图标,我们就启动了一个 Termux 应用,见下图:

(1)基本使用
  • Termux 界面长按屏幕,显示菜单项(包括返回、复制、粘贴、更多),此时屏幕出现可选择的复制光标。
  • Termux 界面从左向右滑动,显示隐藏式导航栏,可以新建、切换、重命名会话 session 和调用弹出输入法
(2)常用快捷键

音量 - 键模拟(Ctrl)键

音量-键(Ctrl)+L                清除屏幕内容
音量-键(Ctrl)+C                终止当前操作
音量-键(Ctrl)D                 退出当前会话session
音量+键+D                      Tab键(可自动补全命令或文件名)
音量+键+W                      方向键 上(可显示前一条命令)
音量+键+S                      方向键 下(可显示后一条命令)
音量+键+A                      方向键 左(可左移动光标)
音量+键+D                      方向键 右(可右移动光标)
音量+键+Q                      显示或关闭扩展键(ESC、插入链接CTR、ALT、TAB、-、/、|以及左滑扩展键一栏可切换到全功能支持手机输入法的输入框)

更多快捷按键参考官网介绍,有蓝牙键盘的读者可以参考硬件快捷键使用

(3)常用命令
apt update                    更新源
apt search <query>            全文搜索可安装包
apt install <package>         安装软件包
apt upgrade                   升级软件包
apt show  <package>           显示软件包的信息
apt list [--installed]        列出所有(或已安装)的软件包信息
apt remove <package>          删除软件包
chmod                         修改文件权限
chown                         修改文件归属

2、python&uiautomator2 安装

在安装好了 Termux 之后,需要配置好 python 的环境和安装好 uiautomator2 库,在终端执行下面 2 行命令就好了。

apt install python
pip install --pre uiautomator2

3、存储

termux 执行命令的路径是私有的内部存储 (private internal storage),这类存储的特点是 termux 应用内部的、私有的,一旦 termux 被卸载,这些数据也将不复存在。Android 下还有另外两种存储类型:shared internal storage 和 external storage。所谓 shared internal storage 是手机上所有 App 可以共享的存储空间,放在这个空间内的数据不会因为 App 被卸载掉而被删除掉;而外部存储 (external storage) 主要是指外部插入的 SD Card 的存储空间。默认情况下,Termux 只支持 private internal storage。

那么,想要让写的脚本在 termux 上执行起来改怎么办呢,总不能直接用 termux 来写 python 的脚本吧。
Termux 提供了一个名为termux-setup-storage的工具,可以让你在 Termux 下访问和使用 shared internal storage 和 external storage;该工具是termux-tools的一部分,你可以通过apt install termux-tools来安装这些工具。

执行termux-setup-storage(注意:这个命令只能在手机上执行才能弹出授权对话框,通过远程 ssh 登录后执行没有任何效果) 时,手机会弹出一个对话框,让你确认授权.

一旦授权,termux-setup-storage 就会在 HOME 目录下建立一个 storage 目录,该目录下的结构如下:

➜  /data/data/com.termux/files/home $tree storage
storage
├── dcim -> /storage/emulated/0/DCIM
├── downloads -> /storage/emulated/0/Download
├── movies -> /storage/emulated/0/Movies
├── music -> /storage/emulated/0/Music
├── pictures -> /storage/emulated/0/Pictures
└── shared -> /storage/emulated/0

6 directories, 0 files

可以看到 termux 下,termux-setup-storage 在 storage 下建立了 6 个符号链接,其中 shared 指向 shared internal storage 的根目录,即/storage/emulated/0;其余几个分别指向 shared 下的若干功能目录,比如:相册、音乐、电影、下载等。

这样一来,在电脑上写好的 python 脚本文件,直接 push 到手机之后,就可以通过 termux 来运行了。

4、运行脚本

在电脑上编写好测试的脚本(以网易云音乐为例),因为是直接在手机本地的,所以注意 ip 需要修改成为0.0.0.0

import uiautomator2 as u2

def main():
    u = u2.connect('0.0.0.0')
    print(u.info)
    u.app_start('com.netease.cloudmusic')
    u(text='私人FM').click()
    u(description='转到上一层级').click()
    u(text='每日推荐').click()
    u(description='转到上一层级').click()
    u(text='歌单').click()
    u(description='转到上一层级').click()


if __name__ == '__main__':
    main()

然后将这个脚本文件 push 到手机中,然后在 termux 中执行这个 python 文件就 ok 了
前置条件: 手机通过 uiautomator2 init 成功 且 atx-agent 仍然可正常连接

cd storage
cd shared
python termuxdemo.py

看看运行的效果

参考资料:

基于 Termux 打造 Android 手机渗透神器
Hello,Termux

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

整麻烦了,可以直接写 java 层

好多做测试的不会 java 啊

刚有这个想法,你就实现了,牛逼

正在搞这个,之前也是看了楼主的帖子收到启发,弄个手游小辅助,可是这个前置条件:手机通过 uiautomator2 init 成功 且 atx-agent 仍然可正常连接太烦人,每次还要通过电脑来执行启动命令,想在 termux 直接执行"python -m uiautomator2 init"没反应,楼主有什么办法吗

sdqsdq 回复

没有

我去...厉害了呀

小试了一下,还是可以的;华为手机不用想,不支持 termux,用的是自家的麒麟;执行脚本还需要进 termux 里面执行,有没有啥其他方式呢

riklu 回复

啥?

@linpengcheng 需要进入 termux 后在进入脚本目录,然后执行 py 脚本才可以;还有其他的或者命令行的模式执行吗

问下楼主, u.app_start('com.jingdong.app.mall') 这一句提示 “SessionBrokenError('com.jingdong.app.mall')”,'package not found'

cmetl 回复

包名错了吧 或者没安装这个 app

17楼 已删除
linpengcheng 回复

找到原因了。,所有 app 的名称在/android/data/下。

另外还要问下楼主,我想安装 pillow,但是提示 zlib 问题。具体报错好长,好像说的是 zlib 的问题,但是我 zlib 已经安装了,费解,我主要是想用 pillow 查看页面元素

cmetl 回复

是因为依赖库的关系,可以试试如下方式安装,我这边测试安装成功(仅安装没有跑过自动化脚本)
pkg upgrade
apt install python
pkg install -y python ndk-sysroot clang make libjpeg-turbo
pkg install clang
pkg install libxml2 libxslt
pip install cython
pip install lxml
pip install --pre uiautomator2

cmetl 回复

多半 clang 没装。

我采用这个方案是来解决播放声音的

事实上我是用 PC 来控制手机的,python 都在 PC 运行,但是通过 adb 无法让手机在后台播放声音,只是能启用播放器之类的在前台通过应用的方式来播放,这个达不到我的要求,我的要求是通过 PC+adb 来控制手机按住比如抖音的长按发送语音键,然后这个时候如果可以说话?直接替换麦克风声音是做不到,只能是让手机的外放来播放声音了,所以通过 play-audio 来播放声音,在手机安装 Termux,然后手机上安装 play-audio,然后写一个 py 文件
然后 PC 上 python 代码在按住手机语音键的时候,通过 ssh 来控制 Termux,执行手机内写好的 py 文件来通过 play-audio 播放指定的 mp3 文件,这样就实现了 PC 控制手机的触摸 + 播放,实现了直接在抖音或者微信上按住语音发送指定声音的需求。

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