首页 > 编程语言 >Python控制安卓模拟器——uiautomator2模块

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

时间:2024-04-02 21:59:57浏览次数:27  
标签:shell Python app 元素 adb uiautomator2 com 安卓 d1

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

目录

介绍

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

大致流程分为:

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

【1】安装 python

安装python:

【2】安装 adb

[1]下载adb:

需要翻墙image-20231207170512902

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

[2]配置环境变量

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

image-20231207170804330

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

image-20231207170849396

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

image-20231207170940382

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

image-20231207171024676

【3】安装uiautomator2

pip安装

pip install uiautomator2

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

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

image-20240402100440002

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

image-20240402100023710

  • 这条信息表明此时已成功初始化了一个 AdbDevice 对象,序列号为 127.0.0.1:21513

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

image-20240402100551327

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

【5】u2指令控制设备

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

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

常用指令

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

image-20231207184736211

【7】元素操作

元素属性

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

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

控制元素

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

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

介绍

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

大致流程分为:

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

【1】安装 python

安装python:

【2】安装 adb

[1]下载adb:

需要翻墙image-20231207170512902

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

[2]配置环境变量

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

image-20231207170804330

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

image-20231207170849396

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

image-20231207170940382

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

image-20231207171024676

【3】安装uiautomator2

pip安装

pip install uiautomator2

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

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

image-20240402100440002

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

image-20240402100023710

  • 这条信息表明此时已成功初始化了一个 AdbDevice 对象,序列号为 127.0.0.1:21513

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

image-20240402100551327

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

【5】u2指令控制设备

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

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

常用指令

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

image-20231207184736211

【7】元素操作

元素属性

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

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

控制元素

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

标签:shell,Python,app,元素,adb,uiautomator2,com,安卓,d1
From: https://blog.csdn.net/AZURE060606/article/details/137265580

相关文章

  • 就业班 第二阶段(python) 2401--4.2 day1 python初识
    一、Python语言介绍1、Python发展历史2、Python简介3、Python特点4、Python的能力二、Linux编译安装Python31、源码安装1、安装依赖软件包2、下载3、解压安装4、配置共享库文件5、测试python36、测试pip32、配置使用国内源安装第三方模块1、创建配置文件补充内容四、......
  • python变量和简单的数据类型[第 2 章(上)]
    2.1运行解释文件扩展名:结尾的.py用于指出文件内容是Python代码Python解释器:读取整个文件,确定其中每一行的含义并执行例如,当解释器看到print,就会将括号中的内容打印到屏幕上。语法高亮:用不同的颜色,区分出程序代码中的不同部分 2.2变量修改我们在上一章中写的代......
  • pymc,一个灵活的的 Python 概率编程库!
    目录前言安装与配置概率模型贝叶斯推断概率分布蒙特卡罗采样贝叶斯网络实例分析PyMC库的应用场景 1.概率建模 2.时间序列分析 3.模式识别总结前言大家好,今天为大家分享一个超强的Python库-pymcGithub地址:https://github.com/pymc-devs/pymcPyth......
  • django-haystack,具有全文搜索功能的 Python 库!
    目录前言安装与配置全文搜索基础搜索引擎配置索引配置搜索视图与模板过滤器与排序自定义搜索逻辑应用场景 1.电子商务网站的商品搜索 2.新闻网站的文章搜索 3.社交网站的用户搜索 4.企业内部系统的文档搜索总结前言大家好,今天为大家分享一个非常实用......
  • python - 图片灰度化、二值化
    1.灰度化fromPILimportImageimg=Image.open("test.jpg")img=img.convert("L")img.save("output.jpg")2.二值化fromPILimportImageimg=Image.open("test.jpg")img=img.convert("1")img.save("out......
  • Python笔记----列表(List)【附代码】
    1.列表介绍   列表既是Python中最基本的数据结构又是最常用的数据类型   创造列表很简单,只要把数据用中括号括起来,数据之间用逗号隔开就可以了。2.列表的创建   列表的数据项不需要具有相同的类型,不同数据类型都可以装,可以存储的信息非常丰富3.列表......
  • python面向对象(一)
    什么是面向对象面向对象是一种编程思维。我们常说python是一种面向对象的编程语言,指的是python有很多可以支持我们实现面向对象编程的语法,例如其中最重要的“类”的概念。与面向对象相对应的是面向过程的编程。面向过程是面向对象的基础,指的是按照事务处理的过程进行编程,把每一......
  • mysql基于时间的盲注,使用python爆破库名
    mysql基于时间的盲注使用python代码进行爆破库名importrequestsimporttimes=requests.session()#创建session对象后,才可以调用对应的方法发送请求。url='http://192.168.2.101/sqli-labs-master/Less-9/?id='flag=''i=0whileTrue:i=i+1low......
  • Python的四种单例模式实现方式
    ★单例模式基本介绍单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例。它是一种创建型模式,通常用于需要严格控制某个类的实例数量的情况。单例模式确保一个类在整个应用程序生命周期中只有一个实例,因此可以节省系统资源,同时提供了一个集中的访问......
  • 构造函数init到底是什么作用 是下面的方法都可以从init里面获取参数吗?(AI+Python)
    大家好,我是Python进阶者。一、前言前几天在Python白银交流群【无敌劈叉小狗】问了一个Python基础的问题,问题如下:问一下构造函数init到底是什么作用是下面的方法都可以从init里面获取参数吗?二、实现过程这里【黄志诚】分享了自己的一个经验:全局呀,相当于初始化一个参数,全局都......