AAIS

概述

AAI Script (AAIS) 是建立在 AAI 的 FindNode 之上的非常小的脚本,它具有非常简单的语法和十几个命令,AAIS 不是复杂的 JS/REST API 的替代品,它对于编写简单的测试或抛出异常很有用离开脚本。AAIS 解析器将在执行期间将命令转换为 JavaScript(和 FindNode 命令)。它有几个不同于 JavaScript 的属性:

  • 没有条件,没有循环,简单的变量,不适合复杂的脚本。
  • 任何失败/错误都会导致脚本停止。
  • 它是为在多个设备上运行而构建的,用户选择一组设备(1 到 100),启动脚本。
  • 同时支持 MDCC(多设备控制中心)和 WDM(Windows 桌面模式)。
  • “print”、“get”和“sendAai”的任何错误消息或输出都将保存在日志文件中。
  • JavaScript 代码块包含在“{}”中。将循环多次。
  • “//”是注释字符,“//”之后的任何内容都将被忽略。
  • 由于它建立在 FindNode 之上,因此它继承了 FindNode 的属性:
    • 基于对象,而不是基于坐标。
    • 100% 兼容 FindNode 的查询语言。
    • 支持混合设备环境中的脚本(不同的分辨率和大小)。
    • 使用“查找”来替换设备相关的向下/向上页面。“查找”将滚动,直到找到节点。

AAIS 命令

点击/长按

单击或长按屏幕上的查询字符串或文本。如果未找到查询或文本,脚本将停止。有关查询语法,请参阅 FindNode 用户指南。如果在“查找”或“等待”命令后“单击”不带参数,它将单击查找命令的第一个匹配项。

用法:

点击/长按 <text|query>

例子:

点击 "T:About phone||OX:1"
长按 "Information" 
// find and click John
寻找 "John"
点击
等待 "Click for detail"
点击

启动/重启

打开或重新启动应用程序,重新启动将强制关闭应用程序并重新启动。如果未找到应用程序,脚本将停止。

用法:

启动/重启 <package name>
启动/重启 <app name>

例子:

启动 "com.raider.skype"
等待 "Favorites"
	
重启 "Skype"

等待

该命令一直等待,直到找到匹配项或超时到期。如果超时到期,脚本将停止。如果没有指定超时,默认为 5000 毫秒。有关查询语法,请参阅 FindNode 用户指南。

用法:

等待 <text|query>
等待 <text|query>, <timeout in milliseconds>

例子:

等待 "Finish"
等待 "R:.icon_done", 20000

文本

在文本域中输入文本,文本域通过位置或初始提示字符串定位,如果找不到文本域,脚本将停止并出错。为了按位置准确定位文本字段,文本字段将根据文本字段位置从左上角到右下角进行排序。

用法:

文本 <text>		// Enter text in the first text field
文本 <text>, <position> 	// position starts with 0 – first text field, 1 – second text field, …
文本 <text>, <label>	// Enter into the text field with the initial hint string

例子:

文本 "Hello world"
文本 "Hello world", "Please input a message"
文本 "Hello world", 2

按键

按一个键码(和可选的元状态)或键码名称,错误的键码名称将停止脚本。

用法:

按键 <keycode name>
按键 KeyCode, <keycode>
按键 KeyCode, <keycode>, <meta state>

例子:

按键 Home
按键 KeyCode, 47, 1

有关所有键码名称,请参阅https://developer.android.com/reference/android/view/KeyEvent。以下是流行的键码名称(不区分大小写):

Enter
Back
Home
Back_space
Search
Power
Tab

寻找

它将根据屏幕上的方向滚动,直到找到匹配项,找不到匹配项,脚本将停止并出现错误。默认为“下”。

用法:

寻找 <text|query> [<direction>]

有4个方向

  • "down":从当前位置向下搜索(不指定则默认)。
  • "up":从当前位置向上搜索。
  • “fromTop”:从应用程序顶部开始向下滚动。
  • “fromBottom”:滚动到应用底部并向上搜索。

例子:

寻找 "John"
寻找 "T:OK||C:.Button"
点击

执行

执行另一个 AAIS 或 JavaScript,如果脚本产生错误将停止。默认位于 Documents\scripts 目录中。如果扩展名是“.js”,则作为 JavaScript 加载,如果扩展名是“.tst”,则作为 AAIS 加载。“exec” JavaScript 要么为 AAIS 集成提供函数/常量,要么执行在 AAIS 中无法完成的任务。

用法:

执行 <file path and filename>

例子:

执行 "aais\\skype.tst"
执行 "C:\\aais\\skype.tst"
执行 "nestLib.js"

打印

将文本字符串打印到日志文件。

用法:

打印 <text>

延迟

临时暂停脚本的执行指定毫秒。

用法:

延迟 <time in milliseconds> 

例子:

延迟 10000

选择

检查用于单击复选框,它接受真/假。“false”表示不选中,“true”表示选中。

用法:

选择 <text|query> true|false

例子:

选择 "C:.Checkbox&&T:Milk",false

进度

进度用于在滑块上设置一个值,例如“.SeekBar”的类名。它在 FindNode (getNodes(RI)) 中显示为“rangeInfo”,它具有整数或浮点类型,具有最小值和最大值。确保值在范围内。

用法:

进度 <query> <value in integer or float>

例子:

进度 "T:Notifications&&OY:1&&OX:1", 1200

获取

从 FindNode 获取信息。它有 4 种 get 类型(需要时会添加更多),参数是可选的。返回值将保存到日志文件并从 JavaScript "getOutput()" 获取。

用法:

获取 <query>, <type>

类型:

