1. 程式人生 > >UiAutomator2.0遍歷控制元件

UiAutomator2.0遍歷控制元件

使用過UiAutomator1.0的人應該有非常痛的痛點,那就是在遍歷View樹時非常麻煩或者說做不到,百度上找到的基本上是這麼用的:

UiScrollable list = new UiScrollable(new UiSelector().resourceId("com.xxx.xxx:id/ni"));
for (int i = 0; i < list.getChildCount(); i++) {
    UiObject index0Item = list.getChild(new UiSelector().resourceId("com.xxx.xxx:id/z_").instance(i));
    index0Item.click();
}

一般是用resourceId來查詢子類,如果只是用className或者instance通常找不到或者找到的並不是這個控制元件的子控制元件,如果想要在沒有控制元件id或者統一的類名從一個控制元件直接獲取子控制元件列表來遍歷是做不到的,比如一個控制元件的子控制元件有FrameLayout和LinearLayout想得到children再一個一個遍歷是不行的,那怎麼辦?這時就要使用UiAutomator2.0了,這和1.0有什麼區別呢?主要是api增多了,能力也增強了,這裡就講一下如何使用2.0來遍歷view樹。
示例程式碼:

int height = 0;
//使用By建立BySelector,並用findObject返回UiObject2
UiObject2 list = mDevice.findObject(By.clazz("android.support.v7.widget.RecyclerView"));
//list.getChildren()得到子控制元件列表的UiObject2
for (UiObject2 child : list.getChildren()) {
    height += child.getVisibleBounds().height();
    //
    if (!child.getClassName().equals("android.widget.LinearLayout")) {
        continue;
    }
    child.click();
}
Rect r = list.getVisibleBounds();
float percent = height / (float)r.height();
//向下翻頁
list.scroll(Direction.DOWN, percent);

從程式碼可以看出,

  • 2.0是使用BySelector做選擇器,使用上並1.0更方便和簡潔,而且還有更多的能力,比如可以指定查詢多少層等
  • 查詢控制元件的結果是UiObject2
  • 子控制元件列表可以直接使用getChildren得到

使用上就是如此的簡單!所以以後都用UiAutomator2.0吧〜
不過目前也看到個小缺點,比如UiScrollable可以用scrollFarward()直接滾動到下頁,2.0需要自己計算移動比例再調scroll方法來做翻頁。