跳出Robotium单进程限制,实现跨进程调用的两种方式浅谈

用过Robotium做Android自动化测试的同学都知道,Robotium因为继承了instrumentation而无法进行跨进程的调用,比如模拟按键点击(据说4.3以后instrumentation有了getUIAutomator的入口,然后就木有然后了,本人没有亲试且不在本文讨论中)。

本人亲试了两种实现方式,经实验均能实现简单的事件,比如:发送按键、点击、长按、拖动等,最终的调用方式都采用4.1以后的input命令实现,当然你得是root。具体命令如下:

[email protected]:/ $ input

input

usage: input ...

       input text <string>

       input keyevent <key code number or name>

       input tap <x> <y>

       input swipe <x1> <y1> <x2> <y2>

跨应用方式一:关键字:Broadcasting

跨应用方式二:关键字:aidl

下面具体来说说如何实现:

第一种方式比较简单,一句话描述一下就是,通过在测试setup中启动一个service,在service中动态注册一个广播监听从客户端发送过来的文本命令,接收到之后通过Runtime去执行。实现步骤如下:

1、新建一个service,在service创建的时候动态注册一个广播(至于为啥要动态注册,其实静态也可以,但静态的话不能主动解除),在onReceive方法中实现执行命令的方法。如:

device.sendKeyEvent(intent.getStringExtra("cmd"));

2、安装这个service项目到手机;

3、在robotium的setup中start这个service,再到用例发送命令到service中执行;

4、最后可以清理service和广播。

第二种方式,简单说,通过建立aidl文件,实现其接口通过IPC通道跨应用,原理跟第一种是一样的,客户端发送命令到服务端执行。(这里不详细说了,aidl按照官网一步步做就好了)

时间: 2024-10-30 14:09:21

跳出Robotium单进程限制,实现跨进程调用的两种方式浅谈的相关文章

System.Web.Http.Cors配置跨域访问的两种方式

System.Web.Http.Cors配置跨域访问的两种方式 使用System.Web.Http.Cors配置跨域访问,众多大神已经发布了很多文章,我就不在详细描述了,作为小白我只说一下自己的使用心得.在webapi中使用System.Web.Http.Cors配置跨域信息可以有两种方式.  一种是在App_Start.WebApiConfig.cs的Register中配置如下代码,这种方式将在所有的webapi Controller里面起作用. using System; using Sys

*Android跨进程通信的四种方式

由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于android系统中4种应用程序组件:Activity.Content Provider.Broadcast和Service.其中Activity可以跨进程调用其他应用程序的Activity:Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应

springcloud 服务调用的两种方式

spring-cloud调用服务有两种方式,一种是Ribbon+RestTemplate, 另外一种是Feign.Ribbon是一个基于HTTP和TCP客户端的负载均衡器,其实feign也使用了ribbon, 只要使用@FeignClient时,ribbon就会自动使用. 一.Ribbon 1.1新建模块client-apom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="

js对象中属性调用.和[] 两种方式的区别

JS 调用属性一般有两种方法——点和中括号的方法. 标准格式是对象.属性(不带双引号),注意一点的是:js对象的属性,key标准是不用加引号的,加也可以,特别的情况必须加,如果key数字啊,表达式啊等等. 加引号是为了将其视为整体,认识一点:从对象角度,属性是不加引号的,如name,"name"这是啥,属性不可能是“name”,所以即使加了双引号,对象调用时还是要去掉引号的 例如 使用.方法 var obj = { name: "cedric" } console.

js对象 对属性调用.和[] 两种方式遇到过得区别

1   .标准格式是对象.属性(不带双引号)     注意一点的是js对象的属性,key标准是不用加引号的,加也可以,特别的情况必须加,如果key数字啊,表达式啊等等,加引号是为了将其视为整体,认识一点:从对象角度,属性是不加引号的,如name,"name"这是啥,属性不可能是“name”, 所以即使加了双引号,对象调用时还是要去掉引号的 2   []标准格式是对象["属性"]记住属性都是没有引号的,这种方式访问属性上必须有引号 论证一点不管key带不带引号,从对象

Android学习笔记二十六.跨进程调用Service(AIDL Service)

跨进程调用Service(AIDL Service) 一.AIDL Service 1.什么是AIDL Service? AIDL,即Android Interface Definition Language.是Android用于定义远程接口,AIDL接口定义语言的语法比较简单,这种接口定义语言并不是真正的编程语言,它只是定义两个进程之间的通信接口.AIDL的语法与Java接口很相似,但存在如下几点差异: (1)AIDL定义接口的源代码必须以.aidl结尾; (2)AIDL接口中用到数据类型,除

Android中的跨进程调用技术AIDL

什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现. 与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口. Android的四大组件中的三个(Activity.Broadcast

【转】android中跨进程通讯的4种方式

转自:http://www.androidsdn.com/article/show/137 由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于android系统中4种应用程序组件:Activity.Content Provider.Broadcast和Service. 其中Activity可以跨进程调用其他应用程序的Activity: Content Pro

内存分配原理 -进程分配内存的两种方式,分别有系统调用完成brk() 和mmap()(不设计共享内存)

如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误.           这两个数值表示一个进程自启动以来所发生的缺页中断的次数. 发成缺页中断后,执行了那些操作? 当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 1.检查要访问的虚拟地址是否合法 2.查找/分配一个物理页 3.填充物理页内容(读取磁盘,或者直接置0