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

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

目录

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

需要翻墙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 tabadb 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 tabadb shell input tap 282 923 # 点击某个坐标
adb shell input swipe 300 1000 300 500 # 下滑500px
adb shell input swipe 288 929 288 929 1000 # 长按1000ms

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/294524.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小白的第一次sql注入实战

前言 当时最初接触安全的时候拿下的第一个shell,还是比较兴奋的,忽略一下文章写的很水。 有id尝试sql注入 找这种sql注入的站用sql检索就行了,但是最好挂代理用谷歌搜索,百度的话搜sql注入的很多被别人打过了,导致链…

钉钉服务端API报错 43008 参数需要multipart类型

钉钉服务端API报错 43008 参数需要multipart类型 problem 使用媒体文件上传接口,按照文档输入参数,结果返回报错 # 参数 {"access_token": "xxx""type": "image","media": "/Users/xxx/xxx/s…

hcia datacom课程学习(5):MAC地址与arp协议

1.MAC地址 1.1 含义与作用 (1)含义: mac地址也称物理地址,是网卡设备在数据链路层的地址,全世界每一块网卡的mac地址都是唯一的,出厂时烧录在网卡上不可更改 (2)作用&#xff1a…

constexpr与std::is_same_v碰撞会产生什么火花?

1. 只编译会用到的if分支 示例代码一中,checkType_v1和checkType_v2两个函数的区别就是if的条件里一个加了constexpr一个没加,加与不加从结果来看都一样,那在编译时和运行时各有什么区别呢? 示例代码一,test_01.cpp&…

Linux之实现Apache服务器监控、数据库定时备份及通过使用Shell脚本发送邮件

目录 一、Apache服务器监控 为什么要用到服务监控? 实现Apache服务器监控 二、数据库备份 为什么要用到数据库备份? 实现数据库备份 三、Shell脚本发送邮件 为什么要用使用Shell脚本发送邮件? 实现Shell脚本发送邮件 一、Apache服务器…

大模型日报20240401

大模型实时打《街霸》捉对PK,GPT-4居然不敌3.5,新型Benchmark火了 链接:https://news.miracleplus.com/share_link/22340 让大模型直接操纵格斗游戏《街霸》里的角色,捉对PK,谁更能打?GitHub上一种你没有见…

Windows下配置及使用Git+rsync构建文件同步工具

背景(了解): 公司的前端项目里有bash脚本,开发人员在开发完,可以跑bash脚本自动发布部署到测试环境。但是windows是没办法直接跑bash脚本的,最便捷的做法就是借用git bash这个终端来跑项目里的bash脚本。但是windows的源里并没有…

conda使用记录

linux 使用conda创建新一个新的python环境过程 conda create -n recommendation_env python3.8.18 # 指定python版本 conda env list # 查看所有的环境 conda activate recommendation_env # 激活创建的新环境 pip install flask # 安装依赖 或者 pip install flask版本号 或者…

Python+requests+Pytest+logging+allure+pymysql框架详解

一、框架目录结构 1)tools目录用来放公共方法存储,如发送接口以及读取测试数据的方法,响应断言 数据库断言 前置sql等方法;2)datas目录用例存储接口用例的测试数据,我是用excel来存储的数据,文…

简单说清楚什么是SQL Injection?

最近看完了《The Pragmatic Programmer: 20th Anniversary Edition, 2nd Edition: Your Journey to Mastery》,在第7章:While You Are Coding的footnotes中,提到了一幅漫画: 这不仅用简单的方式说清楚了什么是SQL Injection&#…

顶顶通呼叫中心中间件-声音编码自适应配置方法(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-声音编码自适应配置方法讲解(mod_cti基于FreeSWITCH) 声音编码自适应介绍 声音编码自适应,通常在语音通信和音频处理领域中指的是一种能够根据信号特性和传输环境自动调整编码参数的技术。其目的是在不同的网络状况和音质要求下,…

uniapp开发App(一)登陆流程 判断是否登陆,是,进入首页,否,跳转到登录页

一、登陆流程 文字描述:用户进入App,之后就是判断该App是否有用户登陆过,如果有,直接进入首页,否则跳转到登陆页,登陆成功后,进入首页。 流程图如下: 二、在uniapp项目中代码实现 实…

【数据结构】AVL 树

文章目录 1. AVL 树的概念2. AVL 树节点的定义3. AVL 树的插入4. AVL 树的旋转5. AVL 树的验证6. AVL 树的删除7. AVL 树的性能 前面对 map / multimap / set / multiset 进行了简单的介绍【C】map & set,在其文档介绍中发现,这几个容器有个共同点是…

oracle19c安装-aarch64

建议 参考oracle官方文档提供的软硬件要求 https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/operating-system-checklist-for-oracle-database-installation-on-linux.html#GUID-E5C0A90E-7750-45D9-A8BC-C7319ED934F0 建议使用OracleLinux8.6及以上操作…

RWKV_Pytorch:支持多硬件适配的开源大语言模型推理框架

亲爱的技术探索者们,今天我要向大家隆重推荐一个在开源社区中崭露头角的项目——RWKV_Pytorch。这是一个基于Pytorch的RWKV大语言模型推理框架,它不仅具备高效的原生Pytorch实现,而且还扩展了对多种硬件的适配支持,让模型的部署和…

Django创建多app应用

目录 1. 引言 2. 多app创建的两种方式 2.1 多个app结构 2.2 单个apps多个app 3. 最后 1. 引言 在平常业务开发中,我们遇到的功能可能会有很多,单个app的应用可能无法满足我们 这个时候,我们就需要多app应用,例如&#xff1a…

docker 部署 gitlab-ce 16.9.1

文章目录 [toc]拉取 gitlab-ce 镜像创建 gitlab-ce 持久化目录启停脚本配置配置 gitlab-ce编辑 gitlab-ce 配置文件重启 gitlab-ce配置 root 密码 设置中文 gitlab/gitlab-ce(需要科学上网) 拉取 gitlab-ce 镜像 docker pull gitlab/gitlab-ce:16.9.1-ce.0查看镜像是不是有 Vo…

docker容器添加新端口映射的步骤及`wsl$`目录的作用

在Docker容器已经创建后,需要添加新的端口映射,即对已经存在的Docker容器添加新的端口映射,可以通过以下步骤来添加,即通过修改配置文件的方法。 如何新增端口映射? 查找容器的hash值 docker inspect [容器id或名称…

Rust 机器学习图形库 petgraph

一、介绍 Petgraph 是一个开源的图数据结构库,提供了非常丰富的图形类型和算法,并且支持将图形以 Graphviz 格式输出,还允许你为图的节点和边赋予任意类型的数据,从而能够灵活地处理和表示复杂的数据关系。 Petgraph 支持边的方…

【threejs】较大物体或shape的贴图较小问题处理方法

问题 有的场景内相对体型差距过大的物体(如山地 海洋等)由于尺寸问题,加载贴图过于小,同时shader也无法完全展示,如图 我们可以获取物体的uv,进行缩放使得贴图可以完全展开 如果uv是乱的 可以用xyz坐标最…