天天看點

騰訊Android自動化測試實戰3.3.1 控件ID相同時擷取控件

<b>3.3 robotium實踐運用</b>

<b>3.3.1 控件id相同時擷取控件</b>

實際界面中常常有一些子控件是相同id甚至沒有id的,但這時候一般其父視圖是有id的。如圖3-14所示,每個tab的控件id是相同的。

圖3-14 擁有相同id的底部tab

因為界面中也很可能會出現多個發現、遊戲這樣的文本,是以也不能采取類似gettext(“發現”)這樣的方式。這裡,我們就可以通過id擷取唯一父控件,再通過過濾方式擷取指定的控件。

//先根據id獲得唯一的布局linearlayout

linearlayout

mtabs = (linearlayout)solo.getview("main_tabs");

//然後通過過濾方式擷取該linearlayout下的所有文本控件

arraylist&lt;textview&gt;

tabs = solo

              .getcurrentviews(textview.class,mtabs);

如果子控件的id都是一樣的,而我們仍然希望通過id來定位控件,那麼應該如何擷取呢?我們知道不論是activity類還是view類都是可以通過findviewbyid(int id)方法直接在控件樹中根據id來查找控件的,是以當我們獲得一個父視圖後,就可以通過findviewbyid (int id)方法根據id來查找相應的子控件,這種方法可以普遍應用在listview中。

//先根據id獲得唯一的布局listview

listview

mlistview = (listview)solo.getview("example_list_id");

//先通過mlistview.getchildat(0)擷取該listview的第一個child,然後再通過該

//child在控件樹中使用findviewbyid根據id來擷取

textview

firstlisttitle = (textview) mlistview.getchildat(0).findviewbyid(getid

("example_title"));

這裡的重點是findviewbyid(int id)傳進去的是int型的id,而我們通過hierarchyviewer或uiautomatorviewer檢視到的id都是string型的,由前文的原理介紹可知,我們可以将string型的id轉換成int型的id,如代碼清單3-19所示:

代碼清單3-19 将string型的id轉換成int型的id

public int

getid(string id,string packagename){

    context targetcontext =

instrumentation.gettargetcontext().getapplicationcontext();

    int viewid =

targetcontext.getresources().getidentifier(id, "id", packagename);

logutils.logd("copyofassistanttabactivitytest",

"viewid:" + viewid);

    if(viewid == 0){

        viewid =

targetcontext.getresources().getidentifier(id, "id",

"android");

    }

    return viewid;

}

是以,當碰到同一層級控件id相同時,可以先尋找唯一的父布局,再通過父布局尋找子控件。如果子控件結構均相同,那麼可以通過index索引來查找;如果子控件結構不一緻,則可以通過周遊的方式找到指定的子控件。

繼續閱讀