如何使用monkeyrunner与view进行交互

android官方里的monkeyrunner只介绍了一些有限的ui测试方法. 比如只能指定坐标点模拟操作行为, 测试结果对比只能通过截图进行简单对比结果. 当然我们可以聪明的来实现猜测到view视图的坐标点,那么我们就可以像robotium一样, 在monkeyrunner脚本中,对控件级的view视图进行交互操作.

如何实现捕捉到当前activity展现的所有的控件信息呢?monkeyrunner.jar 里目前有EasyMonkeyDevice.class 和 By.class , 提供了一些新的api, 很大的满足了一些高级需求.

有几个blog文章对EasyMonkeyDevice类的api进行了一些示例, 非常浅显易懂.

yan1391的博客 Android 测试之初试 Monkeyrunner 。 国外的 diego也写了一系列关于monkeyrunner 的文章,并自己写了一些viewclient apis 可以下载到 ,非常不错.请大家参考,但是diego 把博客写道了blogspot上, 哈,所以大陆的朋友们就郁闷了.只能翻墙看了.

其实以上所有文章主要通过使用了By , EasyMonkeyDevice , monkeydevice 这3个类来实现与view object的交互. 那我们就对这3个类进行简单的剖析一下.

访问这里 可以看到EasyMonkeyDeviceBy 的源码(在线浏览).

1.  By.class 可以根据id获得viewobject . 例如我们有一个text view 的id是 id/account 那么我们就可以通过如下获得该view object.
account = By.id(‘id/account’)

2. EasyMonkeyDevice.class 获得view object后,可以用EasyMonkeyDevice类进行一些操作. getText() , touch(), type(). 分别为获得该view object 的文本值, 进行触摸屏操作(其会获取view object的坐标值,并进行操作). type() 则会先touch, 然后输入字符.

3. monkeyDevice 在线浏览源码

# 通过MonkeyDevice获取HierarchyViewer对象实例

hierarchy_viewer = device.getHierarchyViewer()

#通过HierarchyViewer获取ViewNode实例(一个viewnode实例代表一个控件)

view_node = hierarchy_viewer.findView(By.id(‘id/emptyText’))

#获取控件内的文本
text = view_node.namedProperties.get(‘mText’).toString()
if text.find(‘have any’) < 0:
print ‘not find have any!’
else:
print ‘find have any!’
print text

总结: 如此这般,我们用monkeyrunner 也可以写出和robotium一样的脚本,可以对view object 进行操作. 而且可以和坐标点值的方法进行融合. 可以由很大的突破.

另发现了一些问题,目前怀疑是android monkeyrunner.jar 的bug. 问题是EasyMonkeyDevice的touch()函数,不能对应用程序弹出的对话框正确的定位坐标值. 当一个应用程序弹一个对话框时(确认还是取消之类的对话框),当根据id touch确定和取消时, 定位的坐标点错误,导致无法实现想要的功能.还未具体分析时什么时候对话框会产生能该问题. 为什么说可能是bug, 是因为用tools里的HierarchyViewer 进行察看时,发现该对话框的实际坐标显示位置有问题. 但渲染到手机屏幕确是正常的. 这导致, 通过hierachy获得的坐标值有问题,点击操作无法触发对应的button view.

此篇文章已被阅读3289 次

Add a Comment

邮箱地址不会被公开。 必填项已用*标注