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

本文详细介绍了在UiAutomator中如何通过遍历ListView来寻找并操作特定子元素,以实现自动化操作,如点击需要的switch按钮。通过实例演示了如何使用UiObject类的方法来获取、筛选并执行特定操作。
摘要由CSDN通过智能技术生成

网上对于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,程序立即退出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值