当前位置:Gxlcms > 数据库问题 > 基于ADB框架Robotium跨进程操作

基于ADB框架Robotium跨进程操作

时间:2021-07-01 10:21:17 帮助过:2人阅读

  •   
  • adbDevice.tap(element);  //点击拍照按钮  
  •  

    好,接下来点击了拍照按钮之后,拍照功能还会让你选择是确定还是取消操作,如下图(4)所示:

    技术分享

     

    图(4)

    那么如法炮制,我们通过查询获知,这个用于确定的“√”按钮,它的属性能用于定位的其实只有class属性。不过这里要注意的是,此时由于我们用的是class属性,大家可以看到界面上class属性跟我们要点击的“√”这个按钮相同的对象很多,所以我们必须用findElementsByClass方法了。这个方法返回的是一个ArrayList<Element>,所以我们可以写如下的代码来获取所有class属性为”android.widget.ImageView”的元素列表。

     

    [java] view plaincopy  
    1. ArrayList<Element> imageViews =position.findElementsByClass("android.widget.ImageView");  

     

     

    好,写完之后,现在问题来了,究竟这个数组里面哪个index才是对应的我们要点击的“√”按钮呢?经过试验,我发现界面上多个相同元素返回到数组中时,对应元素位置是按照界面上的位置从上到下、从左到右来的,所以我们要点击的这个按钮的index应该是4。所以点击它的代码如下:

     

    [java] view plaincopy  
    1. adbDevice.tap(imageViews.get(4));    //2是x,3是重拍,4是√  

     

     

    上面的代码运行完后,界面就会回到我们的被测程序,后面的操作就不用我再多说了,大家看看是不是非常简单?技术分享

     

    例子2、跨进程操作之打电话

    有了第一个例子的基础,其实第二个例子就很好实现了。被测程序非常简单,如下图(5)所示:

    技术分享

     

    图(5)

    点击“拨打该号码”后,系统自动进入拨号界面,所以也是典型的跨进程测试场景。

     

    实现方法还是跟例1中一样,先还是用uiautomatorviewer查看界面中的对象信息,再使用对应的方法来操作对象即可。而且在这个例子中,我还给大家演示了另外一种情况,即有些跨进程操作不但要进行操作,还要取得一些对象属性来进行验证,这也是基本可以的。这里我直接给出我的测试代码(稍微封装了一下):

     

    [java] view plaincopy  
    1. public boolean CallUtil(String callNumber){  
    2.         Element  element;  
    3.         boolean  result;  
    4.         //验证是否拨打了正确的号码  
    5.         if(callNumber.length() == 11){//正常号码需要转变为 x xxx-xxx-xxxx的格式  
    6.                 StringformatCallNumber = callNumber.substring(0, 1) + " " +callNumber.substring(1, 4) + "-" + callNumber.substring(4,7) +"-" + callNumber.substring(7, callNumber.length());  
    7.                 element= position.findElementByText(formatCallNumber);  
    8.                 try{  
    9.                         Thread.sleep(2000);  //线程休眠2秒  
    10.                 }catch (InterruptedException e) {  
    11.                         e.printStackTrace();  
    12.                 }  
    13.         }else{  
    14.                 element= position.findElementByText(callNumber);//除正常号码外,其他格式的号码不进行格式转换  
    15.         }  
    16.         if(element != null){  
    17.                 result= true;  
    18.         }else{  
    19.                 result= false;  
    20.         }  
    21.         element= position.findElementByContentdesc("End");   //挂断电话  
    22.         if(element != null) adbDevice.tap(element);  
    23.         return  result;  
    24. }  

     

     

    好了,整个过程非常简单。我相信能用robotium的童鞋用起来应该都没有任何问题,所有代码都是非常易用易懂的。

     

    相信通过前面的实例,大家可以发现说这是“史上最简单”的Robotium跨进程操作解决方案我估计没人会反对,这并不是夸大事实、博人眼球,确实很简单,功能也很强大。其他也不用我多说了,最后我再来对该框架总结一下下吧:

    优点:

    1. 确实非常全,基本封装了adb的所有常用命令,它本身就是一个adb命令使用大全了。

    2. 框架接口设计清晰易懂,简单明了,封装成jar包,用起来也很方便。另外希望大家都能看看它的源码并了解它的实现细节,作者封装得还是很不错的,很值得我们学习,而不仅仅是简单地使用它。

     

    目前已知的不足:

    1. 手机的版本必须是4.1以上,即至少必须支持uiautomator的手机才行,因为该框架本身底层是依赖于uiautomator来dump出对象布局xml文件,最终获取对象的坐标进行操作的,所以你的手机版本本身并不支持uiautomator的话,就没法实现dump操作。

    2. 如果是真机的话,必须要root后的才可以。

    2. 有些对象是uiautomator也无法识别和操作的,那当然这个框架也无能为力了。比如屏幕最上方的通知消息栏的对象,所有工具都没法显示和识别,这个肯定没办法了,另外还比如输入文字时的弹出键盘上的按钮对象等,也无法识别,大家可以试试。

     

    以后想要尝试的改进:

    1. 对于手机版本的支持问题,个人觉得有个曲线救国的方法可以解决。即我们可以稍微修改下源码,加入判断手机版本的代码,判断当前手机版本如果高于4.1,就直接通过uiautomator来dump,如果低于4.1,则读取PC上事先导出到指定位置的xml文件。这样的话,如果你使用的手机不是4.1以上的版本,只需要事先把被测应用用4.1以上版本的手机通过uiautomator先dump到PC的一个指定路径上就行了,这样效果应该是一样的,只要最终能得到对象坐标就OK。

    2. 再加一些比较实用的功能。比如现在可以根据text来查找对象,但实际上很多时候我们可能是得到对象了,但想通过这个对象去获取对象的其他属性,所以建议增加类似getXXXXByElement(Element e)这样的方法,有空试一下,呵呵。

     

    以上只是我的一些个人想法,如果大家还有一些什么别的建议,也欢迎大家都提出来,一起来完善这个很实用的框架。

     

    最后,再次感谢AdbForAndroid框架的作者: xuxu。

    想要研究框架源码的童鞋,可以去github地址下载:https://github.com/gb112211/Adb-For-Robotium

    本文中相关样例工程源码(含被测程序和测试程序)下载

    另外,如果实在不知道怎么用这个框架的童鞋,可以参考下光荣之路的美女讲师的视频,里面有讲怎么去用这个框架:http://pan.baidu.com/s/1i3raNv3?qq-pf-to=pcqq.group

    基于ADB框架Robotium跨进程操作

    标签:

    人气教程排行