咱们在用monkeyrunner进行Android自动化时,经过获取坐标点或控件ID进行一系列操做。因为使用坐标点时,屏幕分辨率一旦更改,则代码中用到坐标的地方都要修改,这样致使代码的复用率较低。所以,咱们多采用控件ID操做(注:控件ID须要在模拟器中使用,对于绝大多数真机不适用)。python
可是,某些控件的ID是不存在的或重复存在,那么,遇到这种状况,咱们怎样继续使用控件ID进行自动化测呢?函数
例如,下图中,我想要获取最右侧红框中的id/tv,可是,你们会发现,和它并列的也有重复的控件id值。如今咱们就讲述一下这种状况(控件ID不存在一样处理)。工具
咱们从这个控件树的节点角度来思考如何得到控件的引用。咱们能够看到在上图hierarchy viewer中的每一个控件所对应的框形中,右下角都有一个数字。其实这个数字就是该控件在同级兄弟节点中的索引值,咱们知道这个索引值后,就能够根据parentView.children[index]属性来获取任意父节点所对应的子节点的对象引用。其中的parentView能够是树形图中有效ID的任意父节点(父节点要保证惟一有效),而后利用python函数的可变参数列表特性来传入所需控件的索引列表便可构造出获得任意节点引用的字符串,从而获得其引用。ui
核心代码以下,把以下代码加入本身的python脚本中,直接调用该函数便可。spa
#定义获取重复或不存在控件id,寻找子节点函数 def getChildView(parentId, *childSeq): hierarchyViewer = device.getHierarchyViewer() childView="hierarchyViewer.findViewById('" + parentId +"')" for index in childSeq: childView += ('.children[' + str(index) + ']') print childView return eval(childView) #获取id的文本 def getText(view): if view != None: return (view.namedProperties.get('text:mText').value)
有了以上代码以后,咱们能够获取上图中的id/tv,方法以下:code
getChildView('id/province_list',5,0,0)对象
其中结合上图可知,getChildView的第一个参数即:有效且惟一的父节点blog
参数2、三依次为要获取的控件ID的父节点的父节点索引
注:用到的父节点即图中的id/province_list,有效且惟一的值。当前的父节点右下角的角标,不须要在getChildView函数中显示。字符串
这样,经过以上函数,再结合Hierarchyviewer图形,咱们获取到了重复的控件ID。
因为Hierarchyviewer看起来不是特别方便,这里再推荐一款和Hierarchyviewer相似功能的工具:uiautomatorviewer(存储在sdk\tools中,双击打开便可)
由上图中,uiautomatorviewer每一个控件前面的数字即至关于Hierarchyviewer的角标,咱们一样能够获取到目标ID的最终有效且惟一的父节点,从而调用函数getChildView('id/province_list',5,0,0)
获取到了不存在或重复的控件ID后,咱们能够经过其坐标,进行点击操做。
首先,定义一个“获取指定按钮坐标”的函数
def getBtnPoint(btn): print btn point = device.getHierarchyViewer().getAbsoluteCenterOfView(btn); return point
而后经过坐标,实现点击操做,例如:
askView = getChildView('id/tabs',1) askPpoint = getBtnPoint(askView) device.touch(askPpoint.x,askPpoint.y,'DOWN_AND_UP')
到这里,咱们介绍完了处理控件ID不存在或重复时的方法,本身实践一把,就会更能体会Hierarchyviewer/uiautomatorviewer+getChildView()获取不存在或重复控件ID的用法。