目录
二、查看应用的包名papackage与页面的Activity
1.1 mac电脑安装Android studio
mac电脑安装Android studio_遛马的博客-CSDN博客_mac安装android studio
1.2
adb全称是Android Debug Bridge,它是一个命令行工具,通过它可以与Android设备进行交互,可以进行常见的安装/卸载app、打开app、查看app的日志等操作。
通过Android sdk安装,
1.下载AndroidSDK
下载地址:
www.android-studio.org
2.配置adb环境变量。
具体的安装方式自行百度。
MAC下使用homebrew安装adb
如果已经安装了homebrew,就不用执行安装homebrew命令了
安装homebrew:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装adb:
使用以下命令,如果第一个命令报错,就使用第二个。
brew cask install android-platform-tools
brew install android-platform-tools --cask
安装成功:
再次输入adb devices 显示安装成功
其他mac安装方式:
https://www.jianshu.com/p/744fc5946627
- 1.adb常用命令
-
- #连接手机
-
- adb devices -l
-
- #安装APP
-
- adb install name.apk
-
- #卸载APP
-
- adb unnistall 包名
-
- #解锁屏幕
-
- adb shell input keyevent 26
-
- #点击触屏
-
- adb shell input tap 500 500
-
- #输入字符
-
- adb shell input text abc
-
- #登录android
-
- adb shell
-
- #从Android拷贝资料到PC
-
- adb pull /sdcard/DCIM/Camera/文件名 /Users/lenov
-
- #从PC端拷贝资料到设备
-
- adb push /Users/lenov/文件名 //sdcard/DCIM/Camera
-
1、aapt
aapt dump badging apk名称
2、adb logcat 获取
adb shell "logcat | grep START"
输入这个命令,然后去启动app。
3.dumpsys
(1)启动要查看的程序;
(2)命令行输入:adb shell dumpsys window w |findstr \/ |findstr name=

(3) 命令输入:adb shell dumpsys window | findstr mCurrentFocus
命令查看当前运行的包名和Activity

一般在做monkey时,使用以下这个命令就可以了,日志尽量详细一点,将来好分析定位问题。
adb shell monkey -p packagename --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 1000000>c:\test.log
--throttle 500
每个时间间隔500毫秒
--ignore-crashes
忽略crash,当指定的应用程序发生崩溃时(Force&Close错误),Monkey继续执行事件。
--ignore-timeouts
忽略超时,当指定的应用程序发生ANR 错误时,Monkey事件继续执行。
--ignore-security-exceptions
当应用程序发生许可错误时(如证书许可,网络许可等),Monkey继续执行事件。
--ignore-native-crashes
忽略本地的crashes
--monitor-native-crashes
监视并报告应用程序发生崩溃的本地代码
--kill-process-after-error
当应用程序发生错误时,应用程序停止运行并保持在当前状态(注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进行)
-v
日志详细程度,三个-v,是最详细的。
为什么要加忽略:
如果不忽略crash,出现crash,monkey就停了。
如果seed值相同,则两次执行monkey的事件顺序是相同的。
应用场景:
我们在执行monkey时,给一个seed标记。等我们下次需要复现上一次的执行过程时,我们执行monkey命令,带上这个标记,则这一次执行的事件顺序与上一次事件顺序是一致的,就可以复现上一次的步骤。
注意:
两次执行命令,使用相同的seed值,执行过程并不是严格意义上一致的,可能会有不一致的地方,不过这个不重要,我们可以忽略这个。
示例:
第一次执行,1000次。seed值为666
adb shell monkey -p packagename -s 666 1000
第二次执行,为了与上一次执行的逻辑一样,同样适用666为seed值。
adb shell monkey -p packagename -s 666 1000
seed值,如果执行的命令里不指定,在monkey执行时,会生成一个seed值。

ANR(Application Not Response)是指在Android上,应用程序响应不够灵敏时,系统会向用户显示的一个对话框。 用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。

1、安装可以引起ANR的app
2、执行压力命令
3、分析ANR的Exception
1、查看monkey的log
2、/data/anr/traces.txt
3、查看log cat日志ANR

1、anr发生的页面
2、每个进程的CPU 利用率
3、
adb shell
进入linux 系统
在/data/anr/目录下,有个traces.txt文件
取出这个文件,在电脑终端执行命令
adb pull /data/anr/traces.txt .
分析这个文件
Monitor 集成了DDMS,也可以单独使用DDMS
在终端输入Monitor ,启动Monitor
看log cat日志


集成了DDMS

