相信用过一段时间Robotium的同学一般都遇到过如下情况:界面跳转到被测程序外以后,Robotium毫无对策了,这也是Instrumentation框架致命的一个缺点;然而领导是不会管你这些很“充分”的理由的…
Ok,既然我们有这样的需求,还是想办法解决吧。调研了几天终还是实现了一个曲线救国的方法:
实现原理:编写一个程序A,用于接收CASE中发送的指定广播,当程序A接收到指定的广播后会响应你注入的动作事件。
准备工作:
熟悉Service 、BoradCastReceiver、input keyevent, 有不清楚的同学可以先百度下以上知识模块。
具体实现:
1、首先为了方便我们使用,我们可以设置为程序A为开机启动一个Service,该Service中注册一个BoardCastReceiver用于接收一个特定action的广播,设置一个IntentFilter:IntentFilter mIntentFilter=new IntentFilter(); mIntentFilter.addAction(“android.zered.action”);然后在BoardCastReceiver的OnReceive方法中使用Runtime.getRuntime.exec(cmdB)执行我们Case中发送过来的指令(input keyevent xx 当然也可以是其他的一些shell命令)。注意:关于设置程序开机启动,3.1以后Android系统对广播接收做了安全处理——未启动过的程序是不能接收广播的,当然我们还是有方法解决:即把该程序设置为系统级应用即可,然后把该程序push到system/app下重启手机;
2、步骤1的完成已经为我们完成了一个命令执行端(可以理解为CS的server端),现在我们需要做的是发送这个广播,发送广播的方法为context.sendbroadcast,所以我们在Case中可以使用solo.getCurrentActivity.sendbroadcast发送广播;
剩下的是我们要把这个命令行cmdB封装到广播中,Intent intent=new Intent();intent.setAction(“android.zered.action”);intent.putExtra(TAG,cmdB);solo.getCurrentActivity.sendbroadcast(intent);
Ok,这样以来一个带有命令行的广播算是发送出去了。
3、以上步骤完成以后,步骤1启动的程序A中的Service接收到步骤2发送的广播以后,会执行我们发送的命令行指令cmdB了:Runtime.getRuntime.exec(intent.getStringExtra(TAG))
以上是Robotium跨应用的一种处理方法,欢迎大家拍砖。