App自动化测试-ADB


自动化测试框架

  • Monkey : 稳定性测试
    特定:不能指定执行操作的顺序
  • Appium框架 + Python: UI自动化
  • ADB + Python: UI自动化

需要了解下面两个步骤:

  1. ADB命令如何执行操作(点击、滑动、输入文本)
  2. 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提供一些服务。

工作原理

  1. 首先用户启动一个adb客户端时,此客户端先检查是否存在已运行的adb服务器进程。如果没有,它将启动一个服务器进程
  2. 当服务器进程启动时,adb服务器就会绑定本地的TCP端口5037并监听adb客户端发来的命令,使用的adb客户端都使用端口5037与adb服务器进行对话的。
  3. 接着服务器将所有运行中的模拟器或设备实例进行连接。它通过扫描所有5555到5585范围内的奇数端口来定位所有的模拟器或设备。一旦服务器找到了adb守护程序,将建立一个到该端口的连接。

客户端发送的命令分为三种:

  • 不需要经过server处理就能成功的,如:adb version、adb help。
  • 需要和server进行通讯,但不需要和demo通讯的命令,如:adb devices。
  • 需要和demo进行处理的命令。

设备连接管理

查询已连接设备/模拟器

adb devices

输出状态:

  • offline:表示设备未连接成功或无响应。
  • device:设备已连接,
  • no device:没有设备/模拟器连接

USB连接

  1. 保证android设备处于正常开机状态。
  2. android设备的开发者选项和USB调试模式已开启。
  3. 设备驱动状态正常。
  4. 通过USB连接好电脑和设备后使用adb devices确认状态

无线连接(需要借助USB)

  1. 将android设备与运行adb的电脑连接在同一个区域网。
  2. 让设备在5555端口监听TCP/IP连接:adb tcpip 5555
  3. 找到设备的IP地址
  4. 通过IP地址连接设备:adb connect ip:5555
  5. 确认连接状态

无线连接(不需要借助USB)

  1. 在android设备上安装一个终端模拟器。终端模拟器下载地址:https://jackpal.github.io/Android-Terminal-Emulator/
  2. 将android设备与运行adb的电脑连接在同一个区域网。
  3. 打开android设备上的终端模拟器,在里面依次输入命令:
su
setprop service.adb.tcp.port 5555
  1. 找到设备的IP地址
  2. 在电脑上通过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 

启动模拟器

  1. 建立一个空项目

  2. 设置环境

  3. 启动项目

  4. 强制关闭模拟器

adb emu kill # 成功关闭模拟器

安装APK

cd ~/Library/Android/sdk/platform-tools
adb install apk路径

查看软件是否支持Mac M1:
apk后缀名变更为 zip, 解压后查看lib目录:存在arm64-v8a目录就是支持的。

设置开发者模式

进入Setting --》 System --> Languages 设置简体中文
找到 关于模拟设备 --》 多次点击版本号 提示已进入开发者模式即可。