本课视频教程:https://weidian.com/knowledge.html?itemID=6282510493
1、控件选择器的原理
UiSelector即选择器,用于通过各种条件选取屏幕上的控件,再对这些控件进行点击、长按等动作。
一般软件的界面是由一个个控件构成的,例如图片部分是一个图片控件(ImageView),文字部分是一个文字控件(TextView);
同时,通过各种布局来决定各个控件的位置,
例如,线性布局(LinearLayout)里面的控件都是按水平或垂直一次叠放的,列表布局(AbsListView)则是以列表的形式显示控件。
控件有各种属性,包括文本(text), 描述(desc), id,类名(className)等等
主要还有以下几种属性:
className
类名。类名表示一个控件的类型,例如文本控件为”android.widget.TextView”, 图片控件为”android.widget.ImageView”等。packageName
包名。包名表示控件所在的应用包名,例如QQ界面的控件的包名为”com.tencent.mobileqq”。bounds
控件在屏幕上的范围。drawingOrder
控件在父控件的绘制顺序。indexInParent
控件在父控件的位置。clickable
控件是否可点击。longClickable
控件是否可长按。checkable
控件是否可勾选。checked
控件是否可已勾选。scrollable
控件是否可滑动。selected
控件是否已选择。editable
控件是否可编辑。visibleToUser
控件是否可见。enabled
控件是否已启用。depth
控件的布局深度。
如何通过选择器获取控件?
我们通常用一个控件的属性来找到这个控件
text("微信").findOne();
但是,如果一个控件是图片控件,比如Auto.js主界面右上角的搜索图标,他没有文本属性,这时需要其他属性来定位他。
desc("搜索").findOne();
可能心细的你可能注意到了,这个控件还有很多其他的属性,例如checked, className, clickable等等,
为什么不用这些属性来定位搜索图标呢?
答案是,其他控件也有这些值相同的属性、尝试一下你就可以发现很多其他控件的checked属性和搜索控件一样都是false
,如果我们用checked(false)
作为条件,将会找到很多控件,而无法确定哪一个是搜索图标。
因此,要找到我们想要的那个控件,选择器的条件通常需要是可唯一确定控件的。
我们通常用一个独一无二的属性来定位一个控件。
另外,对于这个搜索图标而言,id属性也是唯一的,我们也可以用id("action_search").findOne().click()
来点击这个控件。
如果一个控件有id属性,那么这个属性很可能是唯一的,除了以下几种情况:
- QQ的控件的id属性很多都是”name”,也就是在QQ界面难以通过id来定位一个控件
- 列表中的控件,比如QQ联系人列表,微信联系人列表等
尽管id属性很方便,但也不总是最方便的,例如对于微信和网易云音乐,每次更新他的控件id都会变化,导致了相同代码对于不同版本的微信、网易云音乐并不兼容。
有时候只靠一个属性并不能唯一确定一个控件,这时需要通过属性的组合来完成定位,例如className("ImageView").depth(10).findOne().click()
,通过链式调用来组合条件。
通常用这些技巧便可以解决大部分问题。
使用选择器的优先级:
- text属性
- desc属性
- id属性
- className属性
- 组合属性