您的位置:首页 > 产品设计 > UI/UE

UiAutomator中android.widget.ListView控件的子元素遍历

2016-04-01 23:37 483 查看
网上对于UiAutomator大都是简单demo的讲解,许多实用的技巧没有贴出来。今天介绍几个自己琢磨出来的技巧

1.android.widget.ListView控件的子元素遍历

对于一些列表控件,比如“设置”项里的每一行,都是ListView的子项,有时候需要遍历这些元素进行点击。举个例子,如下图:






我想打开蓝牙,但是必须点击右边的switch按钮才行,怎样才能找到这个按钮呢?直接用控件类别肯定不行,因为有多个switch控件。那找“蓝牙”文本,可也不行,你找到的只是文本控件,点击只是点击在文本上,switch按钮并不会被点击。最好的办法就是能找到每一行的控件,然后看这一行有没有包含“蓝牙”文本的控件,如果有,则查找switch控件,进行点击即可。问题就回到了如何遍历这个ListView。仔细看官方文档里的函数,找到这两个:





第一个函数时返回一个UiObject子元素的个数,第二个通过序号来遍历子元素。注意,这两个函数都是对于当前能看到的元素而言的,看不到的是不算在内的。也就是说,如果子元素有20个,但当前只能看到10个,那第一个函数就返回10.而第二个函数是从当前视线中1。。。10进行遍历。(在测试的过程中,发现第二个函数并不准确,可能只遍历到第7个的时候就认为遍历完了,因此如果有需要可以想其他办法优化这个地方)。下面贴代码:

UiScrollable functionItems = null;
functionItems = new UiScrollable(new UiSelector().className("android.widget.ListView"));
int nIndex = 0;
for(nIndex = 0; nIndex < functionItems.getChildCount(); nIndex++) {
UiObject apps = null;
try {
apps = functionItems.getChildByInstance(new UiSelector().className("android.widget.LinearLayout"), nIndex);
} catch(UiObjectNotFoundException e) {}
if(apps == null || !apps.exist()) {
continue;
}
try {
lanya= apps.getChild(new UiSelector().text("蓝牙"));
} catch(UiObjectNotFoundException e) {}
if(lanya == null || !lanya.exist()) {
continue;
}
UiObject checkBox = null;
try {
checkBox = apps.getChild(new UiSelector().className("android.widget.CheckBox"));
} catch(UiObjectNotFoundException e) {}
if(checkBox != null && checkBox.exists() && checkBox.isChecked()) {
checkBox.click();
}
UiObject switchCheck = null;
try {
switchCheck = apps.getChild(new UiSelector().className("android.widget.Switch"));
} catch(UiObjectNotFoundException e) {}
if(switchCheck != null && switchCheck.exists() && switchCheck.isChecked()) {
switchCheck.click();
}
}




这里需要注意的是,一定要手动捕获异常。test函数是抛出异常的,但是,如果在找控件的过程中没有找到,会直接抛出异常,中断程序。对于遍历,找不到很正常,我们不希望程序中断。因此我们要再用try捕获异常,而且每次都要判断是否是null,不判断的话,一旦为null,程序立即退出。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: