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个的时候就认为遍历完了,因此如果有需要可以想其他办法优化这个地方)。下面贴代码:
这里需要注意的是,一定要手动捕获异常。test函数是抛出异常的,但是,如果在找控件的过程中没有找到,会直接抛出异常,中断程序。对于遍历,找不到很正常,我们不希望程序中断。因此我们要再用try捕获异常,而且每次都要判断是否是null,不判断的话,一旦为null,程序立即退出。
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,程序立即退出。
相关文章推荐
- 在Xcode 6.2中遇到Your build settings specify a provisioning profile with the UUID, no provisioning prof
- android项目中values中几个…
- Incorrect string value: '\xC2\x8B\xC3\xA8\xC2\xAF...' for column 'name' at row 1
- RFC(Request For Comments)征求修正意见书
- IOS开发-UI学习-UITextField的具体属性及用法
- 算法实例-C#-快速排序-QuickSort
- 【POJ】[3061]Subsequence
- hdoj 1242 Rescue (bfs 优先队列)
- ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
- hdu 4027 Can you answer these queries?
- hdu 4027 Can you answer these queries?
- RMQ (Range Minimum/Maximum Query)算法
- EasyUi Datagrid的基础使用
- Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences (矩阵快速幂)
- iOS开发学习笔记——文本框(UITextField)
- stl之deque双端队列容器
- 63. Unique Paths II 动态规划的问题
- hdu Problem 1242 Rescue bfs + 优先队列
- 基于easyui的 增 删 改 查
- 62. Unique Paths 动态规划算法浅谈