欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android之UI Automator框架源码分析(第X篇:BySelector相关功能介绍)

程序员文章站 2022-03-28 18:25:07
BySelector对象负责持有用于定位View的属性信息,而它提供的相关方法(功能)基本上都是用于赋值这些属性信息的!我们这篇先学习BySelector对象持有的哪些字段、然后再去学习BySelector对象的方法!BySelector中的字段介绍......

(注意:本文基于UI Automator测试框架版本为2.2.0)   

    BySelector对象表示定位控件所需要的条件,按照与控件的相关性先进行一个简单分类

1、直接属性

直接属性包括与控件的点击状态、控件的id、控件的文本信息等,这些与控件绑定在一起的属性

2、间接属性

间接属性包括控件属于哪个package、属于哪个class产生的对象、控件处于整个View树的相对位置信息

    BySelector提供的相关方法(功能)就是用于存储直接属性、间接属性到BySelector对象中。使用UiDevice对象或UiObject2对象每次进行查找控件的时,使用BySelector对象持有的所有属性(条件)与控件自身的属性进行对比,如果在View树中找到对应的控件,即会返回一个UiObject2对象。这篇我们不仅学习BySelector对象持有哪些字段、还学习BySelector对象的API

 

官方介绍

    BySelector用于在插装测试(Instrumentation Test)运行期间匹配UI元素(控件)的一个条件,使用UiDevice#findObject (BySelector)方法需要使用BySelector对象!

    个人补充:UiObject2#findObject(BySelector)方法也可以使用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方法介绍

Android之UI Automator框架源码分析(第X篇:BySelector相关功能介绍)

1、为字段赋值的方法

截取了一部分方法,这些API都为BySelector对象持有的实例变量进行赋值的……

2、统统返回BySelector对象

为何使用链式调用,统统返回的BySelector对象

 

无法正常使用的构造方法

Android之UI Automator框架源码分析(第X篇:BySelector相关功能介绍)

1、两个构造方法都是包访问级别,你无法直接通过正常方式new一个BySelector对象

2、官方推荐使用By类进行创建

本文地址:https://blog.csdn.net/cadi2011/article/details/107829486