自动化脚本和微服务都使用js语言,是我们自己实现的一个标准ECMAScript(JavaScript)的子集,比标准JavaScript简单很多,没有编程基础的同学也能很快掌握;支持标准JavaScript函数库;支持多线程并发编程,在线编辑、动态部署并立即生效。
function main() { // 启动微信 var ret = launchApp('com.tencent.mm', 'txt*:微信', {maxStep: 40, afterWait: 2000}); if (1 == ret) { console.log('进入微信成功'); var index = 0; /* 滚动三次微信 */ while (index < 3) { scroll('up', {distance: Math.random() * 0.5 + 0.45, duration: parseInt(Math.random() * 200 + 300), afterWait: 2000}); ++index; console.log('滚动:' + index); } console.log('任务结束,退出'); } else { console.log('启动微信失败'); } }
类型名 | 说明 |
---|---|
number | 包括整型,和浮点型,例:整型常量 12,浮点型 3.4。 |
boolean | 支持常量true,false,分别表示真和假,用于if语句的条件表达式。 |
string | 字符串常量用''或""表示,例:'hello'。支持模版字符串,用``(两个反引号)表示,可以嵌入变量,例:`hello ${name}`,在执行过程中会动态解析字符串值。 |
array | json数组类型,用[]创建json数组,可以用[]操作符访问数组,第一个元素从0开始,依此类推。注意:数组支持负索引,比如arr[-1]表示取arr的最后一个元素,-2表示倒数第二个元素,依次类推。例:var arr =['z', 12];var a=arr[-1];var b = arr[0];。 |
object | json对象类型,其本质是键值对,用{}创建json对象,可以用.和[]操作符访问属性。例:var obj = {name:'a', value:12};var a = obj.name; var b = obj['name'];。 |
类型 | 运算符 |
---|---|
算数运算符 | +、-、*、/、%、++、-- |
比较运算符 | >、>=、<、<=、!=、==(注意这里取消了繁杂的===和!==) |
逻辑运算符 | &&、||、! |
赋值运算符 | =、+=、-=、*=、/=、%= |
字符串运算符 | +、+= |
三元运算符 | ?: |
其他运算符 | typeof、delete、new |
运算符 | 说明 |
---|---|
()、[]、. | 函数调用以及表达式分组、数组访问、对象字段访问 |
++、--、!、delete、new、typeof | 一元运算符,只有一个操作数 |
*、/、% | 二元运算符,乘法、除法、取模 |
+、- | 二元运算符,加法、减法 |
==、!= | 二元运算符,等于、不等于 |
&& | 二元运算符,逻辑与 |
|| | 二元运算符,逻辑或 |
?: | 三元运算符,条件 |
=、+=、*=... | 二元运算符,赋值、运算赋值 |
语句 | 说明 |
---|---|
var | 声明变量,变量必须先声明才能使用。例:var a = 1, b, c = 'demo'; |
表达式 | 表达式用于实现基本的计算。例:b = 1 + a * 5; |
if(条件)、 else if(条件)、 else | 根据条件执行语句块。例:if (a == 'str') {...} else if (a == 'hello') {...} else {...} |
switch(条件) | 根据条件选择一个语句块执行。例:switch (a) {case 1:break;} |
for...of遍历 | 遍历可迭代对象,支持数组、对象、字符串等。例:for(var item of container){...} |
for循环 | 循环。例:for(var i = 0; i < 10; ++i){...} |
while(条件){} | 条件为true时执行语句块。例:while(a < 10){...} |
do{...}while(条件) | 先执行语句块,再判断条件,若为true则继续执行语句块。例:do{...}while(a < 10) |
function | 函数声明,支持默认参数。例:function main(a = 1, b = 'hello'){...} |
break | 退出循环,用于逻辑控制。 |
continue | 中断一次循环,并继续循环中的下一次迭代,用于逻辑控制。 |
return | 停止执行函数并从该函数返回值,用于逻辑控制。 |
import | 导入其他脚本,import支持三种方式 1.线上的脚本,2.本地js文件,3.apk资源中的js(asset:前缀在打包apk时添加的js文件),比如:import 'asset:temp.js';直接使用手机本地js文件。例:import 'Xiaomi_runtime'; import '/sdcard/sample.js'; import 'asset:test.js'; |
变量必须先声明才能使用。例:var a = 10;。 |
支持//和/**/注释。 |
if、for、while、do-while等,即使仅有一条子语句也必须使用{}。 |
不支持匿名函数和闭包,但支持自定义函数赋值给变量或作为函数参数传递。 |
暂不支持位运算。 |
不支持===、!==,直接统一使用==、!=,简化使用。 |
支持函数默认参数。 |
支持import语句,导入脚本。注意:可以使用user.scriptName来访问一个团队内部其他成员的脚本。 |
支持模版字符串。 |
新增编译指令:__global、__permanent、__day(仅用于移动端脚本),用于 var后,分别表示声明全局变量,持久变量和day变量,全局变量可以在多个模块间共享,可以在不同线程间通信,例:var __global text;持久变量永久存在,在当前脚本文件可见,除非卸载程序;day变量作用域为一天,在当前脚本文件可见,每天0点day变量复位为初始值。 |
默认main函数为入口函数,外部可以传递参数给main函数,main返回值为脚本的返回值,可以使用callScript函数可以调用其他脚本。 |
支持系统事件回调,cbNotification(textList, className, packageName, rawEvent)、cbWindowChange(textList, className, packageName, rawEvent)、cbMessage(msgId, param1...)、cbForceExit(),开发者可以在脚本中定义这三个函数,当系统收到通知消息或窗口改变事件后,会自动调用回调函数。注意事件回调函数和main函数不在一个线程中执行,可以通过__global变量来进行通信。 |
参数名 | 类型 | 说明 |
---|---|---|
textList | array | 通知中的文本数组 |
className | string | 类名 |
packageName | string | 包名 |
rawEvent | Event | 原始事件对象 |
// 例子: function main() { } function cbNotification(textList, className, packageName, rawEvent) { console.log('textList:' + textList + ' className:' + className + ' packageName:' + packageName); }
参数名 | 类型 | 说明 |
---|---|---|
textList | array | 窗口中文本 |
className | string | 类名 |
packageName | string | 包名 |
rawEvent | Event | 原始事件对象 |
// 例子: function main() { } function cbWindowChange(textList, className, packageName, rawEvent) { console.log('textList:' + textList + ' className:' + className + ' packageName:' + packageName); }
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
msgId | string | 必填 | 消息的唯一标识,系统内置消息id「run_msg」,用于显示程序内部运行的信息。 |
params... | 可变参数 | 选填 | 任意个参数 |
// 例子: function main() { } function cbMessage(msgId, params) { console.log('msgId:' + msgId + ' params:' + params); }
参数名 | 类型 | 必填 | 说明 |
---|
// 例子: function main() { } function cbForceExit(msgId, params) { console.log('force exit'); }
常量名 | 类型 | 说明 |
---|---|---|
rsCurPackageName | string | 当前app的包名(仅用于移动端端脚本) |
rsCurWindowClassName | string | 当前的窗口的类名(仅用于移动端端脚本) |
rsScreenWidth | integer | 分辨率,屏幕宽,单位像素(仅用于移动端端脚本) |
rsScreenHeight | integer | 分辨率,屏幕高,单位像素(仅用于移动端端脚本) |
rsDensity | float | 屏幕密度 dp和px转换公式:px=dp*rsDensity(仅用于移动端端脚本) |
rsUsername | string | 登录当前设备的用户名(仅用于移动端端脚本) |
rsPhoneNumber | string | 当前设备的电话号码(仅用于移动端端脚本) |
rsWX | string | 当前设备的微信名(仅用于移动端端脚本,仅供联系用) |
rsDeviceName | string | 当前设备名(仅用于移动端端脚本) |
rsUUID | string | 当前设备的uuid(仅用于移动端端脚本) |
rsOpenId | string | 当前用户的openId(仅用于后端脚本) |
rsIsDev | boolean | 当前是否处于调试状态(仅用于后端脚本) |