选择器-查找方法
# 控件的查找
构建好合适的选择器筛选条件,就可以对屏幕上的控件进行搜索查找了,查找并返回控件UiObject。
下面是搜索查找的一些方法:
## UiSelector.findOne()
- 返回 控件对象UiObject
**根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到屏幕上出现满足条件的一个控件为止,并返回该控件**。如果找不到控件,当屏幕内容发生变化时会重新寻找,直至找到。
**需要注意的是,如果屏幕上一直没有出现所描述的控件,则该函数会阻塞,直至所描述的控件出现为止。因此此函数不会返回null**。
该函数本来应该命名为untilFindOne(),但由于历史遗留原因已经无法修改。如果想要只在屏幕上搜索一次而不是一直搜索,请使用findOnce()。
另外,如果屏幕上有多个满足条件的控件,findOne()采用深度优先搜索(DFS),会返回该搜索算法找到的第一个控件。注意控件找到的顺序有时会起到作用。
**Tips:不建议直接使用该方法,建议带上超时时间。-白丁**
# UiSelector.findOne(timeout)
- timeout {number} 搜索的超时时间,单位毫秒
- 返回 控件对象UiObject
**根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到屏幕上出现满足条件的一个控件为止,并返回该控件;如果在timeout毫秒的时间内没有找到符合条件的控件,则终止搜索并返回null**。
该函数类似于不加参数的findOne(),只不过加上了时间限制。
示例:
```JavaScript
//启动Auto.js
launchApp("Auto.js");
//在6秒内找出日志图标的控件
var w = id("action_log").findOne(6000);
//如果找到控件则点击
if(w != null){
w.click();
}else{
//否则提示没有找到
toast("没有找到日志图标");
}
```
## UiSelector.findOnce()
- 返回 UiObject
**根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,如果找到符合条件的控件则返回该控件;否则返回null**。
## UiSelector.findOnce(i)
- i {number} 索引
**根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,并返回第 i + 1 个符合条件的控件;如果没有找到符合条件的控件,或者符合条件的控件个数 < i, 则返回null**。
注意这里的控件次序,是搜索算法深度优先搜索(DSF)决定的。
## UiSelector.find()
- 返回 UiCollection
**根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,找到所有满足条件的控件集合并返回。这个搜索只进行一次,并不保证一定会找到,因而会出现返回的控件集合为空的情况**。
不同于findOne()或者findOnce()只找到一个控件并返回一个控件,find()函数会找出所有满足条件的控件并返回一个控件集合。之后可以对控件集合进行操作。
可以通过empty()函数判断找到的是否为空。例如:
```JavaScript
var c = className("AbsListView").find();
if(c.empty()){
toast("找到啦");
}else{
toast("没找到╭(╯^╰)╮");
}
```
## UiSelector.untilFind()
- 返回 UiCollection
**根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到找到至少一个满足条件的控件为止,并返回所有满足条件的控件集合**。
该函数与find()函数的区别在于,该函数永远不会返回空集合;但是,**如果屏幕上一直没有出现满足条件的控件,则该函数会保持阻塞**。
## UiSelector.exists()
- 返回 {Boolean}
**判断屏幕上是否存在控件符合选择器所确定的条件**。例如要判断某个文本出现就执行某个动作,可以用:
```JavaScript
if(text("某个文本").exists()){
//要支持的动作
}
```
## UiSelector.waitFor()
**等待屏幕上出现符合条件的控件;在满足该条件的控件出现之前,该函数会一直保持阻塞**。
例如要等待包含"哈哈哈"的文本控件出现的代码为:
```JavaScript
textContains("哈哈哈").waitFor();
```
## UiSelector.filter(f)
- f {Function} 过滤函数,参数为UiObject,返回值为boolean
**为当前选择器附加自定义的过滤条件**。
例如,要找出屏幕上所有文本长度为10的文本控件的代码为:
```JavaScript
var uc = className("TextView").filter(function(w){
return w.text().length == 10;
});
```
##
**找到想要的控件后,就可以对控件为所欲为啦!**