转自http://www.51testing.com/html/81/22381-854342.html

时光过得太快了,一晃离上一篇monkeyrunner系列的博客已经一年多了。这一年多时间经历了太多改变,一直没时间好好去总结和分享。直到今天在微博上和朋友聊到monkeyrunner,才想起趁这个机会再总结一下之前所积累的一些经验和技巧,在这里再次和大家分享下,也算是将这个从零开始系列再进一步,呵呵。

现在说起Android端的功能自动化测试工具,其实还是蛮多的了,像很早就风靡的Robotium,后起之秀Uiautomator,跨平台的appium等,几乎从工具这个层面还是可以满足大家的要求了。MonkeyRunner作为其中的一员,其实并不能算是特别好用的一款,我平时用得就不多。因为毕竟从SL4A衍生出来,不是基于 Android的直系血亲Instrumentation,天生就有运行速度慢,容易出错,可用的接口少等缺点,可谓是有点“先天不足”。当然优点还是有的,比如基于Jython语言来编写,语法简单易学,可以跨应用,可以直接以ID来操作测试,不需要签名等其他工具不具有的一些特点,所以有时也有它的用武之地,大家学习和掌握它之后应该也有一些机会是可以用到它的,紧急时候救救急啥的也还不错。

既然Monkeyrunner先天不足,如果想要让它好用的话,那当然就只能后天补足了。前段时间在网上找到一个非常强大的 monkeyrunner的第三方库wrapEasyMonkey,是基于EasyMonkeyDevice来二次封装的,并加入了自动异常处理、失败重试、case管理、断言、获取控件上的文本等,大大增强了monkeyrunner本来的功能,使得monkeyrunner强大了不止一个级别。除了运行还是比较慢这个没法解决之外,可以说其他的几乎都有了较大的改善。说句实话,原生monkeyrunner几乎没法直接使用。所以建议选用 monkeyrunner作为自己的测试工具的童鞋,都可以去找找这个包来用用,确实挺好用的。具体的用法我这里就不啰嗦了,作者的教程还是写得蛮细的,相信有一定python基础的童鞋都应该看得懂。但在这里,我想重点分享的还不止这个第三方包,还有我个人对这个包的一些改进的想法。在 wrapEasyMonkey的作者提供的包里,很多方法都是根据控件ID来操作的,比如getView(self,id)。但经常做Android自动化测试的朋友肯定都知道这里有个问题,很多时候我们的app里的控件要么没有ID,要么ID值就是重复的。在这种情况下,根据ID肯定是无法获取到这个控件的引用的。那么怎么办呢?我当时也是为这个问题非常地苦恼,但后来我仔细研究了Hierarchy Viewer得到的控件树形图,其实我们完全可以基于每个控件所在的子节点的位置,结合python函数的不定参数的特性,去获取任意已知ID的父节点的任意子节点的引用,然后再用这个引用作为参数去获取其对应的文本、断言等等,就方便多了,再也不会受到没有ID或者是ID重复的限制了。当然,要达到这样的功能需要修改原来那个包里的部分函数。

这里我举个实际例子来说明一下吧。假如我们现在就来测试一下Android自带的contact 联系人那个app,假设我们先加上了一个联系人,现在我们用monkeyrunner来验证一下我们加入的联系人的信息是否正确。这里实际上就涉及到几个比较重要的操作:1. 获取对应的控件 2. 判断上面的文字是否和预期一致,也就是下面图上三个红色框所表示的部分。hierarchy viewer里的完整的图比较大,这里显示不了,所以大家可以自己通过这个hierarchy viewer来看看。

通过hierarchy viewer里显示的树形结构来看,这里显示电话号码158xxxxxxxx的控件和邮箱地址41420872@qq.com的控件ID都为text2,很明显,重复了。所以没法用原包里的getView(self,id)方法来获取这个view的引用。那是不是就没办法了呢?其实我们可以换个角度来看,即不从ID角度,而是从这个控件树的节点角度来思考如何获得控件的引用。我们可以看到在hierarchy viewer图中的每个控件所对应的框形中,右下角都有一个数字,如下图中红色框中的0和1所示。

其实这个数字就是该控件在同级兄弟节点中的索引值,我们知道这个索引值后,就可以根据parentView.children[index]属性来获取任意父节点所对应的子节点的对象引用。其中的parentView可以是树形图中有有效ID的任意父节点,然后利用python函数的可变参数列表特性来传入所需控件的索引列表即可构造出得到任意节点引用的字符串,从而得到其引用。核心代码如下:

def getChildView(self, parentId, *childSeq):
    hierarchyViewer = self.device.getHierarchyViewer()
    str_getchildview="hierarchyViewer.findViewById('" + parentId +"')"    
    for index in childSeq:       
        str_getchildview+=('.children[' + str(index) + ']')         
    exec 'child_view=' + str_getchildview
    return child_view

现在我们来看看这段代码如何使用。比如我们刚刚那个联系人的详细信息界面的联系人号码控件的hierarchy viewer截图如下:

联系人号码控件的对象引用可由这个语句获得:phone_number=device.getChildView('id/contact_data', 0, 0, 1, 0)。其中“contact_data”这个是其父对象的ID,这个ID必须符合两个条件,即有效和唯一。通过这个ID,我们就可以得到它的任意子孙节点的引用,0,0,1,0则是联系人控件在对象树中的索引链上的位置,大家对照着图应该很容易理解。有了这个引用之后,我们就比较好对所有以ID作为参数的方法来做改造了,你想改哪个就改哪个。这里我举个例子,比如原来wrapEasyMonkey包里有个方法是用来取得控件上的文本的 getTextById(self,id),这也是我们要验证文字时所必须要用到的方法。但如上图所示,其实联系人的控件的ID是有重复的(跟邮箱地址那个控件的ID重复),我们不可能用这个重复的ID去调用getTextById方法,所以我们就只能根据刚刚我写的那个方法来先得到联系人控件的引用,再将获取文本这个方法改成根据传view的引用来获取文本。核心代码如下:

