全局对象与函数
脚本运行前自动注入的对象和函数:设备客户端 client、脚本参数、任务与设备的标识、停止信号,以及统一的错误码。
client#
设备客户端,自动注入。手势、应用、页面、选择器都是它的方法,比如 client.click、client.session、client.label。
typescript
declare const client: WDA.Client;返回值
| 类型 | 描述 |
|---|---|
WDA.Client | 连着本机 WebDriverAgent 的客户端,会自动接上 WDA 当前的会话。 |
示例
javascript
client.session('com.apple.Preferences');
var size = client.windowSize();params#
脚本参数,自动注入。在控制台「脚本管理」里给脚本添加的参数,脚本里用 params.参数名 直接读,不用调接口。
typescript
declare const params: Record<string, string | number | boolean>;返回值
| 类型 | 描述 |
|---|---|
Record<string, string | number | boolean> | 参数名到参数值的对象。值的类型跟着参数的类型走:number 拿到的是数字,boolean 是 true / false,string 是字符串。 |
注意事项
- 没有这个参数时读到的是 undefined,可以顺手给个默认值:var rounds = params.rounds || 10。
- 在代码测试台里运行,用的是当前打开的那个脚本保存好的参数;还没存成脚本的代码没有参数。
- 别人分享给你的脚本,读到的是你自己填的参数值,不是分享者的。
示例
javascript
var keyword = params.keyword;
var rounds = params.rounds || 10;
logi('搜索 ' + keyword + ',共 ' + rounds + ' 轮');getScriptConfig#
读取参数配置页里给这个脚本填的附加配置。
typescript
getScriptConfig(scriptName: string): unknown | null;参数
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
scriptName | string | 是 | — | 脚本名。 |
返回值
| 类型 | 描述 |
|---|---|
unknown | null | 附加配置的内容;读取失败返回 null,并写一条错误日志。 |
示例
javascript
var cfg = getScriptConfig('daily-like');参见 params
getTaskId#
当前任务的 ID;getScriptId() 是当前脚本的 ID。
typescript
getTaskId(): string;
getScriptId(): string;返回值
| 类型 | 描述 |
|---|---|
string | 任务 ID / 脚本 ID。 |
注意事项
- 脚本作为任务运行时才注入。不确定时先判断:typeof getTaskId === 'function'。
示例
javascript
logi('task=' + getTaskId());参见 getDeviceId
getDeviceId#
这台设备在系统里的 ID。
typescript
getDeviceId(): string;返回值
| 类型 | 描述 |
|---|---|
string | 设备 ID。 |
示例
javascript
logi('device=' + getDeviceId());shouldStop#
任务是否被要求停止。长循环里一定要检查它,否则在控制台点「停止」要等脚本自己跑完才生效。
typescript
shouldStop(): boolean;返回值
| 类型 | 描述 |
|---|---|
boolean | 被要求停止时返回 true。 |
注意事项
- 停止是协作式的:只是置位一个标志,不会强行打断脚本。sleep 和查找类函数的等待会在停止后立即返回。
示例
javascript
for (var i = 0; i < 100; i++) {
if (shouldStop()) {
return false;
}
client.swipeUp();
sleep(randomFloat(1, 3));
}参见 sleep
WDA.ErrorCode#
每个错误都带一个稳定的错误码 e.code。按错误码判断,不要按错误信息的文字判断 —— 文字是写给人看的,措辞会变。完整的错误码见本页末尾的表。
typescript
declare const WDA: {
ErrorCode: {
ELEMENT_NOT_FOUND: "WDA_ELEMENT_NOT_FOUND";
INVALID_ARGUMENT: "INVALID_ARGUMENT";
FEATURE_UNAVAILABLE: "FEATURE_UNAVAILABLE";
// …见下表 / see the table below
};
};注意事项
- 查找类函数(findElement、findImage、findText 等)找不到时返回 null 或 false,不抛异常;抛异常的是参数写错、设备或 WDA 出问题这类真正的错误。
示例
javascript
try {
client.label('好').click();
} catch (e) {
if (e.code === WDA.ErrorCode.ELEMENT_NOT_FOUND) {
loge('没找到「好」');
} else {
throw e;
}
}错误码一览
| 错误码(e.code) | 常量 | 什么时候出现 |
|---|---|---|
| INVALID_ARGUMENT | WDA.ErrorCode.INVALID_ARGUMENT | 参数写法不对:控件定位写错、等待秒数不是数字或误传了毫秒、区域格式不对、照旧写了 {} 等。属于脚本自己的问题,报错里会给出改好的写法。 |
| WDA_ELEMENT_NOT_FOUND | WDA.ErrorCode.ELEMENT_NOT_FOUND | 控件对象的 click / getText / getRect 调用时控件不在。 |
| FEATURE_UNAVAILABLE | WDA.ErrorCode.FEATURE_UNAVAILABLE | 设备上的 App 版本太旧,缺少这个功能(找色找图、文字识别、相册),升级 App 即可。 |
| WDA_UNKNOWN | WDA.ErrorCode.UNKNOWN | 未归类的 WDA 错误。 |
| WDA_BAD_GATEWAY | WDA.ErrorCode.BAD_GATEWAY | WDA 返回 502,通常是 WebDriverAgent 进程挂了,等它被重新拉起来再试。 |
| WDA_EMPTY_RESPONSE | WDA.ErrorCode.EMPTY_RESPONSE | WDA 返回了空响应。 |
| WDA_REQUEST_FAILED | WDA.ErrorCode.REQUEST_FAILED | WDA 拒绝了这次请求,例如参数不被接受、操作不支持。 |
| WDA_INVALID_SESSION | WDA.ErrorCode.INVALID_SESSION | 会话失效(App 被关掉、WDA 重启)。client 会自动重新接上当前会话。 |
| WDA_APP_CRASHED | WDA.ErrorCode.APP_CRASHED | 被操作的 App 可能已经崩溃。 |
| WDA_KEYBOARD_NOT_PRESENT | WDA.ErrorCode.KEYBOARD_NOT_PRESENT | 要用键盘的操作执行时,键盘没有弹出。 |
| WDA_INVALID_ELEMENT_STATE | WDA.ErrorCode.INVALID_ELEMENT_STATE | 控件当前的状态不允许这个操作,比如不可用、不可编辑。 |
| API_FAILED | WDA.ErrorCode.API_FAILED | 业务中心接口报错,比如读脚本参数、解析模板名时服务端出错。 |
| IMAGE_FAILED | WDA.ErrorCode.IMAGE_FAILED | 图色操作失败(未细分的原因)。 |
| IMG_BAD_HANDLE | WDA.ErrorCode.IMAGE_BAD_HANDLE | 截图已经释放(releaseScreen 之后)或句柄无效。 |
| IMG_TOO_MANY_HANDLES | WDA.ErrorCode.IMAGE_TOO_MANY_HANDLES | 同时留着的截图超过上限(4 张)。keepScreen 定住的画面用完要 releaseScreen。 |
| IMG_CAPTURE_FAILED | WDA.ErrorCode.IMAGE_CAPTURE_FAILED | 截图失败,多半是 WDA 没有起来。 |
| TPL_NOT_FOUND | WDA.ErrorCode.TEMPLATE_NOT_FOUND | 拿不到模板图:这个脚本没上传这个文件名的图,或者下载失败。 |
| TPL_TOO_LARGE | WDA.ErrorCode.TEMPLATE_TOO_LARGE | 模板比搜索区域还大,多半是在别的分辨率上截的。 |
| OCR_LANG_UNSUPPORTED | WDA.ErrorCode.OCR_LANG_UNSUPPORTED | 这台设备的 Vision 不支持要求的识别语言。 |
| OCR_FAILED | WDA.ErrorCode.OCR_FAILED | 文字识别失败。 |