Python uiautormator2 APP自动化操作说明

一、安装环境:

python3.8.5,adb1.0.41,uiautomator2 2.11.3,weditor 0.6.1

1、整合环境下载:

创建一个 requirements.txt 文件,格式为:包名==版本。
通过pip instll -r ./requirements.txt 命令来安装。

# requirements.txt
uiautomator2==2.11.3
weditor==0.6.1

2、单个环境下载

安装方式:pip install --pre uiautomator2。

注意:在安装失败后,可以切换方式下载
把 --pre 换成 -U 或者 -e 或者
(清华镜像地址)
-i https://pypi.tuna.tsinghua.edu.cn/simple/
(中科大镜像地址)或者
-i https://pypi.mirrors.ustc.edu.cn/simple/
(阿里云镜像地址)或者
-i https://mirrors.aliyun.com/pypi/simple/
(豆瓣镜像地址)或者
-i http://pypi.douban.com/simple/ 再进行安装
推荐 -i 方式快速下载

二、连接设备(adb、weditor)

基本上所有的UI点击都需要adb的安装,在使用是请确认已经安装部署了adb,手机/设备均已开启开发者模式。

1、连接手机

1.1、连接方式:电脑USB直连手机。

开启开发者模式:手机设置 -> 关于手机 -> 连续点击版本号自动进入开发者模式(在开发人员选项中开启USB调试,配对)
寻找到序列码:手机设置 -> 关于手机 -> 状态信息 -> 序列码

C:\Users\>adb devices
List of devices attached
PJD4F7487584559        device

1.2、连接android设备

连接方式:电脑远程连接设备(同局域网下)

C:\Users\>adb connect 192.168.0.100
* daemon not running; starting now at tcp:5037
* daemon started successfully
connected to 192.168.0.100:5555

C:\Users\>adb devices
List of devices attached
192.168.0.100:5555      device

2、开启weidtor

# 命令行输入以下命令,自动开启默认浏览器打开weditor服务器。
C:\Users\>python -m weditor

2.1、浏览器自动打开的weditor服务器功能说明

Arima算法代码 python auto arima python_文件管理器


2.1.1、(weditor版本号)ATE WEditor 0.6.1

2.1.2、(安卓系统/苹果系统)Android/ios

2.1.3、(设备序列号/IP)PJD4F7487584559/192.168.0.100

2.1.4、(连接按钮)connect

2.1.5、(获取当前最新页面按钮)Dump Hierarchy

2.1.6、(获取页面方式为静态或者实时)静态&实时

三、开始使用代码UI点击

1、代码连接

import uiautomator2 as u2
d = u2.connect('192.168.0.100')
print(d.devices_init)

2、开始测试

UI点击测试主要用于长时间不改变的测试项目,程序APP是长时间不会做出更改的首要测试项。

2.1、启动/关闭应用程序APP

启动应用程序有很多种方式,其中最为我们喜欢的是,直接定位包名来启动APP,虽然也可以通过桌面坐标来启动APP,但如果程序位置该表,坐标则错误。

先打开文件管理器应用程序,如下图所示:Prop是定位方法,Value是所在页面的定位元素

Arima算法代码 python auto arima python_文件管理器_02

2.1.1、开始示例
import uiautomator2 as u2
d = u2.connect('192.168.0.100')
print(d.devices_init)

# 启动文件管理器APP
d.app_start('com.base.module.filemanager')

# 结束文件管理器APP进程
d.app_stop('com.base.module.filemanager')

四、常用元素定位

