Python控制安卓模拟器——uiautomator2模块

Python控制安卓模拟器——uiautomator2模块

目录

  • Python控制安卓模拟器——uiautomator2模块
    • 介绍
    • 【1】安装 python
    • 【2】安装 adb
      • 1]下载[adb:
      • [2]配置环境变量
      • 【3】安装uiautomator2
      • 【4】连接设备(安卓模拟器)
      • 【5】u2指令控制设备
        • 常用指令
        • 【6】安装weditor
        • 【7】元素操作
          • 元素属性
          • 控制元素
          • 【8】adb常用命令

            介绍

            uiautomator2是一个自动化测试开源工具,仅支持Android平台的原生应用测试。

            大致流程分为:

            • Python端:运行脚本,向移动端发送HTTP请求
            • 移动端:安装atx-agent,然后atx-agent启动uiautomator2服务进行监听,并识别Python脚本,转换为uiaotomator2代码
            • 连接方式:移动设备需要通过WIFI(同一网段)或USB连接才能接收到PC端发来的请求
            • 准备工具:python,uiautomator2,adb,weditor

              【1】安装 python

              安装python:

              【2】安装 adb

              [1]下载adb:

              需要翻墙

              下载完成后直接解压安装包

              [2]配置环境变量

              1.打开电脑的设置,选择“高级系统设置”后,再点击“环境变量设置”

              2.选择 系统变量中的“PATH”

              3.将解压后的adb文件地址,配置在环境变量中。

              (如果需要配置Android SDK中的ADB,那么地址就是“{Android SDK安装地址}/android_sdk/platform-tools/”)

              4.配置成功后保存,在命令行输入“adb”,输出结果如下,则代表adb已安装成功。

              【3】安装uiautomator2

              pip安装

              pip install uiautomator2
              

              【4】连接设备(安卓模拟器)

              • 首先需要将设备调成开发者模式
              • 本次案例使用的是逍遥模拟器
                • 然后Python终端为手机下载atx-agent
                  python -m uiautomator2 init # 手机端安装ATX
                  
                  • 这条信息表明此时已成功初始化了一个 AdbDevice 对象,序列号为 127.0.0.1:21513

                  • 接下来就可以通过使用AdbDrvice对象来对设备进行各种操作

                    出现小黄车就代表所有的准备环节都已经成功

                    【5】u2指令控制设备

                    连接设备之后还有一步操作:

                    1. 安卓设备打开atx小黄车
                    2. 启动u2服务

                    常用指令

                    import uiautomator2 as u2
                    # 连接设备
                    device = '127.0.0.1:21513'
                    d1 = u2.connect(device)
                    # 设备信息
                    print(d1.info())
                    # 当前运行中的app 示例:{'package': 'com.yokaverse.zzxy', 'activity': 'org.cocos2dx.lua.AppActivity'}
                    print(d1.app_current())
                    # 所有运行中的app 示例:['com.github.uiautomator', 'com.android.defcontainer']
                    print(d1.app_list_running())
                    # 安装应用
                    url = 'https://zzxyipa.sanguosha.com/app/ygame_1001501_1001501000001.apk'
                    d1.app_install(url)
                    # 启动应用(传入包名)
                    app_pack = 'com.yokaverse.zzxy'
                    d1.app_start(app_pack)
                    # 启动应用(传入app名)
                    app_name = '微信'
                    d1(text=app_name).click()
                    # 显示分辨率
                    x, y = d1.window_size()[1], d1.window_size()[0]
                    # 单击
                    d1.click(x, y)
                    # 双击
                    d1.double_click(x, y)
                    # 拖拽 (start_x/start_y: 起始x坐标/起始y坐标) (end_x/end_y: 终点x坐标/终点y坐标)
                    # duration: 滑动所需时间,默认0.5s
                    d1.drag(start_x, start_y, end_x, end_y, duration=0.5)
                    # 截图
                    # 获取绝对路径的上级目录(当前文件夹)
                    target_path = os.path.dirname(os.path.abspath(__file__))
                    target_path = os.path.join(target_path, '屏幕截图')
                    os.makedirs(target_path, exist_ok=True)
                    d1.screenshot(f'{target_path}/img.png')
                    

                    【6】安装weditor

                    注:weditor一般配合其他测试框架使用,通常用于元素定位和生成代码

                    吐槽一句,这个工具bug很多,如果测试环境需要定位的元素并不复杂那么不用也行,可以配合坐标定位和图像定位(OpenCV)使用

                    # 可能会安装失败
                    pip install -i https://pypi.douban.com/simple weditor # 豆瓣安装
                    pip install --pre -U weditor
                    # 上面如果安装失败的话 直接安装指定版本 0.6.4 / 0.6.3
                    pip install --upgrade weditor==0.6.4
                    

                    安装成功后直接在控制台输入:

                    weditor
                    

                    接着会自动打开浏览器

                    如果设备为成功链接请先在终端输入adb指令查看设备是否连接

                    adb devicers
                    

                    【7】元素操作

                    元素属性

                    凡是能被WEditor采集到的元素都能进行操作

                    属性描述
                    activity表示应用程序当前所处的活动(Activity),通常由包名和活动名组成,用于唯一标识应用程序中的不同页面或界面
                    XPathLite指定该元素的 XPathLite 表达式,可用于定位元素
                    坐标 % px给出元素在屏幕上的相对坐标位置(百分比),用于指示元素的位置
                    className表示元素的类名,即该元素所属的控件类别
                    index表示元素在当前层级结构中的索引位置,用于区分具有相同属性的多个元素
                    text表示元素的文本内容,即显示在元素上的文字信息
                    package表示应用程序的包名,用于唯一标识应用程序
                    description对元素的描述信息,可能包含更多关于元素的补充说明或属性信息
                    checkable表示元素是否可被选中(例如复选框)
                    clickable表示元素是否可被点击
                    enabled表示元素是否处于启用状态
                    focusable表示元素是否可获得焦点
                    focused表示元素是否当前具有焦点
                    scrollable表示元素是否可以滚动
                    longClickable表示元素是否支持长按操作
                    password表示元素是否是密码字段(例如输入密码时会显示为星号)
                    selected表示元素是否被选中
                    rect表示元素的坐标位置

                    控制元素

                    与刚刚的鼠标操作不同,我们还可以利用元素操作配合weditor进行定位和控制

                    我们以逍遥市场为例

                    import uiautomator2 as u2
                    # 连接设备
                    device = '127.0.0.1:21513'
                    d1 = u2.connect(device)
                    #
                    # # 获取当前界面的 XML 层次结构信息
                    print(d1.dump_hierarchy())
                    #
                    # # 根据text定位 获取特定app的信息
                    print(d1(text="逍遥市场").info)
                    #
                    # # 根据index定位 获取特定app的信息
                    print(d1(index=4).info)
                    # 根据className获取元素信息
                    print(d1(className='android.widget.TextView').info)
                    # 根据Xpath定位
                    d1_xpath = d1.xpath('//*[@resource-id="com.android.chrome:id/search_box_text"]')
                    # 输入文本
                    d1_xpath.set_text('Hello')
                    

                    【8】adb常用命令

                    adb devices # 查看当前设备
                    adb shell pm list packages # 查看手机里面所有包名
                    adb shell pm list packages -3 # 查看手机里面所有第三方包名
                    adb shell dumpsys activity activities  # 该命令的功能是获取当前正在被操作的app的activity相关信息
                    adb shell pm clear com.ablesky.ui.activity # 清除缓存数据
                    # 启动程序 
                    # 格式:常规命令 + 包名/activity
                    # 注意:appActivity返回值本来是com.jingdong.app.mall/.main.MainActivity,需要去掉中间的反斜线!
                    adb shell am start -n com.jingdong.app.mall/com.jingdong.app.mall.MainFrameActivity 
                    adb shell pm clear com.jingdong.app.mall # 关闭程序并且清除所有数据,相当于重新安装
                    adb shell am force-stop com.jingdong.app.mall # 停止运行程序
                    adb shell "ps | grep com.jingdong.app.mall" # 查看程序进程,判断是否运行
                    adb shell /system/bin/screencap -p /sdcard/xx.png # 截频并保存文件在手机上为xx.Png
                    adb pull /sdcard/xx.png D:/xx.png # 将手机xx.png文件保存到D盘文件下
                    adb push D:/xx.text /adcard/xx.text # 将电脑文件导入手机
                    adb shell screenrecord /sdcard/demo.mp4 # 录制视频
                    adb shell input text 123  # 输入内容
                    adb shell input keyevent 4 # 按键操作
                    # 4 返回操作
                    # 1 菜单
                    # 3 主页
                    # 21 光标左移
                    # 22 光标右移
                    # 67 删除
                    # 61 tab
                    adb shell input tap 282 923 # 点击某个坐标
                    adb shell input swipe 300 1000 300 500 # 下滑500px
                    adb shell input swipe 288 929 288 929 1000 # 长按1000ms