一、简介
uiautomator2是一个python库,用于Android的UI自动化测试,其底层基于Google uiautomator,Google提供的uiautomator库可以获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作
python-uiautomator2主要分为两个部分,python客户端,移动设备:
-
python端: 运行脚本,并向移动设备发送HTTP请求
-
移动设备:移动设备上运行了封装了uiautomator2的HTTP服务,解析收到的请求,并转化成uiautomator2的代码。
整个过程
- 在移动设备上安装atx-agent(守护进程), 随后atx-agent启动uiautomator2服务(默认7912端口)进行监听
- 在PC上编写测试脚本并执行(相当于发送HTTP请求到移动设备的server端)
- 移动设备通过WIFI或USB接收到PC上发来的HTTP请求,执行制定的操作
二、安装
下载夜神模拟器夜神安卓模拟器-手游模拟器电脑版_夜神模拟器官网
安装后,在【设置——关于——版本号】连续点击5次以上,就可以在【设置】出现【开发者选项】,选择【开启】,打开【USB调试】,cmd输入adb devices。
如果没有出现设备号List of devices attached,就要把夜神模拟器的exe目录下的nox_adb.exe改其他名字如nox_adb_1.exe,复制adb.exe改名为nox_adb.exe到该目录下,重启模拟器,重新打开cmd输入adb devices就可以了。如果还是没有设备号的话,看看执行指令的cmd窗口路径,直接用windos+R输入cmd的默认路径就可以的。
安装qq,可以在应用商城直接下载,也可以用apk
安装uiautomator2
pip install --upgrade --pre uiautomator2
执行下面的命令会自动安装本库所需要的设备端程序:
uiautomator-server,atx-agent,openstf / minicap,openstf / minitouch
init就是所有USB连接电脑的手机上都安装uiautomator2
python -m uiautomator2 init
安装weditor,快速的识别手机上的元素
pip install weditor==0.6.4
python -m weditor
运行后浏览器跳转到http://localhost:17310/
输入设备号,点击connet,可以选择实时看
2、登录
用uiautomator2 登录QQ 号,再用qq登录游戏。
查看包名:点击应用中的元素就可以看到了
import uiautomator2 as u2
import json
class HandleWDJ(object):
def __init__(self, serial="127.0.0.1:62001"):
self.d = u2.connect_usb(serial=serial)
# self.handle_WDJ_watcher()
pass
def read_config(self):
with open(r"F:\\wc\\hyp\\config.json") as json_file:
config = json.load(json_file)
globals().update(config)
return config
# 监控器
def handle_WDJ_watcher(self):
self.d.watcher.when(information['shouquan']).click()#去授权
self.d.watcher.when(information['yinsi']).click()#同意服务隐私
self.d.watcher.when(information['yunxu']).click() # 访问照片允许
self.d.watcher.start()
pass
def close_app(self):
# 关闭监控
self.d.watcher.stop()
self.d.app_stop(mess['app_name'])
self.d.app_clear(mess['app_name'])
pass
def handle_WDJ_app(self):
self.d.app_start(package_name=mess['app_name'])
# 进入登录界面
self.d(resourceId=mess['login_button']).click()
# 输入用户名密码
self.d.xpath(mess['user']).set_text(mess['user_value'])
self.d(resourceId=mess['password']).set_text(mess['pw_value'])
self.d(resourceId=mess['button_ok']).click()
self.handle_WDJ_watcher()
pass
pass
if __name__ == '__main__':
wdj = HandleWDJ()
config1 = wdj.read_config()
mess=config1['db_yuansu']
information = config1['db_information']
wdj.handle_WDJ_app()
# wdj.close_app()
pass
{
"db_information":{
"server":"127.0.0.1:62001",
"yinsi": "//*[@resource-id=\"com.tencent.mobileqq:id/dialogRightBtn\"]",
"shouquan": "//*[@resource-id=\"com.tencent.mobileqq:id/dialogRightBtn\"]",
"yunxu": "//*[@resource-id=\"com.android.packageinstaller:id/permission_allow_button\"]"
},
"db_yuansu":{
"app_name":"com.tencent.mobileqq",
"login_button":"com.tencent.mobileqq:id/btn_login",
"user":"//*[@resource-id=\"com.tencent.mobileqq:id/em2\"]",
"password":"com.tencent.mobileqq:id/password",
"button_ok":"com.tencent.mobileqq:id/login",
"user_value": "1955466033",
"pw_value": "1234"
}
}
import uiautomator2 as u2
class HandleWDJ(object):
def __init__(self, serial="127.0.0.1:62001"):
self.d = u2.connect_usb(serial=serial)
pass
def handle_WDJ_app(self):
self.d.app_start(package_name="com.tencent.start") # 打开游戏
# 进入登录界面
self.d(text="我的").click() # 点击我的
self.d(text="点击登录").click() # 点击登录
self.d(resourceId="com.tencent.start:id/check_protocol").click() # 点击同意协议
self.d(resourceId="com.tencent.start:id/btn_login").click() # 选择登陆方式QQ登录
self.d(text="主页").click() # 点击主页
# 滑动判断是否是需要的游戏
game_name="QQ炫舞2"
for i in range(5):
if self.d(text=game_name):
# assert self.d(text=game_name).get_text()==game_name
self.d(text=game_name).click()
break
self.d.swipe(0.5,0.8,0.5,0.3)
self.d(text="启动游戏").click() # 开始游戏
pass
if __name__ == '__main__':
wdj = HandleWDJ()
wdj.handle_WDJ_app()
# wdj.close_app()
pass