Uiautomator之UiSelector定位学习

发表于:2018-1-03 09:58

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Halo3224    来源:博客园

  1、UiSelector的基本方法
  UiSelector对象可以理解为一种条件对象,描述的是一种条件,可以配合UiObject使用得到某个符合条件的控件对象。
  所有的方法都是public的,且都返回UiSelector类的对象。
  文本方面的方法:
  1.text(String text) 文本
  2.textContains(String text) 文本包含
  3.textMatches(String regex) 文本正则
  4.textStartsWith(String text) 文本开始字符
  描述方面的方法:
  1.description(String desc) 描述
  2.descriptionContains(String desc) 描述包含
  3.descriptionMatches(String regex) 描述正则
  4.descriptionStartsWith(String desc) 描述开始字符
  类名方面的方法:
  1.childSelector(UiSelector selector) 子类
  2.className(String  className) 类名
  索性、实例方面的方法:
  1.index(int index) 编号
  2.instance(int instantce) 索引
  特有属性:
  1.checked(boolean val) 选择属性
  2.chickable(boolean val) 点击属性
  3.enabled(boolean val) enabled属性
  4.focusable(boolean val) 焦点属性
  5.longClickable(boolean val) 长按属性
  6.scrollable(boolean val) 滚动属性
  7.selected(boolean val) 选择属性
  包名方面的方法:
  1.packageName(String name) 包名
  2.packageNameMatches(String regex) 包名正则
  资源ID方面的方法:
  1.resourceId(String id) 资源ID
  2.resourceIdMatches(String regex) 资源ID正则
  2. 通过文本信息定位
  通过控件的text属性定位控件应该是最常用的一种方法了,毕竟移动应用的屏幕大小有限,存在text重复的可能性并不大,就算真的有重复,可以添加其他定位方法来缩写误差。
  2.1 UISelector.text方法
  addNote = new UiObject(new UiSelector().text("Add note"));
  assertEquals(addNote.getText(),"Add note");
  该方法通过直接查找当前界面上所有的控件来比较每个控件的text属性是否如预期值来定位控件,挺好理解的,所以就没有必要细说了。
  2.2. UISelector.textContains方法
  addNote = new UiObject(new UiSelector().textContains("Add"));
  assertEquals(addNote.getText(),"Add note");
  此方法跟以上方法类似,但是不需要输入控件的全部text信息。
  2.3 UISelector.textStartsWith方法
  addNote = new UiObject(new UiSelector().textStartsWith("Add"));
  assertEquals(addNote.getText(),"Add note");
  顾名思义,通过判断一个控件的text的开始是否和预期的字串相吻合来获得控件,其实个人觉得这个方法存在的必要性不强,因为它的功能完全可以用上面的方法或者下面的正则表达式的方法取代。况且既然你提供了textStartsWith方法,为什么你不提供个textEndWith的方法呢!
  2.4 UISelector.textMatches方法
  addNote = new UiObject(new UiSelector().textMatches("^Add.*"));
  assertEquals(addNote.getText(),"Add note");
  这个方法是通过正则表达式的方式来比较控件的text来定位控件,这里有意思的是用户使用的正则表达式是有限制的,请看该方法的官方描述:” Set the search criteria to match the visible text displayed for a widget (for example, the text label to launch an app). The text for the widget must match exactly with the string in your input argument“。第一句我们不用管它,关键是第二句,翻译过来就是” 目标控件的text(的所有内容)必须和我们输入的正则表达式完全匹配 “。什么意思呢? 意思就是你不能像往常的正则表达式那样通过比较text的部分吻合来获得控件 。以下面代码为例子:
  addNote = new UiObject(new UiSelector().textMatches("^Add"));
  assertEquals(addNote.getText(),"Add note");
  正常来说这个正则表达式是没有问题的,它的意思就是想要“获取以Add开头的text的控件,至于Add字串口面是什么值,没有必要去管它”。但是按照我们上面的官方描述,这样子是不行的,你必须要把正则表达式补充完整以使得正而表达式和控件的text完全进行匹配,至于你用什么通配符或者字串就完全按照正则表达式的语法了。
  注意这个限制在UISlector使用所有的正则表达式相关的方法中都有效哦。
  3 通过控件的ClassName定位
  通过这种方法定位控件存在的一个问题是很容易发生重复,所以一般都是先用这种方法去narrow down目标控件,然后再去添加其他如text判断等条件进行控件定位。
  3.1 UISelector.className方法
  addNote = new UiObject(new UiSelector().className("android.widget.TextView").text("Add note"));
  assertEquals(addNote.getText(),"Add note");
  实例中首先通过ClassName找到所有的TextView控件,然后再在这些TextView控件查找text是”Add note“的控件。
  3.2 UISelector.classNameMatches方法
  addNote = new UiObject(new UiSelector().classNameMatches(".*TextView$"));
  assertEquals(addNote.getText(),"Add note");
  通过正则表达式判断className是否和预期的一致, 注意正则表达式的限制和章节2.4描述的一致 。
  4. 通过伪xpath方法定位
  UISelector类提供了一些方法根据控件在界面的XML布局中的层级关系来进行定位,但是UIAutomator又没有真正的提供类似Appium的findElementWithXpath相关的方法,所以这里我就称之为伪xpath方法。
  这个章节使用到的不再是NotesList那个activity里面的menu options,而是NoteEditor这个activity里面的Menu options,里面不止有一个Menu entry。
  4.1 通过UiSelector.fromParent或UiObject.getFromParent方法
  这种方法我觉得最有用的情况是测试代码当前在操作的是同一层级的一组控件中的某一个控件,转而又需要操作同一层级的另外一个控件的时候。下面的实例就是通过save控件的父控件找到其同一层级的兄弟控件delete。这里分别列出了通过UiObject.getFromParent方法和UiSelector.fromParent方法的实例,事实上他们的功能是一样的。
  UiObject.getFromPatrent方法:
