UI自动化uiautomator2

一、简介

uiautomator2是一个python库,用于Android的UI自动化测试,其底层基于Google uiautomator,Google提供的uiautomator库可以获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作

python-uiautomator2主要分为两个部分,python客户端,移动设备:

  • python端: 运行脚本,并向移动设备发送HTTP请求

  • 移动设备:移动设备上运行了封装了uiautomator2的HTTP服务,解析收到的请求,并转化成uiautomator2的代码。

整个过程

  1. 在移动设备上安装atx-agent(守护进程), 随后atx-agent启动uiautomator2服务(默认7912端口)进行监听
  2. 在PC上编写测试脚本并执行(相当于发送HTTP请求到移动设备的server端)
  3. 移动设备通过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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值