1、1点击,出现log cat
2、双击log cat放大
异常Exception 通常伴随着Crash
1、按关键字进行搜索,ANR、Exception、Crash
2、找到有问题的地方,查看上下文信息
3、注意第一个switch上下文信息,有没有报错之类的

4、查看monkey里面出错钱的一些事件动作,可以手动执行该动作
5、进行问题复现,可以使之前执行的monkey命令再执行一遍,注意seed值要一致
搜ANR,如果搜索出来的量 很大,那么搜索的时候,ANR后加一个空格,这样结果就会减少。
MonkeyScript使用教程 - 清风软件测试 - 博客园
MonkeyScript 是官方提供的,除了像Monkey一样随机乱点之外,还可以通过编写脚本的形式,完成一系列固定的操作。
MonkeyScript 提供一整套完善的 API 来进行支持,主要还是基于坐标点的操作,包含常用的:点击、长按、输入、等待等操作。
MS脚本只要是文本即可,不关心后缀是什么,所以编写时不要添加后缀,保存文本格式即可。
MonkeyScript 执行命令:
adb shell monkey -f <scriptfile> <event-count>
一、DispatchTrackball 轨迹球事件
DispatchTrackball(long downtime,long eventtide,int action,float x,float y,float pressure,float size,int metastate,float xprecision,float yprecision,int device,int edgeflags)
注意:按一个键需要两个轨迹球事件 。
轨迹球常用命令:
1、int action
指具体操作的动作。action: 0代表按下,1代表谈起,一个点击事件,需要执行0和1两个。
2、float x,float y
x 与y 的坐标
以上2个是轨迹球常用命令,需要根据具体情况进行修改。
轨迹球非常用命令:
以下几个命令,在实际使用时,直接复制用就可以了,不用进行修改,所以也不用关注这几个命令是啥意思。
long downtime指键最初被按下的时间
long eventtide 指事件发生的时间
float pressure 压力事件的大小(0-1)
float size 触摸的记事值(0-1)
int metastate 当前按下mate键的标识
二、DispatchPointer 点击事件
按一个键需要2个点击事件
三、DispatchString 输入字符串命令
DispatchString(String text)
四、LaunchActivity 启动应用
LaunchActivity(package,Activity)
五、UserWait 等待事件
UserWait(1000)
单位毫秒
六、DispatchPress 按下键值
DispatchPress(int keycode)
如按下回车键:
DispatchPress(66)
DispatchPress 与 DispatchPointer 区别:
DispatchPointer 点击的是屏幕(坐标)
DispatchPress 点击的是键盘,如点击回车键、点击a键、f键等。
Android KeyCode 列表:
Android KeyCode 列表 - 狐狸已化妖 - 博客园
遇到不知道的键,需要自己去百度一下,以下是部分键的int值。
| KEYCODE_CALL | 拨号键 | 5 |
| KEYCODE_ENDCALL | 挂机键 | 6 |
| KEYCODE_HOME | 按键Home | 3 |
| KEYCODE_MENU | 菜单键 | 82 |
| KEYCODE_BACK | 返回键 | 4 |
| KEYCODE_SEARCH | 搜索键 | 84 |
| KEYCODE_CAMERA | 拍照键 | 27 |
| KEYCODE_FOCUS | 拍照对焦键 | 80 |
| KEYCODE_POWER | 电源键 | 26 |
| KEYCODE_NOTIFICATION | 通知键 | 83 |
| KEYCODE_MUTE | 话筒静音键 | 91 |
| KEYCODE_VOLUME_MUTE | 扬声器静音键 | 164 |
| KEYCODE_VOLUME_UP | 音量增加键 | 24 |
| KEYCODE_VOLUME_DOWN | 音量减小键 | 25 |
下面以测试登录功能为例:
模板:
- type=user
- count = 1
- speed = 1.0
- start data >>
- LaunchActivity(Activity)
- UserWait(1000)
- DispatchPointer(0,0,0,303,312,0,0,0,0,0,0,0)
- DispatchPointer(0,0,1,303,312,0,0,0,0,0,0,0)
- UserWait(1000)
- DispatchString(1234566)
- UserWait(100)
- DispatchPointer(0,0,0,345,393,0,0,0,0,0,0,0)
- DispatchPointer(0,0,1,345,393,0,0,0,0,0,0,0)
- UserWait(100)
- DispatchString(1234567)
- UserWait(1000)
- DispatchPointer(0,0,0,100,100,0,0,0,0,0,0,0)
- DispatchPointer(0,0,1,100,100,0,0,0,0,0,0,0)
- UserWait(1000)
- DispatchPointer(0,0,0,361,507,0,0,0,0,0,0,0)
- DispatchPointer(0,0,1,361,507,0,0,0,0,0,0,0)
- UserWait(3000)
注意:
顶部4行命令,是MonkeyScript 固定的脚本头,需要写在脚本的最前面。
- type=user
- count = 1
- speed = 1.0
- start data >>
在脚本中,脚本头是一直不变动的,为了避免写错,可以直接复制粘贴最保险。
在 start data>> 之后就可以正式开始编写 monkey 脚本了。
在脚本中,使用 # 号,对单行进行注释。
例子二:
1、启动APP
2、点击地址栏
3、删除原有地址
4、输入www.baidu.com
5、点击回车
6、点击回车
7、点击搜索框
8、输入字符串test
9、点击回车
10、点击搜索按钮
11、等待搜索结果
- type=user
- count = 1
- speed = 1.0
- start data >>
-
- LaunchActivity(com,android.browser,com.android.browser.BrowserActivity)
- UserWait(1000)
- DispatchPointer(10,10,0,200,100,1,1,-1,1,1,0,0)
- DispatchPointer(10,10,1,200,100,1,1,-1,1,1,0,0)
- DispatchPress(112)
- DispatchString(www.baidu.com)
- DispatchPress(66)
- UserWait(1000)
- DispatchPointer(10,10,0,300,400,1,1,-1,1,1,0,0)
- DispatchPointer(10,10,1,300,400,1,1,-1,1,1,0,0)
- UserWait(1000)
- DispatchString(test)
- UserWait(1000)
- DispatchPress(66)
- UserWait(1000)
写完脚本后,必须将脚本放到手机里。
adb push
执行:
adb push