def getText(self,view):
    if view != None:        
         return (view.namedProperties.get('mText').toString().split('=')[1]).encode('utf8')

这下就要灵活很多了,就算你要获取那个对象没有ID或者ID是重复的,都不影响你的操作,因为它在对象树中的位置不可能重复,呵呵。

好了,这次就说这么多了吧。这里我只是就我自己的一些想法和感受写一些抛砖引玉的文字,有不对的地方欢迎各位指正,当然也欢迎各位看官提出更多的想法,一起来改进我们的工具,将Android平台的自动化做得更好,呵呵。

 

Android自动化测试之Monkeyrunner从零开始(三)的更多相关文章

  1. Android自动化测试之Monkeyrunner从零开始

    最近由于公司在组织一个Free CoDE的项目,也就是由大家自己选择研究方向来做一些自己感兴趣的研究.由于之前我学过一点点关于android的东西,并且目前android开发方兴未艾如火如荼,但自动化 ...

  2. Android自动化测试之Monkeyrunner学习笔记(一)

    Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...

  3. Android自动化测试之MonkeyRunner录制和回放脚本

    Android自动化测试之MonkeyRunner录制和回放脚本(十一) 分类: 自动化测试 Android自动化 2013-02-22 10:57 7346人阅读 评论(2) 收藏 举报 andro ...

  4. [转] android自动化测试之MonkeyRunner使用实例(三)

    一.使用CMD命令打开模拟器 运行monkeyrunner之前必须先运行相应的模拟器或连上设备,不然monkeyrunner无法连接设备. 1.1  用Elipse打开Android模拟器或在CMD中 ...

  5. 【转】android自动化测试之MonkeyRunner使用实例(三)

    一.使用CMD命令打开模拟器 运行monkeyrunner之前必须先运行相应的模拟器或连上设备,不然monkeyrunner无法连接设备. 1.1  用Elipse打开Android模拟器或在CMD中 ...

  6. Android自动化测试之MonkeyRunner

    1.Monkeyrunner简介 Monkeyrunner是Android系统自带的四大自动化测试工具之一,其他三个是Monkey.CTS.Benchmark:Monkeyrunner需要通过Andr ...

  7. Android自动化测试之monkeyrunner工具

    一.什么是monkeyrunner monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器.通过monkeyrunner,您可以 ...

  8. Android自动化测试之MonkeyRunner使用

    MonkeyRunner工具是使用Jython(使用Java编程语言实现的Python)写出来的,它提供了多个API,通过monkeyrunner API 可以写一个Python的程序来模拟操作控制A ...

  9. Android自动化测试之Monkeyrunner使用方法及实例

    目前Android SDK里自带的现成的测试工具有monkey 和 monkeyrunner两个.大家别看这俩兄弟名字相像,但其实是完完全全不同的两个工具,应用在不同的测试领域.总的来说,monkey ...

随机推荐

  1. Memcache+Tomcat9集群实现session共享(非jar式配置, 手动编写Memcache客户端)

    Windows上两个tomcat, 虚拟机中ip为192.168.0.30的centos上一个(测试用三台就够了, 为了测试看见端口所以没有使用nginx转发请求) 开始 1.windows上开启两个 ...

  2. [分享] Code::Blocks Windows Console 中文亂碼解決

    相信各位大大們應該都有聽過Code::Blocks這個IDE,但網路上有許多人反應Code::Blocks不能編出中文的Console程式,但 Code::Blocks最新的版本預設使用UTF-8做為 ...

  3. 设置NODE_ENV=production

    NodeJS - Express 4.0下设置环境变量NODE_ENV=production,并不是修改文件的配置信息,而是通过命令行来实现. 首先在命令行下进入项目的目录,然后先后执行如下命令: s ...

  4. Linux内核分析作业二—操作系统是如何工作的

    一.实验:简单的时间片轮转多道程序内核代码运行与分析 my_start_kernel之前都是硬件初始化,它是操作系统的执行入口,每循环100000次就进行一次打印. 执行更加简单,每次时钟中断时都会调 ...

  5. Ubuntu 12.4 下升级 Subversion 1.7

    Ubuntu 12.04 默认使用的是Subversion 1.6,而Ubutnu12.10开始,就使用的是Subversion 1.7. 如果从别人的地方拷过来的SVN目录,在使用SVN命令时会报以 ...

  6. 【转】HTTP-only Cookie 脚本获取JSESSIONID的方法

    彻底避免xss攻击的方法. 别人可以通过注入js脚本获取你的session cookie,如果幸运的话还可以获取通过js遍历你的dom树获取你的用户的用户名和密码. 如果只是通过正则表达式验证输入的话 ...

  7. 开源 P2P 直播 视频会议

    转自:http://blog.csdn.net/pkueecser/article/details/8223074 一个P2P点播直播开源项目:P2PCenter(我转过来的时候发现已经都打不开了.. ...

  8. java mail实现Email的发送,完整代码

    java mail实现Email的发送,完整代码 1.对应用程序配置邮件会话 首先, 导入jar <dependencies> <dependency> <groupId ...

  9. SQL Server性能常用语句

    查看各表的数据行数 SELECT o.name, i. ROWS FROM sysobjects o, sysindexes i WHERE o.id = i.id AND o.Xtype = ORD ...

  10. Vim Cscope安装与使用

    问题描述:        Cscope是VIM适用的工具和插件,通过Cscope可以方便的获取某个函数的定义以及被那些函数调用 问题解决:         (1)Cscope安装    注:      ...