monkeyrunner——控件交互总结整理

时间:2021-11-28 05:41:25

一、需要import的东西有:

<span style="font-family:Courier New;font-size:12px;"><strong>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</strong></span>

  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.目前还没有查出原因和解决方法.


二、最基本的操作

<span style="font-family:Courier New;font-size:12px;"><strong>device = MonkeyRunner.waitForConnection()       #等待设备的连接
easy_device = EasyMonkeyDevice(device) #得到一个EasyMonkeyDevice对象
hierarchy_viewer = device.getHierarchyViewer() #得到一个HierarchyViewer对象</strong></span>

      基本上所有的程序都会用到这几个对象来对控件进行操作

  1)几种得到控件上的文字的方法

  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.