https://www.jianshu.com/p/30532d06306b
MonkeyRunner工具使用Jpython(使用Java编程语言实现的Python)写出来的。MonkeyRunner是安卓SDK提供的功能。MonkeyRunner在Android_sdk中的位置:tools目录下。
MonkeyRunner 跟monkey没有任何关系。Monkey通过在设备直接运行adb shell命令来生成随机事件进行测试。MonkeyRunner通过API发送特定的命令和事件来控制设备。
MonkeyRunner提供了多个API,通过MonkeyRunner API可以编写一个Python程序来模拟操作控制Android设备App,测试其稳定性并通过截屏记录出现的问题。
MonkeyRunner工具主要设计用于在功能/框架级测试应用程序和设备。支持java脚本和python脚本。
安装好Android SDK后,配置MonkeyRunner环境变量(将MonkeyRunner的路径放入Path)。在cmd中输入MonkeyRunner出现如下显示内容说明安装成功,使用Ctrl+D退出。

MonkeyRunner主要分为三个类:
1、MonkeyRunner:它是一个MonkeyRunner程序提供工具方法的类,这个类提供了用于连接MonkeyRunner到设备或模拟器的方法,同时还提供了用于创建一个MonkeyRunner程序的用户界面以及显示内置帮助的方法。
2、MonkeyDevice:它是一个设备或模拟器的类,这个类提供了安装和卸载程序包、启动一个活动以及发送键盘或触摸事件到应用程序的方法,同时提供也可以用这个类来运行测试包。
3、MonkeyImage:它是一个截图对象的类,这个类提供了截图、将位图转换成各种格式、比较两个MonkeyImage对象以及写图像到文件的方法。
官方文档:http://www.android-doc.com/tools/help/monkeyrunner_concepts.html#
提供连接真机和模拟器、输入、暂停、警告框等方法
| API | 功能 |
|---|---|
| alert() | 警告框 |
| choice() | 选项列表框 |
| help() | API帮助文档 |
| input() | 输入 |
| sleep() | 暂停 |
| waitFor Connection() | 等待设备连接 |
常用方法:
- from com.android.monkeyrunner import Monkeyrunner as mr
-
- print("connect devices...")
-
- device=mr.waitForConnection(5,'127.0.0.1:62001')
1、alert 警告框
MonkeyRunner.alert(String message,String title,String okTitle)
message: 弹出对话框内容
title:对话框的标题栏显示内容,默认值为“Alert”
okTitle: 对话框的按钮,默认值为“OK"
2、waitForConnection
等待设备连接,多个设备,需要指明哪个设备。
MonkeyRunner.waitForConnection(float timeout,string deviceId)
timeout: 等待超时时间,默认值为永久等待
deviceId:通过设备ID识别手机,如果只有一台手机,不需要输入。
提供安装和卸载程序包、开启activity、发送按键和点击事件、运行测试包等
| API | 功能 |
|---|---|
| broadcastIntent() | 发送广播 |
| drag() | 拖动 |
| getProperty() | 获取当前设备属性 |
| getSystemProperty() | 获取当前设备属性 |
| installPackage() | 安装应用 |
| instrument | 执行测试用例 |
| press() | 按键 |
| reboot() | 重启 |
| removePackage() | 删除指定Package |
| startActivity() | 启动应用 |
| touch() | 点击 |
常用方法:
- installPackage(string path)
-
- removePackage(string package)
-
- startActivity(string uri, string action, string data, string mimetype, iterable categories dictionary extras, component component, flags)
touch(integer x, integer y, integer type)
touch参数说明:
drag(tuple start, tuple end, float duration, integer steps)
drag参数说明:
用来保存各种格式的测试截图,并可以进行图像对比
| API | 功能 |
|---|---|
| convertToBytes() | 转换图像格式 |
| getRawPixel() | 获取当前坐标像素元组 |
| getRawPixellnt() | 获取当前坐标像素值 |
| sameAs() | 图像对比 |
| writeToFile() | 保存图像文件到指定的文件路径 |
| getSubImage() | 截取子图像 |
| takeSnapshot() | 屏幕截图 |
常用方法:
编写Python测试代码:
- # coding=utf-8
-
- # 引入本程序所用到的模块
- from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
-
- # 连接手机设备
- device = MonkeyRunner.waitForConnection()
-
- # 截图
- result = device.takeSnapshot()
- # 将截图保存到文件
- result.writeToFile('E:\\manage\\Test1_001.png', 'png')
-
- # 卸载APP
- device.removePackage('com.baidu.searchbox')
- print('Uninstall Success!')
-
- # 暂停5秒
- MonkeyRunner.sleep(5)
-
- # 截图
- result = device.takeSnapshot()
- result.writeToFile('E:\\manage\\Test1_002.png', 'png')
-
- # 安装新的APP
- device.installPackage(r'E:\Android_apk\baidusearch1006979t.apk')
- print('Install Success!')
-
- # 暂停5秒
- MonkeyRunner.sleep(5)
-
- # 截图
- result = device.takeSnapshot()
- # 将截图保存到文件
- result.writeToFile('E:\\manage\\Test1_003.png', 'png')
作者:Cyzhouke
链接:https://www.jianshu.com/p/30532d06306b
使用MonkeyRunner连接设备,进行自动安装并启动APP,完成登录功能,并截图保存到指定目录下
步骤:
1、连接设备
2、安装App
3、启动App
4、点击用户名,密码输入框,完成输入
5、点击登录
6、截图
- from com.android.monkeyrunner import MonkeyRunner as mr
-
- from com.android.monkeyrunner import MonkeyDevice as md
-
- from com.android.monkeyrunner import MonkeyImage as mi
-
- #启动服务
- print("-----connect devices-----")
- device=mr.waitForConnection()
- print("-----succeed start-----")
-
- print("-----install app-----")
- device.installPackage(r"F:\kaoyan3.1.0.apk")
- print("-----succeed install-----")
-
- print("-----start App-----")
- package="com.tal.kaoyan"
- activity="com.tal.kaoyan.ui.activity.SplashActivity"
- runComponent=package+"/"+activity
- device.startActivity(component=runComponent)
-
- mr.sleep(3) #等待
-
- #点击取消更新按键
- print("-----click cancel update-----")
- device.touch(726.2,1096.4,"DOWN_AND_UP") #对取消更新按钮执行点击弹起操作
- mr.sleep(3)
-
- #点击跳过
- print("---click skip button---")
- device.touch(982,69,"DOWN_AND_UP") #对跳过按钮执行点击弹起操作
- mr.sleep(3)
-
- #输入账号
- print("input username and password")
- device.touch(194,381,"DOWN_AND_UP") #对用户名输入框执行点击弹起操作
- mr.sleep(1)
- device.type("zxw1234") #输入登录账号
- device.touch(194,472,"DOWN_AND_UP") #对密码输入框执行点击弹起操作
- mr.sleep(1)
- device.type("zxw123456")
-
- #点击登录
- device.touch(550,628,"DOWN_AND_UP")
- mr.sleep(3)
-
- print("-----screen shot-----")
- screenshot=device.takeSnapshot() #截屏
- screenshot.writeToFile(r"C:\Users\k.zhou\Pictures\Saved Pictures\kyb.png","png") #保存图片