自动化测试框架
-
Monkey
: 稳定性测试
特定:不能指定执行操作的顺序 -
Appium框架 + Python
: UI自动化 -
ADB + Python
: UI自动化
需要了解下面两个步骤:
- ADB命令如何执行操作(点击、滑动、输入文本)
- Python中如何执行ADB命令
ADB是什么
简介
adb全称(Android Debug Bridge),它是一个通用命令行工具,它可以做为Android与PC端连接的一个桥梁,所以adb又称为Android调试桥,用户可以通过adb在电脑上对Android设备进行全面操作,比如安装和调试应用,操作文件的传输等。
主要功能
- 在设备上运行shell
- 管理模拟器或设备的端口映射
- 在计算机与设备之间拷贝推送文件
- 安装,卸载apk,查看设备信息
运行架构
-
adb client(客户端)
:client实际上就是shell控制台,通过Client发送命令给server。发送命令时,首先检测PC上有没有启动Server,如果没有Server,则自动启动一个Server,然后将命令发送到Server,并不关心命令发送过去以后会怎样。 -
adb server(服务器)
:server是运行在主机上的一个后台进程,作用是检测USB端口何时连接或者移除设备,server还将adb client的请求通过USB或者TCP的发送发送到adbd上。 -
adb demon(守护进程)
:运行在Android设备上的一个进程,作用是通过USB或者TCP连接到adb server,并且为运行在主机上的adb client提供一些服务。
工作原理
- 首先用户启动一个adb客户端时,此客户端先检查是否存在已运行的adb服务器进程。如果没有,它将启动一个服务器进程
- 当服务器进程启动时,adb服务器就会绑定本地的TCP端口5037并监听adb客户端发来的命令,使用的adb客户端都使用端口5037与adb服务器进行对话的。
- 接着服务器将所有运行中的模拟器或设备实例进行连接。它通过扫描所有5555到5585范围内的奇数端口来定位所有的模拟器或设备。一旦服务器找到了adb守护程序,将建立一个到该端口的连接。
客户端发送的命令分为三种:
- 不需要经过server处理就能成功的,如:adb version、adb help。
- 需要和server进行通讯,但不需要和demo通讯的命令,如:adb devices。
- 需要和demo进行处理的命令。
设备连接管理
查询已连接设备/模拟器
adb devices
输出状态:
- offline:表示设备未连接成功或无响应。
- device:设备已连接,
- no device:没有设备/模拟器连接
USB连接
- 保证android设备处于正常开机状态。
- android设备的开发者选项和USB调试模式已开启。
- 设备驱动状态正常。
- 通过USB连接好电脑和设备后使用adb devices确认状态
无线连接(需要借助USB)
- 将android设备与运行adb的电脑连接在同一个区域网。
- 让设备在5555端口监听TCP/IP连接:adb tcpip 5555
- 找到设备的IP地址
- 通过IP地址连接设备:adb connect ip:5555
- 确认连接状态
无线连接(不需要借助USB)
- 在android设备上安装一个终端模拟器。终端模拟器下载地址:https://jackpal.github.io/Android-Terminal-Emulator/
- 将android设备与运行adb的电脑连接在同一个区域网。
- 打开android设备上的终端模拟器,在里面依次输入命令:
su
setprop service.adb.tcp.port 5555
- 找到设备的IP地址
- 在电脑上通过adb和IP地址连接android设备:adb connect ip:5555
adb命令
adb服务命令
查看adb版本:adb version
以root权限运行adb服务:adb root
关闭adb服务:adb kill-server
开启adb服务:adb start-server
指定adb-server运行端口(默认端口5037):adb -P 端口 adb-server
应用管理命令
安装APK
adb install apk包名
常用参数:
参数 | 说明 |
---|---|
-r | 覆盖安装(保留数据) |
-d | 降级覆盖安装 |
-g | 赋予所有运行时权限 |
-l | 将应用安装到保护目录/mnt/asec |
-s | 将应用安装到sdcard目录 |
adb install安装原理过程:
- push apk文件到/data/local/tmp
- 调用pm install安装
- 删除/data/local/tmp下的对应apk
卸载apk
adb uninstall apk包名
常用参数:
参数 | 说明 |
---|---|
-k | 卸载应用时保留数据和缓存目录 |
清除应用数据和缓存
adb shell pm clear apk包名
查看设备中已安装apk包
adb shell pm list apk包
常用参数:
参数 | 说明 |
---|---|
-f | 查看关联文件 |
-3 | 查看第三方应用 |
-s | 查看系统应用 |
-d | 查看disabled package |
-e | 查看enable package |
-i | 查看package对应的安装者 |
-u | 查看被卸载过的package |
查看应用包详细信息
adb shell dumpsys package apk包名
获取当前正在运行的activity(活动)
adb shell dumpsys activity | grep "mFoc"
adb shell dumpsys window | findstr mCurrentFocus
查看正在运行的services
adb shell dumpsys activity services
强制暂停应用
adb shell am force-stop packagename
文件管理命令
导出设备文件到电脑
adb pull <设备文件路径> [电脑存储路径]
导入电脑文件到设备
adb push <电脑文件路径> [设备存储路径]
日志管理命令
Android系统的日志分为两部分:底层的Linux内核日志输出到/proc/kmsg, Android日志输出到/dev/log。Android的Log等级通常有六类,按照日志级别由低到高分别是:Verbose、Debug、Info、Warning、Error、Assert。
adb logcat # 查看日志
adb logcat -c # 清空日志
adb shell dmesg # 查看内核日志
adb bugreport #收集日志数据,用于后续分析
查看设备系统信息命令
adb shell getprop ro.build.version.release # 查看android系统版本
adb shell dumpsys meminfo apk包 #查看设备内存占用
adb shell dumpsys cpuinfo # 查看设备CPU
adb shell dumpsys gfxinfo apk包 #查看gpu绘制分析
adb shell top # 查看实时资源占用
adb shell dumpsys pwer # 查看电源管理信息
# 获取屏幕锁屏数据
adb shell dumpsys power | grep "mScreenOffTimeoutSetting"
adb shell dumpsys power | findstr "mScreenOffTimeoutSetting"(windows)
adb shell getprop ro.product.model # 查看设备型号
adb shell wm size # 查看屏幕分辨率
adb shell wm density # 查看屏幕密度
adb shell dumpsys window displays # 查看显示屏参数
adb shell getprop ro.build.version.release # 查看android版本
adb shell settings get secure android_id #查看android_id
adb shell df # 获取android系统各个分区相关信息
adb shell dumpystate # 获取android系统当前状态相关信息
adb get-serialno # 获取设备序列号
adb get-state # 查看模拟器/设备当前状态
adb shell dumpsys notification # 查看系统通知
adb shell getprop gsm.operator.alpha # 获取手机运营商信息
adb shell getprop gsm.network.type # 获取手机网络类型信息
adb shell ps #adb shell ps # 查看设备进程
adb shell dumpsys battery # 查看设备电池信息
adb shell dumpsys WiFi | more # 查看无线网信息
adb shell dumpsys telephony.registry # 查看电话相关信息
相关内容含义:
名称 | 说明 |
---|---|
mCallState | 表示呼叫状态。0表示待机状态;1-表示来电未接听状态;2-表示电话占线。 |
mCallIncomingNumber | 表示最近一次来电的电话号码 |
mServiceState | 表示服务的状态;0-表示正常使用状态;1-表示电话没有连接到任何网络;2-表示电话只能拨打紧急呼叫号码;3-表示电话已关机。 |
mSignalStrength | 表示信号强度信息。 |
mMessageWaiting | 表示是否在等待无线电消息。 |
mCallForwarding | 表示是否启用呼叫转移。 |
mDataActivity | 表示无线数据通信情况。0-表示没有通话;1-表示正在接收IP PPP信号;2-表示正在发生IP PPP信号;3-表示正在发送和接收IP PPP信号。 |
mDataConnectionState | 表示无线数据连接情况;0-表示无数据连接;1-正在创建数据连接;2-表示已连接;3-表示挂起状态,已创建好连接,但是IP数据通信暂时无法使用。 |
mDataConnectionPossible | 表示是否有数据连接。 |
mDataConnectionReason | 表示数据连接的原因。 |
mDataConnectionLinkProperties | 表示数据连接的链路属性。 |
mDataConnectionNetworkCapabilities | 表示数据链路连接的能力。 |
mCellLocation | 表示基站相关信息。 |
自动化工具input命令
adb shell input <参数>
参数 | 说明 |
---|---|
tap x y | 点击屏幕 |
keyevent 3 | HOME键 |
keyevent 4 | 返回键 |
keyevent 5 | 打开拨号应用 |
keyevent 24 | 增加音量 |
keyevent 25 | 降低音量 |
keyevent 26 | 电源键 |
keyevent 27 | 拍照(需要在相机应用里) |
keyevent 64 | 打开浏览器 |
keyevent 82 | 菜单键 |
keyevent 85 | 播放/暂停键 |
keyevent 86 | 停止播放 |
keyevent 87 | 播放下一首 |
keyevent 88 | 播放上一首 |
keyevent 122 | 移动光标到行首或列表顶部 |
keyevent 123 | 移动光标到行末或列表底部 |
keyevent 126 | 恢复播放 |
keyevent 127 | 暂停播放 |
keyevent 164 | 静音 |
keyevent 176 | 打开系统设置 |
keyevent 187 | 切换应用 |
keyevent 207 | 打开联系人 |
keyevent 208 | 打开日历 |
keyevent 209 | 打开音乐 |
keyevent 210 | 打开计算器 |
keyevent 220 | 降低屏幕亮度 |
keyevent 221 | 提高屏幕亮度 |
keyevent 223 | 系统休眠 |
keyevent 224 | 点亮屏幕 |
keyevent 231 | 打开语音助手 |
text content | 输入文本 |
# 屏幕滑动
adb shell input swipe x1 y1 x2 y2
# 长按 1000毫秒
adb shell input swipe x1 y1 x2 y2 1000
Adb环境搭建
安装IDE (android studio)
https://developer.android.google.cn/studio/
启动时提示:unable to access android sdk add-on list
点击canal , 后面会自动安装SDK。
配置环境变量
vi ~/.bash_profile
export PATH=$PATH:/Users/mpy/Library/Android/sdk/platform-tools
export PATH=$PATH:/Users/mpy/Library/Android/sdk/tools
source ~/.bash_profile
启动模拟器
-
建立一个空项目
-
设置环境
-
启动项目
-
强制关闭模拟器
adb emu kill # 成功关闭模拟器
安装APK
cd ~/Library/Android/sdk/platform-tools
sudo ./adb install apk路径
查看软件是否支持Mac M1:
apk后缀名变更为 zip, 解压后查看lib目录:存在arm64-v8a目录就是支持的。
设置开发者模式
进入Setting --》 System --> Languages 设置简体中文
找到 关于模拟设备 --》 多次点击版本号 提示已进入开发者模式即可。