一、要求

python 3.6+

android 4.4+

二、地址

GitHub地址:https://github.com/openatx/uiautomator2

or https://github.com/openatx/uiautomator2/blob/master/README.md

 

三、移动端工具安装

1、安装uiautomator2

pip install --pre uiautomator2
pip install pillow

2、初始化

部署相关的守护进程。

电脑连接上一个手机或多个手机, 确保adb已经添加到环境变量中,执行下面的命令会自动安装本库所需要的设备端程序:

uiautomator-server 、
atx-agent、
openstf/minicap、
openstf/minitouch、
python -m uiautomator2 init

安装完成,设备上会多一个uiautomator的应用。

 

配置手机设备参数:

有两种方法

WIFI:WiFi连接更方便一点,需要保持PC和手机使用的一个WIFI,查看手机连接WIFI的IP地址。

USB:通过USB数据线将手机链接电脑即可。


四、测试

在编程工具运行以下脚本

import uiautomator2 as u2
d = u2.connect('127.0.0.1::6555')
print(d.info)

打印结果:

{'currentPackageName': 'com.android.launcher', 'displayHeight': 1280, 'displayRotation': 1, 'displaySizeDpX': 360, 'displaySizeDpY': 640, 'displayWidth': 720, 'productName': 'DUK-AL20', 'screenOn': True, 'sdkInt': 23, 'naturalOrientation': False}


五、元素定位

1、查看app控件

我们可以借助Android SDK自的uiautomatorviewer查看元素,这就要求手机必须以USB的方式连接PC,我前面使用的是WIFI连接进行连接的。所以,openatx提供了另外一个工具weditor 来解决这个问题。

GitHub地址:https://github.com/openatx/weditor

  • 安装:
pip install --pre --upgrade weditor
  • 使用
python3 -m weditor
  • 工具打开
默认会通过浏览器打开页面:http://localhost:17310/
  • 操作步骤
  1. 选择android、输入手机或者模拟器的ip+端口,点击connect
  2. dump hierarchy是用来刷新页面的
  3. 鼠标点击想要的元素,就可以查看他们的控件了


六、主要语法

打开app

d.app_start("包名")
怎么获取包名,可以打开app,然后打印http://d.info,得到的结果里的currentPackageName即是包名

关闭app

cls.d.app_stop("包名")

ResourceId定位

cls.d(resourceId="com.addcn.android.house591:id/ad_banner").click()

Text定位

d(text="文本").click()

Description定位

d(description="..").click()

ClassName定位

d(className="android.widget.TextView").click()

xpath定位

d.xpath("//*[@content-desc='分享']").click()

其他操作

默认元素等待超时(秒)
cls.d.wait_timeout = 20.0  #默认20

元素拖拽

d(A).left(B), selects B on the left side of A.
d(A).right(B), selects B on the right side of A.
d(A).up(B), selects B above A.
d(A).down(B), selects B under A.


#选择“Wi-Fi”右侧的“开关” 
d(text="Wi‑Fi").right(className="android.widget.Switch").click()

获取/统计某个相同条件的数目

d(text="Add new").count

或者

len(d(text="Add new"))

得知数目之后,我们可以通过索引去定位

d(text="Add new")[0]
d(text="Add new")[1]

也可以遍历

for view in d(text="Add new"):
    view.info

截图

#截取屏幕截图并保存到计算机上的文件中,要求Android> = 4.2。
d.screenshot( “ home.jpg ”) # get PIL.Image格式化图像。当然,你需要首先安装pillow  
image = d.screenshot() # default format =“pillow” 
image.save( “ home.jpg ”)#或home.png。目前,只有PNG和JPG支持

#得到OpenCV的格式图像。当然,你需要先安装numpy和cv2 
#截取屏幕截图并保存到计算机上的文件中,要求Android> = 4.2。
d.screenshot( “ home.jpg ”) # get PIL.Image格式化图像。当然,你需要首先安装pillow  
image = d.screenshot() # default format =“pillow” 
image.save( “ home.jpg ”)#或home.png。目前,只有PNG和JPG支持

