使用过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方法来做翻页。