大家都知道monkey是一只会乱跑的猴子,主要功能就是抗压测试,测试APP会不会闪退/崩溃/无响应。下面我写的脚本是在python中调用一些monkeyrunner的函数,让这只乱跑的猴子模仿我们的操作,为我们节约时间同时也解放我们的双手~
一、配置环境
首先是配置环境,需要jdk啊,sdk啊之类的,这里就不多做介绍。
二、进入shell模式
配置好所有环境后现在cmd窗口下验证一下是否能正常使用,在cmd窗口输入命令:monkeyrunner。如果显示java的版本号信息并进入shell命令交互模式就代表这个环境已经配置好啦(如下图),可以开始写jio本解放双手了。如果显示monkeyrunner不是内部或外部命令的话就需要回去看看自己每一步有没有正确进行~
那进入之后呢,先打开我们需要测试的模拟器或者手机 ps:真机需要开启开发者模式哦~
(那怎么才能知道自己的电脑检测到几台设备呢,这个时候需要ctrl+z退出shell模式,在cmd下输入adb devices来查找,会出现它检测到的所有设备,如图)
进入shell模式后有什么用呢,其实shell模式就是直接命令monkey来操作的,比如叫这只小猴子去倒杯水,在shell模式下必须分开命令,先告诉monkey你需要站起来,再告诉他直走左转,抬起手,等等等等。那每次进行一个动作还要输入这么多命令。这个时候我们PyCharm的作用就来了,PyCharm会把你对monkey的每一条命令装到一个文件里,等到你想让monkey去帮你“倒杯水”的时候直接调用。
对自己写的代码不自信的小伙伴可以在shell模式下一条一条的对软件操作然后再写入文件中,软件做出反应就代表代码ok,反之则需要去看看是不是标点符号错了之类的。
三、导入monkeyrunner模块
导入MonkeyRunner需要的一些函数,直接在shell交互模式下输入命令:
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice 然后回车
没有提示就是最大的提示,提示成功导入了。导入以后我们要去连接我们需要操作的设备~
四、开始操作
输入命令:device=MonkeyRunner.waitForConnection(参数1,参数2)
如果只有一个设备括号就不需要再括号里填东西 如果有多个设备需要在括号里加入参数(参数1:超时时间/单位是秒/浮点数/默认是无限期的等待,参数2:设备id(可以用adb devices查看id)默认为真机优先)
没有提示,进入下一步,下一步要这只猴子安装软件了,使用命令device.installPackage(APK的路径)
或者直接把APK文件拖到模拟器中也可以安装软件
成功后会返回true,在模拟器也能看到这个APP。下一步启动,命令:device.startActivity(component="package名/.activity")
那么问题就来了,我该怎么得到包名呢
使用aapt,aapt是sdk里自带的工具在sdk\build-tools\目录下,在此目录下进入cmd窗口,输入命令:aapt dump badging D:\APK的路径(路径中不能有空格~)
成功打开软件后就可以对软件进行操作啦,要模仿人的操作需要知道手机或者模拟器上的坐标,根据坐标来指定monkey需要点哪里。下面介绍几个获取坐标的工具。
五、工具介绍
工具一:uiautomatorviewer.bat 这个工具是sdk自带的,在sdk\tools下,在cmd里输入uiautomatorviewer.bat也行,直接找到该文件双击也行,打开之后是这样的
点击红色圈圈里的地方就可以截取到设备的屏幕,红色圈圈右边那个图标就是具有层次性的截图,一般只需要用到前面这个就好啦~截出来以后是这样的
任意点击一个地方就可以抓取该位置的坐标,如上图所示,下载的位置是【250,595】【406,720】,第一个括号里的是红色圈圈的左上角那个点的XY坐标,第二个括号里的是右下角点的XY坐标,所以我们只需要在两个X值之间任意选择一个数,两个Y值之间任意选择一个数,例如【300,600】
工具二:通过开发者选项里的指针位置获取坐标
上面的XY值就是该点的坐标
工具三:monkeyrecorder获取坐标
在已经导入monkeyrunner,monkeydevice后还需要导入monkeyrecorder 命令:
from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder
导入之后连接,命令:device=MonkeyRunner.waitForConnection()
连接好了之后就是启动啦,命令:recorder.start(device)
PS:as的意思是命名的意思,为了方便后续调用
这里全部操作完了之后会弹出一个monkeyrecorder的弹窗,这里获取的坐标就比较方便,点击一下就有一个唯一坐标出现在右边,在模拟器上操作,在recorder上记录坐标,如果碰到recorder上界面和模拟器不同步的情况可以点击右上角的refresh display就可以刷新页面啦~
点击的每一步的坐标都会在右边展示出来,如上图
工具介绍完啦~知道怎么获取坐标后就可以开始写具体操作的代码了
monkey runner中会用到的一些命令:
截图;
result = device.takeSnapshot()
result.writeToFile('C:\\Users\\Martin\\Desktop\\test.png','png')
延时(秒);
MonkeyRunner.sleep(3)
滑动屏幕;
for i in range(1,70):
device.drag((250,850),(250,110),0.1,10) //开始,结束,持续时间,步骤
for i in range(1,70):
device.drag((250,110),(250,850),0.1,10)
触击屏幕;
device.touch(507,72,"DOWN_AND_UP")
按键
按下HOME键 device.press('KEYCODE_HOME','DOWN_AND_UP')
相应的按键对应的名称如下:
menu键:KEYCODE_MENU
home键:KEYCODE_HOME
back键:KEYCODE_BACK
search键:KEYCODE_SEARCH
call键:KEYCODE_CALL
end键:KEYCODE_ENDCALL
上导航键:KEYCODE_DPAD_UP
下导航键:KEYCODE_DPAD_DOWN
左导航键:KEYCODE_DPAD_LEFT
右导航键:KEYCODE_DPAD_RIGHT
ok键:KEYCODE_DPAD_CENTER
上音量键:KEYCODE_VOLUME_UP
下音量键:KEYCODE_VOLUME_DOWN
power键:KEYCODE_POWER
camera键:KEYCODE_CAMERA
其实写起来很简单,稍微有点让人头秃的是前面的步骤,下面放上我自己写的一个简单的脚本
#coding:utf-8
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder
device=MonkeyRunner.waitForConnection()
device.installPackage("D:\monkeyrunner\baoming.apk")
recorder.start(device)
MonkeyRunner.sleep(3)
runComponent = ("baoming/.zhuaqudaode.present.SplashActivity")
device.startActivity(component="com.zhuaqudaode.debug/.com.zhuaqudaodeSplashActivity")
MonkeyRunner.sleep(3)
device.touch(477,317,"DOWN_AND_UP")
MonkeyRunner.sleep(5)
device.touch(623,1232,"DOWN_AND_UP")
MonkeyRunner.sleep(2)
device.touch(380,194,"DOWN_AND_UP")
MonkeyRunner.sleep(2)
device.touch(612,384,"DOWN_AND_UP")
MonkeyRunner.sleep(2)
device.touch(672,96,"DOWN_AND_UP")
MonkeyRunner.sleep(2)
device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP)
MonkeyRunner.sleep(1)
device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP)
device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP)
print("pass")
最后最后
adb logcat > ****.log 是把monkey日志文件重定向一个地方,方便查看错误日志