1、xpath定位
 d.xpath(‘//*[@resource-id=“com.base.module.filemanager:id/file_path_list”]/android.widget.RelativeLayout[2]/android.widget.ImageView[1]’)
 在以上方法都不行时就需要xpath定位了,弊端是APP的classname和元素ID比较长,会使代码量增加,同样的效果使用APP爬虫,xpath的优势是很明显的。2、坐标定位
 d.click(0.132, 0.095)使用cilck方法是通过(ax,ay,bx,by)坐标定位需要点击的元素,通过这个方法可以精准点击所在坐标,局限性:具有固定性。3、className定位
 d(className = ‘android.widget.TextView’)这个方法也很方便,弊端是同个界面可以存在多个元素使用同一个className。4、text定位
 d(text = ‘内置存储’)使用文本去定位需要操作的区域,优势:方便进行定位,局限性:在没有文本的就不能进行此项操作。5、resourceId定位
 d(resourceId = ‘com.base.module.filemanager:id/file_image’)这种方法虽然是最方便的,但APP不是每个界面都有该标识符。

五、常用方法

1、应用事件

# 应用安装APP
d.app_install('本地下载地址')

# 启动文件管理器APP
d.app_start('com.base.module.filemanager') # filemanager是文件管理器的英文

# 清空文件管理器APP进程
d.app_clear('com.base.module.filemanager')

# 停止APP
d.app_stop('com.base.module.filemanager')

停止所有app/停止除了此app之外的app
d.app_stop_all()
d.app_stop_all(excludes=‘包名’)

# 当前应用
d.app_current()

# 获取应用信息
d.app_info()
img = d.app_icon('包名')
img.save('存储路径名')  #如果只写图像名 则会保存在当期那文件夹下

# 等待应用运行
d.app_wait('com.base.module.filemanager')

2、软硬件按键操作

# 回到桌面
d.press("home")  

# 返回
d.press("back") 

# 菜单按钮
d.press("menu")

# 上
d.press("up")

# 下
d.press("down")

# 左
d.press("left")

# 右
d.press("right")

# 休眠
d.press("power") 

# 确定
d.press("enter")

# 摄像头
d.press("camera")

# 音量+键
d.press('volume_up')  

# 音量-键
d.press('volume_down')  

# 后台按键
d.press('center')  

# 设置
d.settings

#下拉状态栏
d.open_notification() 

# 下拉状态栏到底显示详情
d.open_quick_settings() 

# 刷新页面
d.dump_hierarchy(time)

3、点击事件

# 点击
d.click(time)
d.click_exists(time)  # time为元素未找到持续等待的时间

# 双击
d.double_click()

# 长按
d.long_click(time)  # time是长按的时间

4、推拽事件

# 左右滑动
d.swipe(sx, sy, ex, ey, 0.5)  # 参数依次为滑动两点的x,y轴坐标,最后的参数为时间

# UI自动手势密码滑动解锁
self.d.swipe_points([(0.27, 0.362),(0.5, 0.357),(0.723, 0.358),(0.726, 0.464), (0.503, 0.468),(0.493, 0.571)],0.1)点滑动,数组传参,用于手势密码等自动化

# 拖动
d.drag(sx, sy, ex, ey, 0.5)  # 参数依次为滑动两点的x,y轴坐标,最后的参数为时间

# 右拖动百分之60%
d.swipe_ext("right", 0.6)

# 左拖动百分之80%
d.swipe_ext("left", 0.8)

# 上下滚动
d(scrollable=True).fling() # 滚动到顶部
d(scrollable=True).fling.toEnd() # 滚动到底部
d(scrollable=True).scroll.to(text="声音") # 滚动到指定的text元素

5、文本输入/输出/获取

# 输入
d.send_keys('xxx') # xxx为输入的字符串
d.set_text('xxx')  

# 清空
d.clear_text()  # 将输入框数值清空

# 获取输入框内的数值
d.get_text()  # 获取控件文本值

6、调试事件

# 截取LCD界面图片,将图片命名为xxx.jpg
d.screenshot("xxx.jpg") # 需要pillow库的支持

# 视频录制
d.screenrecord('output.mp4')   

# 判断元素是否存在
d.exists(timeout=5)timeout不是必需品,默认为立马判断,设置后可以等待,判断元素是否存在存在返回True,不存在返回False。

# 调试开关
d.debug = True

# 监控
d.watcher

# 显示信息
d.info  #控件信息获取,是否置灰,各种定位元素的值等等,下述举两个常见的例子
d.info['text'] # 通过resourceId的值获取该控件的text文本
d.info['enabled'] # 返回Flase为置灰状态,反之高亮 

# 获取屏幕的状态
print(d.info.get('screenOn))
return True or False

PS:全面的API文档请参考官 https://github.com/openatx/uiautomator2
PS:文档仅供学习参考使用