save =  new UiObject(new UiSelector().text("Save"));
assertEquals(save.getText(),"Save");
delete = save.getFromParent(new UiSelector().text("Delete"));
assertEquals(delete.getText(),"Delete");
  UiSelector.fromParent方法(这个例子有点迂回笨拙,但为了演示功能就将就着看吧):
delete = new UiObject(new UiSelector().text("Save").fromParent(new UiSelector().text("Delete")));
assertEquals(delete.getText(),"Delete");
  4.2 通过UiSelector.childSelector或UiObject.getChild方法
  这种方法是在已知父控件的时候如何快速的查找该父控件下面的子控件。
  UiObject.getChild方法:
UiObject parentView = new UiObject(new UiSelector().className("android.view.View"));
save = parentView.getChild(new UiSelector().text("Save"));
assertEquals(save.getText(),"Save");
  UiSelector.childSelector方法:
save = new UiObject(new UiSelector().className("android.view.View").childSelector(new UiSelector().text("Save")));
assertEquals(save.getText(),"Save");
  5. 通过控件ID定位
  在Android API Level18及其以上的版本增加了一个Android控件的属性ResourceId, 所以要注意在使用这种方法之前先确保你的目标测试设备和你的UIAutomoator库jar包使用的都是API Level 18以上的版本 。例如我自己使用的就是本地sdk中版本19的库: D:\Develops\AndroidSDK\platforms\android-19\uiautomator.jar
  5.1 UiSelector.resourceId方法
addNote = new UiObject(new UiSelector().resourceId("android:id/title"));
assertEquals(addNote.getText(),"Add note");
  5.2 UiSelector.resourceIdMatches方法
addNote = new UiObject(new UiSelector().resourceIdMatches(".+id/title"));
assertEquals(addNote.getText(),"Add note");
  注意正则表达式的限制和章节2.4描述的一致

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号