#得到OpenCV的格式图像。当然,你需要先安装numpy和cv2 
#截取屏幕截图并保存到计算机上的文件中,要求Android> = 4.2。
d.screenshot( “ home.jpg ”) # get PIL.Image格式化图像。当然,你需要首先安装pillow  
image = d.screenshot() # default format =“pillow” 
image.save( “ home.jpg ”)#或home.png。目前,只有PNG和JPG支持

#得到OpenCV的格式图像。当然,你需要先安装numpy和cv2 
#截取屏幕截图并保存到计算机上的文件中,要求Android> = 4.2。
d.screenshot( “ home.jpg ”) # get PIL.Image格式化图像。当然,你需要首先安装pillow  
image = d.screenshot() # default format =“pillow” 
image.save( “ home.jpg ”)#或home.png。目前,只有PNG和JPG支持

#得到OpenCV的格式图像。当然,你需要先安装numpy和cv2 
#截取屏幕截图并保存到计算机上的文件中,要求Android> = 4.2。
d.screenshot( “ home.jpg ”) # get PIL.Image格式化图像。当然,你需要首先安装pillow  
image = d.screenshot() # default format =“pillow” 
image.save( “ home.jpg ”)#或home.png。目前,只有PNG和JPG支持

#得到OpenCV的格式图像。当然,你需要先安装numpy和cv2 
#截取屏幕截图并保存到计算机上的文件中,要求Android> = 4.2。
d.screenshot( “ home.jpg ”) # get PIL.Image格式化图像。当然,你需要首先安装pillow  
image = d.screenshot() # default format =“pillow” 
image.save( “ home.jpg ”)#或home.png。目前,只有PNG和JPG支持

#得到OpenCV的格式图像。当然,你需要先安装numpy和cv2
import cv2

image = d.screenshot( format = ' opencv') cv2.imwrite( ' home.jpg '图像)#获取原始JPEG数据 imagebin = d.screenshot(格式= '原始') 打开( “ some.jpg ”, “ WB ”).WRITE(imagebin)

(6)手势操作

1、单击

d( text = “ Settings ”).click()

2、长按

d( text = “ Settings ”).long_click()

3、将对象拖向另一个点或另一个UI对象(拖不能用于为Android <4.3)

d( text = “ Settings ”).long_click()

将UI对象拖动到屏幕点(x,y),0.5秒后 
d( text = “设置”).drag_to(x,y, duration = 0.5)

将UI对象拖动到另一个(中心位置) UI对象,在0.25秒 
d( text = “设置”).drag_to( text = “ Clock ”, duration = 0.25)

4、在屏幕上滑动

# swipe from (sx, sy) to (ex, ey)
d.swipe(sx, sy, ex, ey)
# swipe from (sx, sy) to (ex, ey) with 10 steps
d.swipe(sx, sy, ex, ey, steps=10)

5、在屏幕上拖拽

# drag from (sx, sy) to (ex, ey)
d.drag(sx, sy, ex, ey)

# drag from (sx, sy) to (ex, ey) with 10 steps
d.drag(sx, sy, ex, ey, steps=10)


(7)获取对象信息和状态

d(text="Settings").exists
#如果存在则为True,否则为假
or d.exists(text="Settings") 

d(text="Settings").exists(timeout=3) 
# 等待设置出现在3S,相同.wait(3)

2、检索特定UI对象的信息

d(text="Settings").info
获取/设置/清除可编辑字段的文本(例如,EditText小部件)
d(text = “ Settings ”).get_text()   # get widget text 
d(text = “ Settings ”).set_text(“ My text ... ”)   #设置文本 
d(text = “ Settings ”).clear_text( )   #清除文字、

系统常用按键

d.press.home()

d.press.back()

d.press(0x07, 0x02)

home                   #手机Home键

back                   #手机返回键

left                   #对应键盘上的向右键<-

right                  #对应键盘上的向右键->

up                    #对应键盘上的向上键

down                   #对应键盘上的向下键

center                  #选中?

menu                   #菜单

search                  #查找?

enter                  #对应键盘上的Enter键

delete(or del)                          #对应键盘上的DEL键 用于删除

recent(recent apps)                  #任务切换

volume_up                #声音向上调整

volume_down               #声音向下调整

volume_mute               #静音按键

camera                  #拍照

power                   #电源键