(注意:本文基于UI Automator版本为2.2.2)
前言
官方:Searchable接口表示提供搜索控件的能力(功能,谁实现,谁具备)
私人:实现Searchable接口的类所产生的对象表示具备搜索UI元素(控件)的能力
Searchable接口介绍
/** Searchable接口表示可以搜索匹配UI元素的对象*/
interface Searchable {
/** 返回是否与给定的selector条件匹配 */
public boolean hasObject(BySelector selector);
/** 返回与selector条件匹配的第一个UiObject2对象 */
public UiObject2 findObject(BySelector selector);
/** 返回符合selector条件的所有UiObject2对象,由一个List对象持有 */
public List<UiObject2> findObjects(BySelector selector);
}
Searchable接口定义在androidx.test.uiautomator包中,UiDevice、UiObject2均实现了该接口,说明UiDevice与UiObject2都具备查找控件的能力(功能)
Searchable接口的使用位置
通过代码搜索,发现有7个位置显式的使用Searchable接口,让我一一道来:
1、SearchCondition类的定义中,继承抽象类Condition,此时会将其中的一个类型参数指定为Searchable
2、UiDevice实现Searchable接口,这个上面已经提到
3、UiObject2实现Searchable接口,这个上面也有提及
4、Until类中的静态工厂方法gone(),返回的匿名对象,会实现一个apply()方法,apply()方法只能传入一个Searchable类型的对象(看来实现Searchable接口的对象都可以传入)
5、Until类中的静态工厂方法hasObject(),创建的匿名内部类,实现的apply()方法使用Searchable
6、Until类中的静态工厂方法findObject(),同上,也是在一个applay方法中使用的Searchable
7、Until类中的静态工厂方法findObjects(),同上,也是在一个applay方法中使用的Searchable
通过上面的提示,不难看出Until的这4个静态工厂方法,最后都会使用一个传入的Searchable对象(具备查找控件能力的对象),而该Searchable对应的实际类型,一定是UiDevice或者UiObject2,因为在整个UI Automator测试框架的上下文中只有UiDevice与UiObject2实现了Searchable接口,另外我们也无法创建自定义的实现Searchable接口的类,因为Searchable接口已经被限制为default访问权限!