用python做app的自动化测试,目前有两种方式可以完成:
1. Appnium自动化模拟操作
由于Appnium不是一个库,是一套软件,安装需要java环境等,还有配置,非常麻烦,所以这里不考虑
2. 用uiautomator2库自动化模拟
uiautomator2比Appnium简单易上手,但是目前相关代码较少,本文将尝试用该库解决手机app的自动化问题。(uiautomator2只能操作安卓系统,ios系统不兼容,如果是苹果手机就没必要往后看了)
一、 软件准备
· python3
· pycharm或其他IDE
· 安卓手机或模拟器
二、 adb安装使用
adb的官网介绍:Android 调试桥(adb)是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令便于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序。
我们需要的就是下载adb并通过其获取我们连接的手机设备的数据,确保通信正常,uiautomator2的指令可以被手机系统接收。
adb在官网直接下载安装好就可以了,为了能够在终端快速使用还需要配置一下环境变量:将adb的安装路径写入Path环境变量中:G:\platform-tools-latest-windows\platform-tools
在终端中输入adb查看是否可以正常使用,
输入adb devices查看当前连接的设备有哪些
注:部分手机通过USB连接在电脑上后,需要调整为开发者模式,以小米手机为例,需要点击设置-我的设备--全部参数信息,然后对着 ‘OS版本’ 这个框连着点击五下,才能开启开发者模式,同时在开发者模式界面还要打开允许电脑端操作手机的选项。(不同设备具体操作可以小红书查查)
三、 uiautomator2库的基础操作
基础操作如下
清除数据的操作不要轻易尝试!!!特别是在重要的app上运行时,app_clear会直接将app初始化,清空所有内容!!!
# 导入uiautomator2库
import uiautomator2 as u2
# USB连接手机
device = u2.connect('e7cdddd4')
# app安装
device.app_install('url')
# app卸载
device.app_uninstall('pkg_name')
# app启动
device.app_start('pkg_name')
# app关闭
device.app_stop('pkg_name')
# 获取正在运行的app
device.app_current()
# 获取app信息
device.app_info()
# 列举正在运行的 app
device.app_list_running()
# 清除app数据
device.app_clear('pkg_name')
获取pkg_name的方式
# 获取手机端所有运行app的包名
print(device.app_list_running())
# 获取手机端屏幕上正在运行app的包名
print(device.app_current())
设备操作方式
# 设备信息
device.device_info
# 屏幕大小
device.window_size()
# 截屏
device.screenshot('test.png')
# 将电脑文件d:\demo.txt传输到手机的/data/目录上
device.push(r'd:\demo.txt', '/data/')
# 将手机的/data/目录上的demo.txt文件传输到电脑的D盘目录下,并重新命名为demo.txt
device.pull('/data/demo.txt', r'd:\demo.txt')
此外,如果想要知道手机存储的目录结构,以及文件在哪个位置,可以通过adb查询
# 在powershell终端中进入手机系统终端
adb shell
# 列出目录并进入,其指令和linux终端类似
ls
按键操作方式
device.screen_on()
device.screen_off()
device.press('home')
device.press('back')
device.press('left')
device.press('right')
device.press('up')
device.press('down')
device.press('center')
device.press('menu')
device.press('search')
device.press('enter')
device.press('camera')
device.press('power')
以及还有其他操作,如果有需要随时查就可以了
四、 元素定位辅助工具weditor
安卓系统的app界面用的是标记型语言xml,如果要自动化操作app,就必须通过界面的xml代码内容获取控件信息,来完成点击、删除、输入等指令。
在终端安装weditor,如果安装失败可以安装较低版本的
pip install weditor
然后再终端输入 weditor 指令就可以打开weditor界面
weditor
在这个界面点击刷新并连接就好
通过点击不同的界面元素就可以在左侧得到这个元素的具体属性信息,右侧会给出uiautomator2的相应操作代码。
Hierarchy则保存着每个元素的结构从属关系信息
元素定位方式有很多
举几个简单例子
d(resourceId="com.tencent.mm:id/kbq", text="夏然").click()
d.xpath('//*[@resource-id="com.tencent.mm:id/hbs"]/android.widget.LinearLayout[3]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.view.ViewGroup[1]/android.view.ViewGroup[1]/android.widget.FrameLayout[3]').click()
五、 通过元素定位进行app自动化操作
<点击>操作
# 通过定位元素点击操作
d.(resourceId="com.tencent.mm:id/kbq", text="夏然").click()
# 通过全局坐标点击操作
d.click(x, y)
# 通过绝对坐标百分比点击操作, u2会自动识别百分比形式
d.click(0.8, 0.65)
<滑屏>操作
# 全局滑动
d.swipe_ext(direction, scale)
eg. d.swipe_ext('left', scale=0.9)
# 元素滑动
e = d(resourceId="com.tencent.mm:id/kbq", text="夏然")
e.swipe('down', steps=10)
<输入/清空>操作
# 输入操作举例
mobile_elem=d(resourceId="com.lemon.lemonban:id/et_mobile")
mobile_elem.send_keys('1819')
# 清空操作举例
mobile_elem.clear_text()
python指令的执行往往比app界面的响应速度快,为了防止页面没有加载完成就开始了下一步操作,一般会加入等待的命令
time.sleep(3)
差不多这些够用了,可以自己上手琢磨琢磨