“id”:获取查询的id/ids。没有争论。

"text":获取查询匹配节点的文本信息。没有争论。

"description":获取查询匹配节点的描述信息。没有争论。

“node”:根据可选参数获取匹配节点的信息。

例子:

执行 "volumeLib.js"
获取 "T:Notifications&&OY:1&&OX:1", “node”
{ 
	var rangeInfo = getOutput().list[0].rangeInfo;
    var current = rangeInfo.current;
    var min = rangeInfo.min;
    var max = rangeInfo.max;
    var mid = (max-min)/4;
    if (current > mid*3) {
        tooLoud(getDevice(), current);
    } else if (current < mid) {
        tooSoft(getDevice(), current);
    }
}

sendAai

sendAai 使用 "device.sendAai" 向 FindNode 发送命令,返回值将保存到日志文件并从 JavaScript "getOutput()" 获取。任何失败(从 FindNode 接收 null)都会导致脚本停止。AAIS 目前不允许每个命令多行,下一个版本将支持多行命令。

用法:

sendAai {<query or action>}
sendAai {actions:["openAndroidSetting(application development settings)", "scrollIntoView(T:Window animation scale)", "click", "click(+T:Animation scale .5x)", "sendKey(Back)", "sendKey(Back)"]}

与 JavaScript 集成

AAIS 是一个解析器,它读取带有“.tst”扩展名的 AAIS 脚本并生成 JavaScript 执行,与 JavaScript 的集成很简单,将 JavaScript 包含在“{}”中。目前,只有 JavaScript 可以访问“get”和“sendAai”的输出,下一个版本,AAIS 可以包含 JavaScript 表达式(例如 ${…})。

例如

{ <JavaScript> code }

或者

{
    <JavaScript code>
}

例子:

执行 "phoneLib.js"
获取 "T:Android version&&OY:1", "text"
{ 
	setVersion(getDevice(), getOutput().retval); 
}

假设“phoneLib.js”定义了“setVersion()”函数。

由于 AAIS 脚本可以在多个设备上运行,因此所有 JS 命令块将一次执行多次,每个设备执行一次。所以在上面的例子中,如果选择了 20 个设备,它将执行 20 个“setVersion”。“getDevice()”将返回 20 个不同的设备。

您可以先执行(加载)一个 JS 库(带有常量或函数):

执行.js

JS 代码块将与“exec”处于相同的上下文中,因此您可以方便地访问它们。

此外,AAIS还自带几个功能:

执行 "phoneLib.js"
获取 "T:Model name&&OX:1", "text"
{ saveVar("modelName", getOutput().retval) }
获取 "T:Model number&&OX:1", "text"
{ saveVar("modelNumber", getOutput().retval) }
获取 "T:IMEI&&OX:1", "text"
{ 
    saveInfo(getDevice(), 
    loadVar("modelName"), 
    loadVar("modelNumber"), 
    getOutput().retval); 
}

saveVar 和 loadVar 与 getDevice() 相关,因此您 loadVar 将始终在同一设备上返回 saveVar,而不会相互干扰。

如果您只想做一次而不是每个设备,请使用“doOnce()”。

exec "runLib.js"
获取 "T:Run ID", "text"
{ 
	if (doOnce()) {
		saveDatabase(getOutput().retval); 
	}
}

功能

AAIS JavaScript 内置了几个函数:

getDevice() → 设备

将返回当前设备。

getDevices() → 设备数组

将返回所有选定的设备。

saveVar(<名称>, <值>)

将存储具有指定名称的变量,该变量存储在 getDevice() 的范围内。

loadVar(<名称>) → <值>

将加载指定名称的变量并返回值。只有当 saveVar() 使用相同的 getDevice() 存储时,该值才可见。

saveGlobalVar(<名称>, <值>)

将存储在名称标识的全局范围内,任何设备都可以访问它。

loadGlobalVar(<名称>) → <值>

将返回由名称标识的全局范围。

doOnce() → 真|假

第一次运行将返回 true,后续运行将返回 false。

getOutput() → FindNode 的输出

此功能仅适用于“获取”和“sendAai”,JavaScript 代码块需要紧跟“获取”或“sendAai”命令,其他命令上的“getOutput”会产生错误并停止脚本执行。返回格式见日志文件内容。

AAIS 示例:

执行 "teslaLib.js"
启动 "Tesla"
寻找 "T:VIN:"
获取 "T:VIN:&&OX:1", "text"
{ saveVar("vin", getOutput().retval) }
获取 "T:/[0-9,]+ miles/", "text"
{ saveMileage(new Date(), loadVar("vin"), getOutput().retval) }
打印 "Done"

创建脚本

将脚本保存到带有“.tst”扩展名的文本字段中,例如skype.tst,或者您可以使用Record and Replay 将脚本录制在AAIS(您需要选择对象模式)文件中。

运行脚本

在 执行器 中运行 AAIS 脚本,结果将存储在“任务”中:

  • MDCC:
    • 打开 MDCC 窗口。
    • 通过缩略图设备选择设备或选择一个组。将始终选择主设备。
    • 点击“执行器”。
    • 选择一个或多个脚本,当复选框被点击时,它将显示执行顺序。
    • 单击运行按钮,它将在设备上运行脚本。错误将显示在 Runner 旁边的消息框中。单击“日志”以访问日志。
  • WDM:
    • 在 WDM 设备窗口中,单击菜单“执行器”。
    • 选择一个或多个脚本,当复选框被点击时,它将显示执行顺序。
    • 单击运行按钮,它将在设备上运行脚本。
    • 将显示任务窗口,可以查看进度和生成的日志文件。