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端发来的请求
  • 准备工具:pythonuiautomator2adbweditor

【1】安装 python

安装python:

【2】安装 adb

[1]下载adb:

需要

Python和模拟器自动刷视频 python控制安卓模拟器_Python和模拟器自动刷视频

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

Python和模拟器自动刷视频 python控制安卓模拟器_python_02

[2]配置环境变量

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


Python和模拟器自动刷视频 python控制安卓模拟器_开发语言_03

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

Python和模拟器自动刷视频 python控制安卓模拟器_Python和模拟器自动刷视频_04

3.将解压后的adb文件地址,配置在环境变量中。
(如果需要配置Android SDK中的ADB,那么地址就是“{Android SDK安装地址}/android_sdk/platform-tools/”)

Python和模拟器自动刷视频 python控制安卓模拟器_开发语言_05

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

Python和模拟器自动刷视频 python控制安卓模拟器_爬虫_06

【3】安装uiautomator2

pip安装

pip install uiautomator2

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

  • 首先需要将设备调成开发者模式
  • 本次案例使用的是逍遥模拟器

Python和模拟器自动刷视频 python控制安卓模拟器_python_07

  • 然后Python终端为手机下载atx-agent
python -m uiautomator2 init # 手机端安装ATX

Python和模拟器自动刷视频 python控制安卓模拟器_开发语言_08

  • 这条信息表明此时已成功初始化了一个 AdbDevice 对象,序列号为 127.0.0.1:21513
  • 接下来就可以通过使用AdbDrvice对象来对设备进行各种操作

Python和模拟器自动刷视频 python控制安卓模拟器_python_09

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

【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

Python和模拟器自动刷视频 python控制安卓模拟器_python_10

【7】元素操作

元素属性

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

属性

描述

activity

表示应用程序当前所处的活动(Activity),通常由包名和活动名组成,用于唯一标识应用程序中的不同页面或界面

XPathLite

指定该元素的 XPathLite 表达式,可用于定位元素

坐标 % px

给出元素在屏幕上的相对坐标位置(百分比),用于指示元素的位置

className

表示元素的类名,即该元素所属的控件类别

index

表示元素在当前层级结构中的索引位置,用于区分具有相同属性的多个元素

text

表示元素的文本内容,即显示在元素上的文字信息

package

表示应用程序的包名,用于唯一标识应用程序

description

对元素的描述信息,可能包含更多关于元素的补充说明或属性信息

checkable

表示元素是否可被选中(例如复选框)

clickable

表示元素是否可被点击

enabled

表示元素是否处于启用状态

focusable

表示元素是否可获得焦点

focused

表示元素是否当前具有焦点

scrollable

表示元素是否可以滚动

longClickable

表示元素是否支持长按操作

password

表示元素是否是密码字段(例如输入密码时会显示为星号)

selected

表示元素是否被选中

rect

表示元素的坐标位置

Python和模拟器自动刷视频 python控制安卓模拟器_Python和模拟器自动刷视频_11

控制元素

与刚刚的鼠标操作不同,我们还可以利用元素操作配合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