目录

UiSelector

text(str)

findOne()

findOnce(i)

findOne(timeout)

findOnce()

find()

scrollable([b = true])

bounds()

auto.setMode(mode)

auto.waitFor()

auto.setMode(mode)

click(text[, i])

UiObject

text()

scrollForward():手指向上滑动

scrollBackward():手指向下滑动

timers 定时器

setTimeout

注意事项

setInterval(callback, delay[, ...args])

clearTimeout(id)


UiSelector

UiSelector即选择器,用于通过各种条件选取屏幕上的控件,再对这些控件进行点击、长按等动作。这里需要先简单介绍一下控件和界面的相关知识

text(str)

  • str {string} 控件文本
  • 返回 {UiSelector} 返回选择器自身以便链式调用

为当前选择器附加控件"text等于字符串str"的筛选条件。

控件的text(文本)属性是文本控件上的显示的文字,例如微信左上角的"微信"文本。

findOne()

  • 根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到屏幕上出现满足条件的一个控件为止,并返回该控件。如果找不到控件,当屏幕内容发生变化时会重新寻找,直至找到。
  • 需要注意的是,如果屏幕上一直没有出现所描述的控件,则该函数会阻塞,直至所描述的控件出现为止。因此此函数不会返回null
  • 采用深度优先搜索(DFS),会返回该搜索算法找到的第一个控件。注意控件找到的顺序有时会起到作用。

findOnce(i)

  • i {number} 索引
  • 根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,并返回第 i + 1 个符合条件的控件;如果没有找到符合条件的控件,或者符合条件的控件个数 < i, 则返回null。
  • 注意这里的控件次序,是搜索算法深度优先搜索(DSF)决定的。

findOne(timeout)

  • timeout {number} 搜索的超时时间,单位毫秒
  • 返回 UiObject
  • 根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到屏幕上出现满足条件的一个控件为止,并返回该控件;如果在 timeout 毫秒的时间内没有找到符合条件的控件,则终止搜索并返回null
  • 该函数类似于不加参数的findOne(),只不过加上了时间限制。

示例:

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

findOnce()

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

find()

  • 返回 UiCollection
  • 根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,找到所有满足条件的控件集合并返回。这个搜索只进行一次,并不保证一定会找到,因而会出现返回的控件集合为空的情况。
  • 不同于findOne()或者findOnce()只找到一个控件并返回一个控件,find()函数会找出所有满足条件的控件并返回一个控件集合。之后可以对控件集合进行操作。

scrollable([b = true])

  • b {Boolean} 表示控件是否可滑动

为当前选择器附加控件是否可滑动的条件。滑动包括上下滑动和左右滑动。

可以用这个条件来寻找可滑动控件来滑动界面。例如滑动Auto.js的脚本列表的代码为:

className("android.support.v7.widget.RecyclerView").scrollable().findOne().scrollForward();
//或者classNameEndsWith("RecyclerView").scrollable().findOne().scrollForward();

bounds()

  • 返回 Rect
  • 返回控件在屏幕上的范围,其值是一个Rect对象。

        示例:

var b = text("Auto.js").findOne().bounds();
toast("控件在屏幕上的范围为" + b);
  • 如果一个控件本身无法通过click()点击,那么我们可以利用bounds()函数获取其坐标,再利用坐标点击。例如:
var b = desc("打开侧拉菜单").findOne().bounds();
click(b.centerX(), b.centerY());
//如果使用root权限,则用 Tap(b.centerX(), b.centerY());

auto.setMode(mode)

  • mode {string} 模式

设置无障碍模式为 mode。mode 的可选值为:

  • fast 快速模式。该模式下会启用控件缓存,从而选择器获取屏幕控件更快。对于需要快速的控件查看和操作的脚本可以使用该模式,一般脚本则没有必要使用该函数。
  • normal 正常模式,默认。

auto.waitFor()

检查无障碍服务是否已经启用,如果没有启用则跳转到无障碍服务启用界面,并等待无障碍服务启动;当无障碍服务启动后脚本会继续运行。

auto.setMode(mode)

  • mode {string} 模式

设置无障碍模式为 mode。mode 的可选值为:

  • fast 快速模式。该模式下会启用控件缓存,从而选择器获取屏幕控件更快。对于需要快速的控件查看和操作的脚本可以使用该模式,一般脚本则没有必要使用该函数。
  • normal 正常模式,默认。

click(text[, i])

  • text {string} 要点击的文本
  • i {number} 如果相同的文本在屏幕中出现多次,则 i 表示要点击第几个文本, i 从 0 开始计算
  • 返回是否点击成功。当屏幕中并未包含该文本,或者该文本所在区域不能点击时返回 false,否则返回 true。

使用方式:

click("是的") :当不指定参数 i 时则会尝试点击屏幕上出现的所有文字 text 并返回是否全部点击成功。

click("是的",0) : 是从 0 开始计算的, 表示点击屏幕上第一个"是的"。

UiObject

UiObject表示一个控件,可以通过这个对象获取到控件的属性,也可以对控件进行点击、长按等操作。

获取一个UiObject通常通过选择器的findOne()findOnce()等函数,也可以通过UiCollection来获取,或者通过UiObject.child()UiObject.parent()等函数来获取一个控件的子控件或父控件。

text()

  • 返回 {string}
  • 获取控件的文本,如果控件没有文本,返回""

scrollForward():手指向上滑动

  • 返回 {Boolean}
  • 对控件执行向前滑动的操作,并返回是否操作成功。
  • 向前滑动包括了向右和向下滑动。如果一个控件既可以向右滑动和向下滑动,那么执行scrollForward()的行为是未知的(这是因为Android文档没有指出这一点,同时也没有充分的测试可供参考)。

scrollBackward():手指向下滑动

  • 返回 {Boolean}
  • 对控件执行向后滑动的操作,并返回是否操作成功。
  • 向后滑动包括了向右和向下滑动。如果一个控件既可以向右滑动和向下滑动,那么执行scrollForward()的行为是未知的(这是因为Android文档没有指出这一点,同时也没有充分的测试可供参考)。

timers 定时器

timers 模块暴露了一个全局的 API,用于在某个未来时间段调用调度函数。 因为定时器函数是全局的,所以使用该 API 无需调用 timers.*

setTimeout

setTimeout(function(){
    toast("hello")
}, 5000);

注意事项

需要注意的是,这些定时器仍然是单线程的。如果脚本主体有耗时操作或死循环,则设定的定时器不能被及时执行

setTimeout(function(){
    //这里的语句会在15秒后执行而不是5秒后
    toast("hello")
}, 5000);
//暂停10秒
sleep(10000);

死循环

setTimeout(function(){
    //这里的语句永远不会被执行
    toast("hello")
}, 5000);
//死循环
while(true);

setInterval(callback, delay[, ...args])

  • callback {Function} 当定时器到点时要调用的函数。
  • delay {number} 调用 callback 之前要等待的毫秒数。
  • ...args {any} 当调用 callback 时要传入的可选参数。
var i = 0; 
setInterval(function(){
        i++;
        toast(i  + "秒");
        if(i == 19999){
            back();
            sleep(1000)
            log("发送成功!1");
            exit();
        }
    }, 3000);

clearTimeout(id)

  • id {number} 一个 setTimeout() 返回的 id。

取消一个由 setTimeout() 创建的定时任务。

//每5秒就发出一次hello
var id = setInterval(function(){
    toast("hello");
}, 5000);
//1分钟后取消循环
setTimeout(function(){
    clearInterval(id);
}, 60 * 1000);