选择器-查找方法

# 控件的查找 构建好合适的选择器筛选条件,就可以对屏幕上的控件进行搜索查找了,查找并返回控件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; }); ``` ## **找到想要的控件后,就可以对控件为所欲为啦!**