文章出處

我們在用monkeyrunner進行Android自動化時,通過獲取坐標點或控件ID進行一系列操作。由于使用坐標點時,屏幕分辨率一旦更改,則代碼中用到坐標的地方都要修改,這樣導致代碼的復用率較低。因此,我們多采用控件ID操作(注:控件ID需要在模擬器中使用,對于絕大多數真機不適用)。

但是,某些控件的ID是不存在的或重復存在,那么,遇到這種情況,我們怎樣繼續使用控件ID進行自動化測呢?

例如,下圖中,我想要獲取最右側紅框中的id/tv,但是,大家會發現,和它并列的也有重復的控件id值。現在我們就講述一下這種情況(控件ID不存在同樣處理)。

我們從這個控件樹的節點角度來思考如何獲得控件的引用。我們可以看到在上圖hierarchy viewer中的每個控件所對應的框形中,右下角都有一個數字。其實這個數字就是該控件在同級兄弟節點中的索引值,我們知道這個索引值后,就可以根據parentView.children[index]屬性來獲取任意父節點所對應的子節點的對象引用。其中的parentView可以是樹形圖中有效ID的任意父節點(父節點要保證唯一有效),然后利用python函數的可變參數列表特性來傳入所需控件的索引列表即可構造出得到任意節點引用的字符串,從而得到其引用。

核心代碼如下,把如下代碼加入自己的python腳本中,直接調用該函數即可。

#定義獲取重復或不存在控件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,方法如下:

 getChildView('id/province_list',5,0,0)

其中結合上圖可知,getChildView的第一個參數即:有效且唯一的父節點

參數二、三依次為要獲取的控件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的用法。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()