转:Monkeyrunner入门之——控件交互总结

来源:互联网 发布:哪个软件衣服好看 编辑:程序博客网 时间:2024/05/16 07:47
http://www.51testing.com/html/64/505964-834183.html

在写了两个monkeyrunner的自动化脚本之后,遇到了这样的问题,monkeyrunner无法处理gbk编码的中文.(我还没找到扩展的方法)

     之前写的脚本需要获取button,然后对button进行点击.我是通过使用hierarchyviewer来查看各个控件的ID从而获取button的.下面对整个的流程做一个梳理


  • 需要import的东西有:     
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
from com.android.monkeyrunner.easy import EasyMonkeyDevice
from com.android.monkeyrunner.easy import By
from com.android.chimpchat.hierarchyviewer import HierarchyViewer
from com.android.hierarchyviewerlib.device import ViewNode
from com.android.monkeyrunner import MonkeyView

     1.  MonkeyRunner和MonkeyDevice是最基础的类.
     2.  EasyMonkeyDevice提供了一些根据ID进行touch,type,locate,getText的方法.具体见源码:
http://source-android.frandroid.com/sdk/monkeyrunner/src/com/android/monkeyrunner/easy/EasyMonkeyDevice.java
     3.  By提供了根据ID返回PyObject的方法,使用EasyMonkeyDevice和By的配合可以利用ID做很多事情.
     4.  HierarchyViewer提供了根据ID找到ViewNode,对viewnode的一些操作等
     5.  ViewNode类的一个对象就代表了一个控件.控件上的所有属性,包括mID,mText,height,width都可以从这个类得到.从viewnode的java源码中可以得到非常多的信息
MonkeyView这个类我还没有搞清楚,从源码来看,也可以从这个类得到很多信息,包括parent,text等等.但是我对monkeyview对象的操作一直不成功,所有方法的调用都提示 No accessibility event has occured yet.目前还没有查出原因和解决方法.


  • 最基本的操作
device = MonkeyRunner.waitForConnection()     #等待设备的连接
easy_device = EasyMonkeyDevice(device)          #得到一个EasyMonkeyDevice对象
hierarchy_viewer = device.getHierarchyViewer()#得到一个HierarchyViewer对象
          基本上所有的程序都会用到这几个对象来对控件进行操作


  • 几种得到控件上的文字的方法  
               1.  用id通过By来获取:text=easy_device.getText(By.id('id/text'))
               2.  先获得ViewNode:viewnode = hierarchy_viewer.findViewById('id/text')    
                    再调用HierarchyViewer的方法:text=hierarchy_viewer.getText(viewnode)
               3.  直接从ViewNode的属性表中得到:text=viewnode_text.namedProperties.get("text:mText").value

其实前两种方法本质上都是把第三种方法写成自己的函数而已.

需要声明的是,上面的方法得到的text如果是英文的话,就不会有什么问题.如果是gbk编码的中文则在monkeyrunner中无法正常显示,你将会得到一些乱码.这个问题今天研究了一整天,还没有得到解决,希望能有人提供些帮助啊!


  • 按钮如何点击!!!
monkeyrunner上press一个button有很三种办法

     1.  通过MonkeyDevice的touch()方法.这是最直接也是最容易出错的方法,因为button在不同的手机上像素坐标是可能发生变化的.通过查看help文档,可以发现device     提供了非常方便好用的功能:有drag、press、touch、type
          drag()模拟在screen上的drag操作,需要解锁或者在屏幕实现上下滑动时可以使用
          如:device.drag((50,350),(50,100),0.1,10)
          Args:前两个表示开始与结束的像素坐标,后两个表示完成的耗时与分步
     2.  根据ID进行touch。使用HierarchyViewer的话,你可以很容易得看到各个控件的ID,然后使用下面的语句去按按钮:
easy_device.touch(By.id(id),MonkeyDevice.DOWN_AND_UP).当然,这个方法会出现一个让人头疼的问题,对于下拉列表和弹出框,这个touch常常会出错。因为下拉列表和弹出框的的坐标系问题,你获取到的button坐标是相对于列表和弹出框的,并不是相对于屏幕。在这种情况下,你只能自己去计算一个坐标变换。把相对坐标变换成屏幕坐标。这个函数附在最后。
     3.  直接根据button上的mText去定位butto.这个用法就比较高级了,虽然MonkeyDevice提供了一个方法叫 getViewsByText,这个方法能根据提供的text去找monkeyview,但是我死活没法用它。没办法,只能自己写函数。这个函数也在最后。(因为该死的编码问题,暂时只能找到英文的button)




  • 关于中文编码

     monkeyrunner是Jython写的.而Jython是不支持东南亚语言的.如果在程序中获取到的值是gbk编码的,想直接打印出来的话,会提示unknown encoding gbk.
     那么如何解决这个问题?
     很自然想到可以对这个值做decode么?decode成unicode.很遗憾,不可以.我们只能对这个gbk编码的值再做个utf-8编码来进行显示.而且显示的还是乱码

     python中编码的转换实际上是str和unicode的转换.
     直接写a='中文',a的类型是一个str.
     如果写a=u'中文',a的类型是一个unicode.
0 0