Autojs Pro中,常用的几个选择器搜索接口的区别

前言

UI选择器中,有findOne()、findOne(timeout)、findOnce()、findOnce(i)、find()、untilFind()几个函数接口。在开发的过程中,这几个接口有什么区别呢?

下面飞云结合Autojs Pro的官方文档,来分享一下。

UiSelector.findOne()

返回值类型 备注
UiSelector 返回选择器自身以便链式调用

根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到屏幕上出现满足条件的一个控件为止,并返回该控件。如果找不到控件,当屏幕内容发生变化时会重新寻找,直至找到。

需要注意的是,如果屏幕上一直没有出现所描述的控件,则该函数会阻塞,直至所描述的控件出现为止。因此此函数不会返回null。

该函数本来应该命名为untilFindOne(),但由于历史遗留原因已经无法修改。如果想要只在屏幕上搜索一次而不是一直搜索,请使用findOnce()。

另外,如果屏幕上有多个满足条件的控件,findOne()采用深度优先搜索(DFS),会返回该搜索算法找到的第一个控件。注意控件找到的顺序有时会起到作用。

一句话总结

findOne()函数会一直在屏幕上不停的寻找组件,直到找到。无返回值。

UiSelector.findOne(timeout)

参数 类型 描述
timeout number 搜索的超时时间,单位毫秒
返回值类型 备注
UiSelector 返回选择器自身以便链式调用

根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到屏幕上出现满足条件的一个控件为止,并返回该控件;如果在timeout毫秒的时间内没有找到符合条件的控件,则终止搜索并返回null。

该函数类似于不加参数的findOne(),只不过加上了时间限制。

官方示例:

//启动Auto.js
launchApp("Auto.js");
//在6秒内找出日志图标的控件
var w = id("action_log").findOne(6000);
//如果找到控件则点击
if(w != null){
    w.click();
}else{
    //否则提示没有找到
    toast("没有找到日志图标");
}

一句话总结

findOne(timeout)函数在设定时间内寻找组件,返回null或返回找到的控件。

UiSelector.findOnce()

返回值类型 备注
UiSelector 返回选择器自身以便链式调用

根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,如果找到符合条件的控件则返回该控件;否则返回null。

function 微信朋友圈点赞() {
    // 检查是否在朋友圈页面
    object = text("朋友圈").findOnce();
    if (object != null) {
        object = desc("返回").findOnce();
        if (object != null) {
            //中间代码省略...
        };
    };
};

一句话总结

findOnce()函数在屏幕上寻找组件,返回null或返回找到的控件。

UiSelector.findOnce(i)

参数 类型 描述
i {number} 索引

根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,并返回第 i + 1 个符合条件的控件;如果没有找到符合条件的控件,或者符合条件的控件个数 < i, 则返回null。

注意这里的控件次序,是搜索算法深度优先搜索(DSF)决定的。

一句话总结

findOnce(i)函数在屏幕上寻找索引为 i + 1 的组件,返回null或返回找到的控件。

UiSelector.find()

返回值类型 备注
UiCollection 控件集合

根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,找到所有满足条件的控件集合并返回。这个搜索只进行一次,并不保证一定会找到,因而会出现返回的控件集合为空的情况。

不同于findOne()或者findOnce()只找到一个控件并返回一个控件,find()函数会找出所有满足条件的控件并返回一个控件集合。之后可以对控件集合进行操作。

可以通过empty()函数判断找到的是否为空。例如:

var object = id("v_sex_age").find();
if (!object.empty()) {
    toast("找到啦");
    object.forEach(function(currentValue, index) {
        log(index)
    })

} else {
    toast("没找到╭(╯^╰)╮");
}

一句话总结

find()函数遍历屏幕上的组件,返回组件的集合。没招到则返回空集。

UiSelector.untilFind()

返回值类型 备注
UiCollection 控件集合

根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到找到至少一个满足条件的控件为止,并返回所有满足条件的控件集合

该函数与find()函数的区别在于,该函数永远不会返回空集合;但是,如果屏幕上一直没有出现满足条件的控件,则该函数会保持阻塞。

一句话总结

untilFind()函数会一直在屏幕上不停的寻找组件,直到找到。找到后返回组件的集合。

UiObject文档

文档地址

相关教程

跟我学Auto.js Pro安卓免ROOT引流脚本开发教程