51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2693|回复: 0
打印 上一主题 下一主题

UiAutomator2.0遍历控件

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-13 16:38:43 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
使用过UiAutomator1.0的人应该有非常痛的痛点,那就是在遍历View树时非常麻烦或者说做不到,百度上找到的基本上是这么用的:
  1. UiScrollable list = new UiScrollable(new UiSelector().resourceId("com.xxx.xxx:id/ni"));
  2. for (int i = 0; i < list.getChildCount(); i++) {
  3.     UiObject index0Item = list.getChild(new UiSelector().resourceId("com.xxx.xxx:id/z_").instance(i));
  4.     index0Item.click();
  5. }
复制代码
一般是用resourceId来查找子类,如果只是用className或者instance通常找不到或者找到的并不是这个控件的子控件,如果想要在没有控件id或者统一的类名从一个控件直接获取子控件列表来遍历是做不到的,比如一个控件的子控件有FrameLayout和LinearLayout想得到children再一个一个遍历是不行的,那怎么办?这时就要使用UiAutomator2.0了,这和1.0有什么区别呢?主要是api增多了,能力也增强了,这里就讲一下如何使用2.0来遍历view树。
示例代码:
  1. int height = 0;
  2. //使用By创建BySelector,并用findObject返回UiObject2
  3. UiObject2 list = mDevice.findObject(By.clazz("android.support.v7.widget.RecyclerView"));
  4. //list.getChildren()得到子控件列表的UiObject2
  5. for (UiObject2 child : list.getChildren()) {
  6.     height += child.getVisibleBounds().height();
  7.     //
  8.     if (!child.getClassName().equals("android.widget.LinearLayout")) {
  9.         continue;
  10.     }
  11.     child.click();
  12. }
  13. Rect r = list.getVisibleBounds();
  14. float percent = height / (float)r.height();
  15. //向下翻页
  16. list.scroll(Direction.DOWN, percent);
复制代码
从代码可以看出,

2.0是使用BySelector做选择器,使用上并1.0更方便和简洁,而且还有更多的能力,比如可以指定查找多少层等
查找控件的结果是UiObject2
子控件列表可以直接使用getChildren得到
使用上就是如此的简单!所以以后都用UiAutomator2.0吧〜
不过目前也看到个小缺点,比如UiScrollable可以用scrollFarward()直接滚动到下页,2.0需要自己计算移动比例再调scroll方法来做翻页。



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-26 14:22 , Processed in 0.062883 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表