在写了两个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对象
基本上所有的程序都会用到这几个对象来对控件进行操作
- 几种得到控件上的文字的方法
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.