(注意:本文基于UI Automator测试框架版本为2.2.0)
BySelector对象持有用于查找控件所需的属性条件,往往我们称BySelector对象为选择器对象,就是因为使用BySelector可以查找到页面中的控件!
按照属性与控件的相关性进行一个简单分类
1、直接属性
直接属性包括控件的点击状态、控件的id、控件的文本信息等,这些属性是与控件绑定在一起的属性
2、间接属性
间接属性包括控件属于哪个package、属于哪个class产生的对象、控件位于整个View树的相对位置信息
BySelector提供的相关方法(功能)用于存储(持有)控件的直接属性以及控件的间接属性到BySelector对象中。使用UiDevice对象或UiObject2对象的findObject()系列方法进行查找控件时,即可以使用BySelector对象持有的所有属性(条件)与页面中View树中的控件自身属性进行对比,如果在View树中找到匹配的控件,即会返回一个UiObject2对象。这篇文章我们不仅学习BySelector对象持有哪些属性条件、还会学习BySelector对象的API!
官方介绍
BySelector用于在插装测试(Instrumentation Test)运行期间匹配UI元素(控件)的一个条件,使用UiDevice#findObject (BySelector)方法需要使用BySelector对象!
个人补充:UiObject2#findObject(BySelector)方法也可以使用BySelector对象
个人补充:目前我们已经知道UI Automator测试框架中,共计两处方法会使用BySelector对象,一个是UiDevice的findObject(BySelector)方法,另一个是UiObject2的findObject(BySelector)方法!
BySelector字段介绍
// Regex patterns for String criteria
Pattern mClazz;
Pattern mDesc;
Pattern mPkg;
Pattern mRes;
Pattern mText;
// Boolean criteria
Boolean mChecked;
Boolean mCheckable;
Boolean mClickable;
Boolean mEnabled;
Boolean mFocused;
Boolean mFocusable;
Boolean mLongClickable;
Boolean mScrollable;
Boolean mSelected;
// Depth restrictions
Integer mMinDepth;
Integer mMaxDepth;
// Child selectors 子选择器对象,用于匹配以当前控件为根节点的子元素吗?
// 比如我们需要定位一个ViewGroup,除了ViewGroup自身满足条件外,它含有子元素也需要满足条件
// 才能真正的匹配到一个元素
List<BySelector> mChildSelectors = new LinkedList<BySelector>();
官方注释写的特别清楚,BySelector对象持有的实例变量,共计4种分类(说明任意一个属性条件,都可以作为查找控件的条件)
1、用于字符串匹配的正则表达式模式对象(Pattern)
Pattern mClazz;
Pattern mDesc;
Pattern mPkg;
Pattern mRes;
Pattern mText;
所有的字符串条件,BySelector对象持有的全部为Pattern对象
mClazz 表示控件的类名,比如Button的类名是android.widget.Button
mDesc 表示控件的contentDescription属性,contentDescription是专门为障碍人士准备的属性
mPk 表示控件所在的包名,比如微信的包名是com.tencent.mm
mRes 表示控件的资源id,比如某个控件的id是@id/btn_play(id全称:com.tencent.mm:id/btn_play)
mText 表示控件显示的文本内容,比如某个控件显示的文本是“朋友圈”
2、指定的控件状态,全部为boolean类型
Boolean mChecked;
Boolean mCheckable;
Boolean mClickable;
Boolean mEnabled;
Boolean mFocused;
Boolean mFocusable;
Boolean mLongClickable;
Boolean mScrollable;
Boolean mSelected;
mChecked 表示控件是否处于check状态
mCheckable 表示控件是否为可check状态
mClickable 表示控件是否可以click状态
mEnabled 表示控件是否处于可交互状态
mFocused 表示控件是否处于焦点状态
mFocusable 表示控件能否处于焦点
mLongClickable 表示控件能否支持长按
mScrollable 表示控件能否滑动
mSelected 表示控件是否处于选中状态
3、深度限制
Integer mMinDepth;
Integer mMaxDepth;
mMinDepth 表示控件处于View树中的最小深度
mMaxDepth 表示控件处于View树中的最大深度
4、多个子选择器
List<BySelector> mChildSelectors = new LinkedList<BySelector>();
mChildSelectors 表示BySelector对象可以持有的多个BySelector对象作为条件(称为子选择器)
BySelector方法介绍
1、为字段赋值的方法
截取了一部分方法,这些API都为BySelector对象持有的实例变量进行赋值的……
2、统统返回BySelector对象
统统返回的BySelector对象,方便继续使用链式调用
无法正常使用的构造方法
1、两个构造方法都是包访问级别,你无法直接通过正常方式new一个BySelector对象
2、官方推荐使用By类的静态工厂方法创建BySelector对象