monkeyrunner的使用和自动测试微信
2014-03-17 17:21
232 查看
最近公司需要测试微信、QQ等业务的无线传输品质参数,但是由于此类应用开发的API不够全。比如微信只能使用SDK实现分享到朋友圈,如果要发送信息则没有相关的API公开出来,只有把信息发送到微信,然后通过微信在发送信息的API。故此,考虑使用被动监控的方法来实现。如此,就有个自动启动微信并发送信息的功能需要实现。网上搜了下,发现Google Android SDK下有个叫monkeyrunner的工具,用于自动化测试Android程序,很不错,用此工具实现了下此功能。
简单列举下monkeyrunner的功能
其他详细信息可参加Android sdk文档,路径
MonkeyRunner自身提供脚本录制功能,即MonkeyRecorder。 将下面代码保存成recorder.py
录制产生的结果,myRecorder.mr:
想要录制回放,还要借助
使用命令
按照以上的例子的确没问题,但是中间有两个小问题,一个是touch坐标的获取,另一个是微信包名和activity的获取。
坐标的获取我用的是recorder.py中的录制功能,目的是为了通过点击(电脑鼠标点击)获取点击某些点的坐标,我用photoshop试过发现用photoshop获取的坐标和实际录制的坐标不一致,有放大的可能。
至于包名获取的方法可以启动微信的时候监控eclipse中的logCat事件来获取或者查看/data/data/中的安装包包名来获取,微信的包名为 com.tencent.mm 。
activity名我是通过JAVA代码来实现的,如下代码
注意:这里要在AndroidManifest.xml中给android.permission.GET_TASKS权限。
最后获取的微信登陆成功后的activity名为 com.tencent.mm.ui.LauncherUI 。
简单列举下monkeyrunner的功能
常用API
#需要引入的模块 from com.android.monkeyrunner import MonkeyRunner as mr from com.android.monkeyrunner import MonkeyDevice as md from com.android.monkeyrunner import MonkeyImage as mi #等待设备连接,30秒超时,后面是设备名称,该名称可以通过执行命令行`adb devices`获得 device = mr.waitForConnection(30,'123123135002735') #安装apk包 device.installPackage('d:/有道词典V4.0.3.apk'.decode('utf-8')) #卸载应用程序 device.removePackage('com.youdao.dict') #启动应用程序 device.startActivity(component='com.youdao.dict/.activity.DictSplashActivity') #等待程序加载,5秒 mr.sleep(5) #拖动操作,四个参数,前两个是初始点、结束点坐标,0.5是持续时间,1是步数 device.drag((550,500),(100,500), 0.5, 1) #触摸操作,三个参数,X坐标、Y坐标,触摸类型 device.touch(80, 1050, "DOWN_AND_UP") #截图并保存,注意如果名字中有中文,需要进行utf-8编码,否则乱码 now = time.strftime("%Y-%m-%d-%H-%M-%S") mainPageImage = device.takeSnapshot() mainPageImage.writeToFile("d:/"+"主页面截图".decode("utf-8")+now+".png", "png") #点击后退键,键盘码详情可以去查sdk帮助文档,路径:android-sdk-windows/docs/reference/android/view/KeyEvent.html device.press("KEYCODE_BACK", "DOWN_AND_UP") #将日志输出到外部文件,在python中使用中文,需要在文件开头将编码设置为utf-8,否则乱码 log = open('d:/monkenyLog.txt', 'w') log.write("等待手机连接...、\n") log.close() #截图比较,sameAs()第二个参数表示相似度,0表示完全不相似,1表示完全相同 imageTrue = mr.loadImageFromFile('d:/shot/true.png') if(imageTrue.sameAs(mainPageImage, 0.75)): log.write('截图比较成功\n') else: log.write('截图比较失败\n')
其他详细信息可参加Android sdk文档,路径
android-sdk-windows/docs/tools/help/monkeyrunner_concepts.html
录制脚本
MonkeyRunner自身提供脚本录制功能,即MonkeyRecorder。 将下面代码保存成recorder.pyfrom com.android.monkeyrunner import MonkeyRunner as mr from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder device = mr.waitForConnection() recorder.start(device)
录制产生的结果,myRecorder.mr:
TOUCH|{'x':92,'y':936,'type':'downAndUp',} TOUCH|{'x':357,'y':688,'type':'downAndUp',} TOUCH|{'x':285,'y':82,'type':'downAndUp',} TYPE|{'message':'hello',} TOUCH|{'x':679,'y':82,'type':'downAndUp',}
想要录制回放,还要借助
monkey_playback.py文件,这个文件用来连接手机,初始化一些变量,解析我们的myRecorder.mr。
使用命令
monkeyrunner monkey_playback.py myRecorder.mr即可运行。
两个小问题
按照以上的例子的确没问题,但是中间有两个小问题,一个是touch坐标的获取,另一个是微信包名和activity的获取。坐标的获取我用的是recorder.py中的录制功能,目的是为了通过点击(电脑鼠标点击)获取点击某些点的坐标,我用photoshop试过发现用photoshop获取的坐标和实际录制的坐标不一致,有放大的可能。
至于包名获取的方法可以启动微信的时候监控eclipse中的logCat事件来获取或者查看/data/data/中的安装包包名来获取,微信的包名为 com.tencent.mm 。
activity名我是通过JAVA代码来实现的,如下代码
/** * 获取系统中正在运行的任务信息(强调下,任务是多个activity的集合) */ public void run(){ String info = "" ; // 获取的正在运行的activity的最大数量(防止太多,系统承受不了啊)、 int maxNum = 40; // ActivityManager的功能是为系统中所有运行着的Activity交互提供了接口,主要的接口围绕着运行中的进程信息,任务信息,服务信息等 ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); /** * 获取正在运行的任务这里一定要注意,这里我们获取的时候, * 你的任务或者其中的activity可能没结束,但是当你在后边使用的时候,很有可能已经被kill了哦。 * 意思很简单,系统返给你的正在运行的task,是暂态的,仅仅代表你调用该方法时系统中的状态, * 至于后边是否发生了该变,系统概不负责、 */ List<ActivityManager.RunningTaskInfo> runningTasks = activityManager.getRunningTasks(maxNum); for(ActivityManager.RunningTaskInfo taskInfo:runningTasks){ info+="一个任务信息开始:/n"; info+="当前任务中正处于运行状态的activity数目:"+taskInfo.numRunning; info+="当前任务中的activity数目: "+taskInfo.numActivities; info+="启动当前任务的activity名称:"+taskInfo.baseActivity.getClassName(); }
注意:这里要在AndroidManifest.xml中给android.permission.GET_TASKS权限。
最后获取的微信登陆成功后的activity名为 com.tencent.mm.ui.LauncherUI 。
相关文章推荐
- Android 使用monkey自动测试
- MongoDB(自动分片+shard备份) 机器故障 (使用kill -9仿真) 稳定性测试
- 微信公众测试号使用Java Spring MVC,接口配置token验证。
- 微信跳一跳自动辅助工具【exe文件,无需python环境,下载即可使用】
- SecureCRT 自动测试脚本的使用方法
- Web API 自动生成帮助文档并使用Web API Test Client 测试
- 如何:从命令行使用 MSTest 运行自动测试
- Android 测试工具Monkey & Monkeyrunner 使用方法
- 使用vs2010的Coded UI Test实现数据驱动的用户自动登录测试
- Ant 使用Junit自动测试要注意的问题
- 关于ios使用Automation自动测试
- android 测试 Monkey 和 MonkeyRunner 的使用
- Android自动测试之monkeyrunner工具(二)
- 转载【微信支付】jsapi支付之传参问题(使用微信官方SDK之PHP版本) V3之WxpayPubHelper 亲测有效,V3WxpayAPI_php_v3.zip版未测试,理论上也是一样的。
- Android自动测试之monkeyrunner工具(一)
- 使用Maven自动打包配置文件生成开发环境,测试环境,生产环境
- Android自动测试:monkey使用
- 使用allpairs自动设计组合测试用例
- 【Monkey测试】Android自带自动测试工具monkey的使用
- Android Studio debug使用release的签名,省去微信登录之类的要打成正式包才能测试的麻烦!