咱們在用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的用法。