工具
日志、等待、时间、随机数、Base64 和网络请求。三级日志都会上报到任务日志,在控制台里实时可见。
功能概览
- ·logd / logi / loge 三级日志,网页日志面板里调试是灰色、错误是红色
- ·randomInt / randomFloat / randomChoice 给等待、点击和文案加上随机性
- ·httpGet / httpPost 出错不抛异常,统一返回 { ok, status, text, json, headers, error }
logd#
调试日志:排查问题时看的细节。也会上报,日志面板里显示为灰色。
typescript
logd(message: any): void;参数
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
message | any | 是 | — | 要记的内容。对象会转成 JSON,其余转成字符串。 |
注意事项
- 循环里别打太多:服务端每个任务只留最近一段日志,打多了会把重要的挤掉。
示例
javascript
logd(client.windowSize());logi#
普通日志:脚本走到了哪一步、拿到了什么结果。
typescript
logi(message: any): void;参数
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
message | any | 是 | — | 要记的内容。对象会转成 JSON,其余转成字符串。 |
示例
javascript
logi('第一步完成');loge#
错误日志:出错、失败。日志面板里标红。
typescript
loge(message: any): void;参数
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
message | any | 是 | — | 要记的内容。对象会转成 JSON,其余转成字符串。 |
示例
javascript
loge('登录按钮一直没有出现');参见 logi
setClickLog#
打开或关掉点击日志。clickElement / clickImage / clickText 默认会把点到、没找到记进任务日志;循环里点得多、不想刷屏时关掉。
typescript
setClickLog(on: boolean): boolean;参数
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
on | boolean | 是 | — | true 记,false 不记。 |
返回值
| 类型 | 描述 |
|---|---|
boolean | 改之前是开还是关。 |
注意事项
- 只管这三个函数。client.click 这类按坐标点的本来就不记日志。
示例
javascript
setClickLog(false);
for (var i = 0; i < 50; i++) {
clickElement('label', '下一个', 1);
}
setClickLog(true);sleep#
等待指定的秒数。任务被停止时立即返回。
typescript
sleep(seconds: number): void;参数
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
seconds | number | 是 | — | 等多少秒,可以是小数。 |
示例
javascript
sleep(1.5);getNowTimestamp#
现在的 Unix 时间戳,单位是秒(整数)。
typescript
getNowTimestamp(): number;返回值
| 类型 | 描述 |
|---|---|
number | 从 1970-01-01 00:00:00 UTC 到现在过了多少秒。 |
注意事项
- 算过了多久:先记下开始时的时间戳,之后两次相减就是经过的秒数。要毫秒用 Date.now()。
示例
javascript
var start = getNowTimestamp();
sleep(2);
logi(getNowTimestamp() - start);参见 getNowTime、sleep
getNowTime#
现在的时间,格式是 2026-10-01 14:05:09,按设备的本地时区。
typescript
getNowTime(): string;返回值
| 类型 | 描述 |
|---|---|
string | 「年-月-日 时:分:秒」,月、日、时、分、秒不足两位的补零。 |
注意事项
- 只要日期取前 10 个字符:getNowTime().slice(0, 10);只要时分:getNowTime().slice(11, 16)。
示例
javascript
logi('开始于 ' + getNowTime());randomInt#
随机整数,两端都能取到:randomInt(1, 6) 就像掷骰子。
typescript
randomInt(min: number, max: number): number;参数
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
min | number | 是 | — | 下界(含)。 |
max | number | 是 | — | 上界(含)。 |
返回值
| 类型 | 描述 |
|---|---|
number | [min, max] 之间的整数。上下界写反也不会出错。 |
示例
javascript
var n = randomInt(1, 6);randomFloat#
随机小数,两端都能取到,默认保留 1 位小数:randomFloat(1.5, 3) 可能是 1.5、2.3、3。比如每轮之间随机停一会儿:sleep(randomFloat(1.5, 3))。
typescript
randomFloat(min: number, max: number, digits?: number): number;参数
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
min | number | 是 | — | 下界(含)。 |
max | number | 是 | — | 上界(含)。 |
digits | number | 否 | 1 | 保留几位小数,0~10 的整数。 |
返回值
| 类型 | 描述 |
|---|---|
number | [min, max] 之间、保留 digits 位的小数。上下界写反也不会出错。 |
异常
| 异常类型 | 触发条件 |
|---|---|
WDAErrorINVALID_ARGUMENT | digits 不是 0~10 的整数。 |
注意事项
- 范围太窄、这个位数下取不出两个不同的值时,会自动多留几位:randomFloat(0.45, 0.55) 保留 1 位只有 0.5 一个值,所以得到的是 0.47、0.52 这样的两位小数。结果始终落在 [min, max] 里。
- 按屏幕比例取坐标这类要细的值,记得写上位数:client.click(randomFloat(0.3, 0.7, 3), randomFloat(0.4, 0.6, 3))。只保留 1 位的话,落点只有 0.3、0.4 … 这几个。
示例
javascript
sleep(randomFloat(1.5, 3));
var x = randomFloat(0.2, 0.8, 3);randomChoice#
从数组里随机挑一个,每一项机会均等。
typescript
randomChoice<T>(list: T[]): T | null;参数
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
list | T[] | 是 | — | 候选项。 |
返回值
| 类型 | 描述 |
|---|---|
T | null | 挑中的那一项;空数组返回 null。 |
异常
| 异常类型 | 触发条件 |
|---|---|
WDAErrorINVALID_ARGUMENT | 传的不是数组,比如把候选项一个个写成了参数。 |
示例
javascript
var greeting = randomChoice(['你好', '早上好', '嗨']);
logi(greeting);base64Encode#
把文字编码成 Base64,按 UTF-8,中文不乱码。
typescript
base64Encode(text: string): string;参数
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
text | string | 是 | — | 原文。 |
返回值
| 类型 | 描述 |
|---|---|
string | Base64 字符串。 |
示例
javascript
var b64 = base64Encode('hello');参见 base64Decode
base64Decode#
把 Base64 解码回文字(按 UTF-8)。
typescript
base64Decode(base64: string): string;参数
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
base64 | string | 是 | — | Base64 字符串。 |
返回值
| 类型 | 描述 |
|---|---|
string | 解码后的文字。 |
示例
javascript
var text = base64Decode('aGVsbG8=');参见 base64Encode
httpGet#
发 GET 请求。
typescript
httpGet(url: string, timeoutSec?: number, headers?: Record<string, string>): HttpResult;
type HttpResult = {
ok: boolean;
status: number;
text: string;
json: any;
headers: Record<string, string>;
error: string;
};参数
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
url | string | 是 | — | 完整地址,以 http:// 或 https:// 开头。参数直接写进地址,中文、空格会自动编码。 |
timeoutSec | number | 否 | 15 | 最多等几秒。 |
headers | Record<string, string> | 否 | — | 请求头,例如 { Authorization: 'Bearer xxx' }。 |
返回值
| 类型 | 描述 |
|---|---|
HttpResult | { ok, status, text, json, headers, error }。ok 表示 2xx;status 为 0 表示没拿到响应(网络不通、超时、任务被停止),原因在 error;响应是 JSON 时 json 已经解析好,否则为 null;headers 的名字一律小写。出错不抛异常,看 ok 判断。 |
异常
| 异常类型 | 触发条件 |
|---|---|
WDAErrorINVALID_ARGUMENT | 地址不是 http(s) 开头、等待秒数不是数字或超过 600、请求头不是对象。 |
示例
javascript
var r = httpGet('https://api.example.com/items?page=1');
if (r.ok) {
logi(r.json.items.length);
} else {
loge(r.status + ' ' + r.error);
}参见 httpPost
httpPost#
发 POST 请求。body 是字符串就原样发(像 'a=1&b=2' 按表单、像 JSON 按 JSON);是对象就转成 JSON 发。
typescript
httpPost(url: string, body?: string | object, timeoutSec?: number, headers?: Record<string, string>): HttpResult;参数
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
url | string | 是 | — | 完整地址,以 http:// 或 https:// 开头。参数直接写进地址,中文、空格会自动编码。 |
body | string | object | 否 | — | 请求体。自己写了 Content-Type 请求头就不会被覆盖。 |
timeoutSec | number | 否 | 15 | 最多等几秒。 |
headers | Record<string, string> | 否 | — | 请求头,例如 { Authorization: 'Bearer xxx' }。 |
返回值
| 类型 | 描述 |
|---|---|
HttpResult | { ok, status, text, json, headers, error }。ok 表示 2xx;status 为 0 表示没拿到响应(网络不通、超时、任务被停止),原因在 error;响应是 JSON 时 json 已经解析好,否则为 null;headers 的名字一律小写。出错不抛异常,看 ok 判断。 |
异常
| 异常类型 | 触发条件 |
|---|---|
WDAErrorINVALID_ARGUMENT | 地址不是 http(s) 开头、等待秒数不是数字或超过 600、请求头不是对象。 |
注意事项
- 脚本发出的请求会去往脚本里写的地址,由脚本作者负责这些数据的去向是否合规。
示例
javascript
var r = httpPost('https://example.com/report', 'device=' + getDeviceId() + '&status=ok');
if (!r.ok) {
loge(r.status + ' ' + r.error);
}参见 httpGet