uiautomator2
是一个可以使用Python
对Android
设备进行UI自动化的库。其底层基于Google uiautomator
,Google提供的uiautomator
库可以获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作。
参考地址
image.png
如图所示,python-uiautomator2主要分为两个部分,python客户端,移动设备
整个过程
pip install uiautomator2
import uiautomator2 as u2
# 连接手机
device = u2.connect()
# 打开被测试应用
device(text='探探').click()
adb forward --list
# emulator-5554 tcp:54572 tcp:7912
# 通过usb
import uiautomator2 as u2
# 通过usb的链接
device = u2.connect('emulator-5554')
# 通过wifi手机ip[:7912]
# 需要加协议名称http or https
device = u2.connect('http://127.0.0.1')
device = u2.connect('http://127.0.0.1:7912')
print(device.device_info)
# 与默认的connect()方法比不需要加http或者https
device = u2.connect_wifi('127.0.0.1')
device = u2.connect_wifi('127.0.0.1:7912')
device = u2.connect()
#安装app
douyin_apk_download_url = 'http://app.mi.com/download/431355?id=com.ss.android.ugc.aweme&ref=appstore.mobile_download&nonce=-688070196286123466%3A26744574&appClientId=2882303761517485445&appSignature=YiaWgKkNy45Xpev7GFmgZjmGu-UmN7HVvzljPIuovBY'
device.app_install(data=douyin_apk_download_url)
data
参数可以是下载地址或者本地apk文件路径# 1. 要获取包名打开app
device(text='抖音').click()
# 2.获取当前运行app取包名
print(device.app_current())
# {'package': 'com.android.settings', 'activity': 'com.android.settings.SubSettings'}
# 获取所有正在运行的程序
device.app_list_running()
# adb指令获取
adb shell dumpsys activity | find "mFocusedActivity"
adb shell dumpsys activity top | find ACTIVITY
# 以上命令Linux或者macOS替换 find 为 grep
# aapt
aapt dump badging file.apk
# file.apk是apk路径,必须要有apk文件
device.app_uninstall(package_name= 'com.p1.mobile.putong')
package_name
需要卸载的app包名device(text='探探') # 是直接在首屏点击启动
# 直接打开app,传入package_name
device.app_start(package_name='com.p1.mobile.putong')
device.app_stop(package_name='com.p1.mobile.putong')
device.app_clear(package_name='com.p1.mobile.putong')
import uiautomator2 as u2
device = u2.connect()
print(device.info)
# {'currentPackageName': 'com.p1.mobile.putong', 'displayHeight': 1664, 'displayRotation': 3, 'displaySizeDpX': 400, 'displaySizeDpY': 640, 'displayWidth': 1040, 'productName': 'cancro', 'screenOn': True, 'sdkInt': 23, 'naturalOrientation': False}
# {'udid': 'ZX1G42CPJD-08:00:27:8d:95:e2-Pro_7', 'version': '6.0.1', 'serial': 'ZX1G42CPJD', 'brand': 'Meizu', 'model': 'Pro 7', 'hwaddr': '08:00:27:8d:95:e2', 'port': 7912, 'sdk': 23, 'agentVersion': '0.9.5', 'display': {'width': 1664, 'height': 1040}, 'battery': {'acPowered': True, 'usbPowered': False, 'wirelessPowered': False, 'status': 2, 'health': 2, 'present': True, 'level': 55, 'scale': 100, 'voltage': 3900, 'temperature': 275, 'technology': 'Li-poly'}, 'memory': {'total': 3628052, 'around': '3 GB'}, 'arch': '', 'owner': None, 'presenceChangedAt': '0001-01-01T00:00:00Z', 'usingBeganAt': '0001-01-01T00:00:00Z', 'product': None, 'provider': None}
import uiautomator2 as u2
device = u2.connect()
print(device.window_size())
#(1664, 1040) (宽度,高度)
import uiautomator2 as u2
device = u2.connect()
device.screenshot('test.png')
device.push(src='test.png',dst='/data/')
src
是本地路径,dst
是手机路径device.pull(src='/data/test.png',dst='test1.png')
src
是手机文件路径,dst
是要拉去到本地电脑路径device.screen_on() # 点亮屏幕
device.screen_off() # 熄灭屏幕
device.press('home') # 手机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') #对应键盘上的Enter键
device.press('delete') #对应键盘上的DEL键 用于删除
device.press('recent') #任务切换界面
device.press('camera') #拍照
device.press('power') #电源键
device.press('volume_up') #声音向上调整
device.press('volume_down') #声音向下调整
device.press('volume_mute') #静音
Android keycode
通过某一些特征(定位的依据),确定在一个页面中要操作的实例(元素)。
device(text='探探').click()
uiautomator2
代码pip install weditor
命令行输入weditor
,启动weditor
weditor
自动打开浏览器,可以操作web页面,辅助定位
image.png
className
image.png
首先要知道:APP页面是由XML
构成的
一个元素的属性都可以作为定位的条件
说明:
Contains:包含
Matches:正则匹配
StartsWith:以什么开头
ele = d(resourceId="com.android.packageinstaller:id/permission_deny_button",text='拒绝')
ele = d(resourceId="com.android.packageinstaller:id/permission_deny_button",instance=0)
ele= d(resourceId="com.android.packageinstaller:id/button").sibling(resourceId='com.android.packageinstaller:id/permission_deny_button')
ele = d(resourceId="com.android.packageinstaller:id/button").child(resourceId='com.android.packageinstaller:id/permission_deny_button')
ele = d(resourceId="com.android.packageinstaller:id/button")
ele.left().click() # 左
ele.right().click() # 右
ele.up().click() # 上
ele.down().click() # 下
d.xpath("//*[@content-desc='分享']").click()
d(text='我的').click
d.click(688,1553) #不建议使用
d.click(0.765,0,971)# 百分比适用于不同屏幕大小的手机
d.swipe(self, fx, fy, tx, ty, duration: Optional[float] = None, steps: Optional[int] = None)
d.swipe_ext(direction='left',scale=0.9)
# 先元素定位,再滑动
e = d(text='就业信息')
e.swipe('down',steps=10)
# 先元素定位,在元素对象上输入
e.send_keys() # 输入
e.set_text() # 输入
e.clear_text() # 清除
d.screenshot('weixin.png')
# 如果不加参数则
im = d.screenshot()
im.save('hello.png')
# 处理1:模糊
from PIL import ImageFilter
im2 = im.filter(ImageFilter.BLUR)
im2.save('helloblur.png')
# 处理2:指定大小
im3 = im.resize((200,400))
im3.save('hellosize.png')
import time
time.sleep(10)
UIautomator2默认就有20s等智能等待时间,每一个操作api都可以通过参数
timeout
单独该表等待时间,也可覆写默认全局等待时间
# wait默认20s,超时会报错
d.app_start('',wait=True)
# 修改默认时间两种方式,全局设置隐式等待时间
d.wait_timeout=30
d.implicitly_wait(30)
d.wait_activity('页面')
d(text='我的').wait()
d(text='我的').wait_gone()
e.click(timeout=50)
d(text='我的').exist()
e.sleep(10)
- 智能等待
> UIautomator2默认就有20s等智能等待时间,每一个操作api都可以通过参数`timeout`单独该表等待时间,也可覆写默认全局等待时间
- 智能等待APP启动完成
```python
# wait默认20s,超时会报错
d.app_start('',wait=True)
# 修改默认时间两种方式,全局设置隐式等待时间
d.wait_timeout=30
d.implicitly_wait(30)
d.wait_activity('页面')
d(text='我的').wait()
d(text='我的').wait_gone()
e.click(timeout=50)
d(text='我的').exist()
文章参考:倔强的数学天才