自动构建脚本

自动构建

使用自动构建,不需编程,仅需配置模块和置参数即可实现自动化脚本。自动构建并不是简单的对api进行UI化,而是在api的基础上进一步抽象和封装了更简单、更实用的功能和模块(比如:不同品牌手机的兼容处理、点击进入页面、循环处理、遍历容器,搜索控件并循环处理、弹窗处理,广告处理等等),让使用者更专心于业务逻辑梳理。不会编程的同学可以使用自动构建功能直接实现自动化脚本;有编程经验的同学使用自动构建可以简化开发工作,提升开发效率(只需关注核心业务逻辑即可)。

一个视频看懂自动构建脚本开始构建前,强烈建议您先点击这里了解这些内容!

使用步骤

  • 梳理业务逻辑。
  • 根据业务逻辑选择模块并配置参数。
  • 编译"自动构建"生成对应的js脚本。
  • 调试运行js脚本。
自动构建脚本的视频例子
1.hello world!(进入微信,并滚动三次)
点击这里查看hello world(进入微信然后滚动三次)的参数配置
// 请新建一个自动构建,然后点击"元数据",将如下元数据拷贝进去然后保存,系统会自动生成一个完整的自动构建demo。
{
	"type": "root",
	"children": [{
		"type": "declareVar",
		"var": [{
			"name": "temp",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "ret",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "view",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "viewContainer",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "item",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "index",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "data",
			"type": "normal",
			"initType": "string",
			"initValue": ""
		}, {
			"name": "text",
			"type": "normal",
			"initType": "string",
			"initValue": ""
		}]
	}, {
		"type": "main",
		"desc": "业务逻辑入口",
		"debug": false,
		"params": [],
		"children": [{
			"type": "launchApp",
			"desc": "启动APP",
			"debug": false,
			"packageName": "com.tencent.mm",
			"tag": "txt:发现|txt:搜索#",
			"maxStep": "30",
			"children": [{
				"type": "toast",
				"desc": "弹出框",
				"debug": false,
				"textList": ["string-微信启动成功"],
				"x": "-1",
				"y": "-1",
				"duration": "1000",
				"beforeWait": "0",
				"afterWait": "0"
			}, {
				"type": "loop",
				"desc": "循环处理",
				"class": "2",
				"debug": false,
				"minCount": "3",
				"maxCount": "3",
				"indexVarName": "index",
				"children": [{
					"type": "scroll",
					"desc": "滚动处理",
					"class": 1,
					"debug": false,
					"direction": "up",
					"tag": "",
					"family": [],
					"descendant": [],
					"widgetIndex": "0",
					"minDistance": "0.8",
					"maxDistance": "0.8",
					"minScrollCount": "1",
					"maxScrollCount": "1",
					"minDuration": "500",
					"maxDuration": "500",
					"beforeWait": "1000",
					"afterWait": "1000"
				}, {
					"type": "toast",
					"desc": "弹出框",
					"debug": false,
					"textList": ["string-滚动:", "var-index!-2"],
					"x": "-1",
					"y": "-1",
					"duration": "1000",
					"beforeWait": "0",
					"afterWait": "0"
				}]
			}, {
				"type": "toast",
				"desc": "弹出框",
				"debug": false,
				"textList": ["string-结束"],
				"x": "-1",
				"y": "-1",
				"duration": "1000",
				"beforeWait": "0",
				"afterWait": "0"
			}]
		}]
	}],
	"desc": "根模块",
	"debug": false
}                                    
2.钉钉自动打卡
熟悉业务逻辑
了解人工钉钉打卡的过程,也即熟悉业务逻辑,建议选择钉钉v6.5.10版本(其他版本操作界面可能会稍有不同,所以模块参数有可能要根据实际情况修改)。点击查看钉钉自动打卡业务逻辑)「视频教程」
选择模块并配置参数
在网页端「移动端」/「自动构建脚本」中新建一个“自动构建”,根据上一步的业务逻辑选择合适的自动构建模块并配置参数。 点击查看钉钉自动打卡模块选择和参数配置)「视频教程」
元数据
在配置自动构建模块和参数的过程中,系统会自动生成json格式的元数据用于描述选择的模块和参数,使用这个元数据可以快速复制一份完全一样的“自动构建”。
点击查看模块配置元数据
// 请新建一个自动构建,然后点击"元数据",将如下元数据拷贝进去然后保存,系统会自动生成一个完整的自动构建demo。
{
	"type": "root",
	"children": [{
		"type": "declareVar",
		"var": [{
			"name": "temp",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "ret",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "view",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "viewContainer",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "tag",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "item",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "index",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "data",
			"type": "normal",
			"initType": "string",
			"initValue": ""
		}, {
			"name": "text",
			"type": "normal",
			"initType": "string",
			"initValue": ""
		}]
	}, {
		"type": "main",
		"desc": "业务逻辑入口",
		"debug": false,
		"params": [],
		"children": [{
			"type": "launchApp",
			"desc": "启动APP",
			"debug": false,
			"packageName": "com.alibaba.android.rimet",
			"tag": "txt:工作台#",
			"false": {},
			"failed": "",
			"maxStep": 30,
			"children": [{
				"type": "clickAndEnter",
				"desc": "点击进入工作台",
				"class": 1,
				"debug": false,
				"clickTag": "txt:工作台#",
				"root": "",
				"clickWidgetIndex": 0,
				"family": [],
				"descendant": [],
				"checkTag": "txt:应用中心#",
				"mode": "2",
				"false": {},
				"failed": "",
				"duration": 500,
				"maxStep": "8",
				"beforeWait": 0,
				"afterWait": 0,
				"children": [{
					"type": "clickAndEnter",
					"desc": "点击进入考勤打卡页面",
					"class": 1,
					"debug": false,
					"clickTag": "txt:考勤打卡#",
					"root": "",
					"clickWidgetIndex": "0",
					"family": [],
					"descendant": [],
					"checkTag": "txt:统计#",
					"mode": "2",
					"failed": "",
					"duration": "500",
					"maxStep": "8",
					"beforeWait": "0",
					"afterWait": "0",
					"children": [{
						"type": "click",
						"desc": "点击打开",
						"class": 1,
						"debug": false,
						"tag": "txt:上班打卡|txt:下班打卡#",
						"root": "",
						"widgetIndex": "0",
						"family": [],
						"descendant": [],
						"mode": "3",
						"failed": "",
						"maxStep": "5",
						"longClick": false,
						"random": true,
						"duration": "5000",
						"beforeWait": "0",
						"afterWait": "1000"
					}],
					"false": {}
				}]
			}]
		}]
	}],
	"desc": "根模块",
	"debug": false
}                                    
3.拼多多自动浏览商品
熟悉业务逻辑
了解拼多多浏览商品的过程,也即熟悉业务逻辑,建议选择拼多多v6.12.1版本(其他版本操作界面可能会稍有不同,所以模块参数有可能要根据实际情况修改)。点击查看拼多多自动浏览商品业务逻辑)「视频教程」
选择模块并配置参数
在网页端「移动端」/「自动构建脚本」中新建一个“自动构建”,根据上一步的业务逻辑选择合适的自动构建模块并配置参数。 点击查看拼多多自动浏览商品模块选择和参数配置)「视频教程」
元数据
在配置自动构建模块和参数的过程中,系统会自动生成json格式的元数据用于描述选择的模块和参数,使用这个元数据可以快速复制一份完全一样的“自动构建”。
点击查看模块配置元数据
// 请新建一个自动构建,然后点击"元数据",将如下元数据拷贝进去然后保存,系统会自动生成一个完整的自动构建demo。
{
	"type": "root",
	"children": [{
		"type": "declareVar",
		"var": [{
			"name": "temp",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "ret",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "view",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "viewContainer",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "tag",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "item",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "index",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "data",
			"type": "normal",
			"initType": "string",
			"initValue": ""
		}, {
			"name": "text",
			"type": "normal",
			"initType": "string",
			"initValue": ""
		}]
	}, {
		"type": "main",
		"desc": "业务逻辑入口",
		"debug": false,
		"params": [],
		"children": [{
			"type": "launchApp",
			"desc": "启动APP",
			"debug": false,
			"packageName": "com.xunmeng.pinduoduo",
			"tag": "txt:推荐#",
			"failed": "",
			"maxStep": "30",
			"children": [{
				"type": "scroll",
				"desc": "滚动处理",
				"class": 1,
				"debug": false,
				"direction": "up",
				"tag": "",
				"family": [],
				"descendant": [],
				"widgetIndex": "0",
				"minDistance": "0.8",
				"maxDistance": "0.8",
				"minScrollCount": "2",
				"maxScrollCount": "3",
				"minDuration": "500",
				"maxDuration": "500",
				"beforeWait": "1000",
				"afterWait": "1000"
			}, {
				"type": "loop",
				"desc": "循环处理",
				"class": "2",
				"debug": false,
				"minCount": "2",
				"maxCount": "5",
				"indexVarName": "index0",
				"children": [{
					"type": "traverse",
					"desc": "遍历容器",
					"class": 1,
					"debug": false,
					"tag": "cn:android.support.v4.view.ViewPager#",
					"family": [1, 1],
					"descendant": [],
					"failed": "",
					"traverseSelf": false,
					"retryCount": "0",
					"startIndex": "0",
					"lastIndex": "0",
					"randomPickCount": "1",
					"clickable": false,
					"className": "",
					"children": [{
						"type": "clickAndEnter",
						"desc": "点击进入页面",
						"class": "2",
						"debug": false,
						"family": [],
						"descendant": [],
						"checkTag": "txt:发起拼单#",
						"mode": "2",
						"failed": "",
						"duration": "500",
						"maxStep": "5",
						"beforeWait": "0",
						"afterWait": "0",
						"target": "item",
						"children": [{
							"type": "scroll",
							"desc": "滚动处理",
							"class": 1,
							"debug": false,
							"direction": "up",
							"tag": "",
							"family": [],
							"descendant": [],
							"widgetIndex": "0",
							"minDistance": "0.8",
							"maxDistance": "0.8",
							"minScrollCount": "3",
							"maxScrollCount": "5",
							"minDuration": "500",
							"maxDuration": "500",
							"beforeWait": "1000",
							"afterWait": "3000"
						}, {
							"type": "back2Page",
							"desc": "返回页面",
							"debug": false,
							"tag": "txt:首页#",
							"root": "",
							"backFirst": "true",
							"failed": "",
							"duration": "500",
							"maxStep": "5",
							"beforeWait": "0",
							"afterWait": "0"
						}]
					}]
				}, {
					"type": "scroll",
					"desc": "滚动处理",
					"class": 1,
					"debug": false,
					"direction": "up",
					"tag": "",
					"family": [],
					"descendant": [],
					"widgetIndex": "0",
					"minDistance": "0.8",
					"maxDistance": "0.8",
					"minScrollCount": "2",
					"maxScrollCount": "3",
					"minDuration": "500",
					"maxDuration": "500",
					"beforeWait": "1000",
					"afterWait": "1000"
				}]
			}]
		}]
	}],
	"desc": "根模块",
	"debug": false
}                                    
4.抖音自动刷视频
熟悉业务逻辑
了解抖音浏览视频的过程,也即熟悉业务逻辑,建议选择抖音v21.3.0版本(其他版本操作界面可能会稍有不同,所以模块参数有可能要根据实际情况修改)。 点击查看抖音浏览视频的业务逻辑)「视频教程」
选择模块并配置参数
在网页端「移动端」/「自动构建脚本」中新建一个“自动构建”,根据上一步的业务逻辑选择合适的自动构建模块并配置参数。 点击查看抖音自动刷视频模块选择和参数配置)「视频教程」
元数据
在配置自动构建模块和参数的过程中,系统会自动生成json格式的元数据用于描述选择的模块和参数,使用这个元数据可以快速复制一份完全一样的“自动构建”。
点击查看模块配置元数据
// 请新建一个自动构建,然后点击"元数据",将如下元数据拷贝进去然后保存,系统会自动生成一个完整的自动构建demo。
{
	"type": "root",
	"children": [{
		"type": "declareVar",
		"var": [{
			"name": "temp",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "ret",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "view",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "viewContainer",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "tag",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "item",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "index",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "data",
			"type": "normal",
			"initType": "string",
			"initValue": ""
		}, {
			"name": "text",
			"type": "normal",
			"initType": "string",
			"initValue": ""
		}]
	}, {
		"type": "main",
		"desc": "业务逻辑入口",
		"debug": false,
		"params": [],
		"children": [{
			"type": "launchApp",
			"desc": "启动APP",
			"debug": false,
			"packageName": "com.ss.android.ugc.aweme",
			"tag": "txt:推荐#",
			"false": {},
			"failed": "",
			"maxStep": 30,
			"children": [{
				"type": "loop",
				"desc": "循环处理",
				"class": 1,
				"debug": false,
				"minRunTime": "1",
				"maxRunTime": "2",
				"children": [{
					"type": "sleep",
					"desc": "模拟看视频",
					"debug": false,
					"minTime": "2000",
					"maxTime": "8000"
				}, {
					"type": "click",
					"desc": "点赞",
					"class": 1,
					"debug": false,
					"tag": "txt^:未点赞#",
					"root": "",
					"widgetIndex": "0",
					"family": [],
					"descendant": [],
					"mode": "2",
					"failed": "",
					"maxStep": "5",
					"longClick": false,
					"random": true,
					"duration": "500",
					"beforeWait": "0",
					"afterWait": "2000"
				}, {
					"type": "scroll",
					"desc": "滚动处理",
					"class": 1,
					"debug": false,
					"direction": "up",
					"tag": "",
					"family": [],
					"descendant": [],
					"widgetIndex": "0",
					"minDistance": "0.98",
					"maxDistance": "0.98",
					"minScrollCount": "1",
					"maxScrollCount": "1",
					"minDuration": "500",
					"maxDuration": "500",
					"beforeWait": "1000",
					"afterWait": "1000"
				}]
			}]
		}]
	}],
	"desc": "根模块",
	"debug": false
}                                    
5.今日头条自动阅读新闻
熟悉业务逻辑
了解今日头条阅读文章的过程,也即熟悉业务逻辑,建议选择今日头条v8.8.5版本(其他版本操作界面可能会稍有不同,所以模块参数有可能要根据实际情况修改)。 点击查看今日头条阅读文章的业务逻辑)「视频教程」
选择模块并配置参数
在网页端「移动端」/「自动构建脚本」中新建一个“自动构建”,根据上一步的业务逻辑选择合适的自动构建模块并配置参数。 点击查看今日头条自动阅读文章模块选择和参数配置)「视频教程」
元数据
在配置自动构建模块和参数的过程中,系统会自动生成json格式的元数据用于描述选择的模块和参数,使用这个元数据可以快速复制一份完全一样的“自动构建”。
点击查看模块配置元数据
// 请新建一个自动构建,然后点击"元数据",将如下元数据拷贝进去然后保存,系统会自动生成一个完整的自动构建demo。
{
	"type": "root",
	"children": [{
		"type": "declareVar",
		"var": [{
			"name": "temp",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "ret",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "view",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "viewContainer",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "tag",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "item",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "index",
			"type": "normal",
			"initType": "null",
			"initValue": "null"
		}, {
			"name": "data",
			"type": "normal",
			"initType": "string",
			"initValue": ""
		}, {
			"name": "text",
			"type": "normal",
			"initType": "string",
			"initValue": ""
		}]
	}, {
		"type": "main",
		"desc": "业务逻辑入口",
		"debug": false,
		"params": [],
		"children": [{
			"type": "launchApp",
			"desc": "启动APP",
			"debug": false,
			"packageName": "com.ss.android.article.news",
			"tag": "txt:首页#",
			"failed": "",
			"maxStep": "30",
			"children": [{
				"type": "scroll",
				"desc": "滚动处理",
				"class": 1,
				"debug": false,
				"direction": "up",
				"tag": "",
				"family": [],
				"descendant": [],
				"widgetIndex": "0",
				"minDistance": "0.8",
				"maxDistance": "0.8",
				"minScrollCount": "2",
				"maxScrollCount": "3",
				"minDuration": "500",
				"maxDuration": "500",
				"beforeWait": "1000",
				"afterWait": "1000"
			}, {
				"type": "loop",
				"desc": "循环处理",
				"class": 1,
				"debug": false,
				"minRunTime": "1",
				"maxRunTime": "2",
				"children": [{
					"type": "traverse",
					"desc": "遍历容器",
					"class": 1,
					"debug": false,
					"tag": "cn:androidx.recyclerview.widget.RecyclerView#",
					"family": [],
					"descendant": [],
					"failed": "",
					"traverseSelf": false,
					"retryCount": "0",
					"startIndex": "0",
					"lastIndex": "0",
					"randomPickCount": "0",
					"clickable": false,
					"className": "",
					"children": [{
						"type": "if",
						"desc": "条件处理",
						"class": 1,
						"debug": false,
						"target": "item",
						"family": [1],
						"descendant": [],
						"conditions": "className@#android.widget.RelativeLayout@#",
						"children": [{
							"type": "clickAndEnter",
							"desc": "点击进入页面",
							"class": "2",
							"debug": false,
							"family": [],
							"descendant": [],
							"checkTag": "txt:分享#",
							"mode": "2",
							"false": {
								"type": "back2Page",
								"desc": "返回页面",
								"debug": false,
								"tag": "txt:首页#",
								"root": "",
								"backFirst": "false",
								"failed": "",
								"duration": "500",
								"maxStep": "5",
								"beforeWait": "0",
								"afterWait": "0"
							},
							"failed": "",
							"duration": "500",
							"maxStep": "5",
							"beforeWait": "0",
							"afterWait": "0",
							"target": "item",
							"children": [{
								"type": "scroll",
								"desc": "滚动处理",
								"class": 1,
								"debug": false,
								"direction": "up",
								"tag": "",
								"family": [],
								"descendant": [],
								"widgetIndex": "0",
								"minDistance": "0.2",
								"maxDistance": "0.5",
								"minScrollCount": "4",
								"maxScrollCount": "6",
								"minDuration": "1000",
								"maxDuration": "3000",
								"beforeWait": "1000",
								"afterWait": "1000"
							}, {
								"type": "back2Page",
								"desc": "返回页面",
								"debug": false,
								"tag": "txt:首页#",
								"root": "",
								"backFirst": "true",
								"failed": "",
								"duration": "500",
								"maxStep": "5",
								"beforeWait": "0",
								"afterWait": "0"
							}]
						}]
					}]
				}, {
					"type": "scroll",
					"desc": "滚动处理",
					"class": 1,
					"debug": false,
					"direction": "up",
					"tag": "",
					"family": [],
					"descendant": [],
					"widgetIndex": "0",
					"minDistance": "0.98",
					"maxDistance": "0.98",
					"minScrollCount": "2",
					"maxScrollCount": "3",
					"minDuration": "500",
					"maxDuration": "500",
					"beforeWait": "1000",
					"afterWait": "1000"
				}]
			}]
		}]
	}],
	"desc": "根模块",
	"debug": false
}                                    

模块和参数

什么是模块?模块就好比积木,比如玩具飞机,我们可以用各种零部件积木"搭建"一架飞机,而飞机的零部件就好比我们的各种功能模块,所以配置自动构建就是一个类似"搭积木"的过程。
一个完整的自动构建是个树形结构,最顶层为root模块,根据业务逻辑选择合适的模块进行拼装并配置参数,最后形成一个和业务逻辑结构类似的树形结构。下面介绍下每个构建模块的用法。

· 业务逻辑入口(main)

业务逻辑入口模块,父模块只能是root。所有业务逻辑处理都放在main模块里,系统会自动按顺序执行所有子模块。
属性名 类型 说明
params string array 参数列表,外部传递进来的透传参数

· 启动APP(enterApp)

打开并进入app,成功后系统会自动按顺序执行所有子模块实现相关业务逻辑。通常「启动APP」模块是第一个模块,进入app后要做的所有任务都作为子模块放在「启动APP」模块内部(树形结构)。
点击查看「视频教程」
属性名 类型 说明
packageName string app包名
findTag tag app启动后首页中出现的某个控件的tag,出现该tag就表示app启动成功
autoExit boolean 完成后是否自动退出app,默认为false
wait integer 启动app后等待多长时间,默认1000,单位毫秒
false module 启动app失败后执行的模块,一般常用于记录错误日志
failed popup 搜索tag失败一次后调用这个模块,一般常用于处理弹窗或者广告
maxStep integer 最多搜索多少次tag,默认30次

· 查找控件并处理(findViewAndDeal)

根据tag查找控件,如果找到其中一个tag就执行其对应的处理模块(通常变量viewContainer存放找到的控件数组,view存放找到的第一个控件,注意:widgetIndex可以决定view存放第几个控件)执行完后结束模块。 注意与「搜索控件并循环处理」模块的区别。
点击查看「视频教程」
处理由一些列处理项组成,每个处理项由[tag,module]对组成,tag表示被搜索控件的tag,module表示其对应的处理模块。
例:找到tag为"编辑"时,点击控件;找到tag为"我的"时,弹出toast框,如下图所示:
属性名 类型 说明
root var 搜索控件时指定的root,若不为空则从root开始搜索
false module 调用结束时没有找到控件时执行的模块,常用于记录错误日志
failed popup 查找tag失败一次后调用这个模块处理,常用于处理弹窗或者广告
duration integer 两次搜索间隔时间,默认500,单位毫秒
widgetIndex integer 挑选找到控件中的一个进行处理,-1表示挑选最后一个,0表示挑选第一个,依次类推,默认为0
maxStep integer 搜索tag时最大尝试次数,默认5次
beforeWait integer 执行前等待时间,默认0,单位毫秒
afterWait integer 执行完成后等待时间,默认0,单位毫秒

· 搜索控件(searchView)

根据tag搜索控件,变量viewContainer存放找到的控件数组,view存放找到的第一个控件,(注意:fetchResultIndex可以决定view存放第几个控件)
属性名 类型 说明
root var 搜索控件时指定的root,若不为空则从root开始搜索
tag tag 搜索控件的tag
family array 点击查看「视频教程」
false module 调用结束时没有找到控件时执行的模块,常用于记录错误日志
failed popup 查找tag失败一次后调用这个模块处理,常用于处理弹窗或者广告
duration integer 两次搜索间隔时间,默认500,单位毫秒
maxStep integer 搜索tag时最大尝试次数,默认5次
beforeWait integer 执行前等待时间,默认0,单位毫秒
afterWait integer 执行完成后等待时间,默认0,单位毫秒
fetchResultIndex integer 挑选找到控件中的一个返回,-1表示挑选最后一个,0表示挑选第一个,依次类推,默认为0
returnVarIsLocal boolean 存放返回值变量是否仅在当前层有效,默认值:false

· 点击(click)

点击当前界面中的某个控件。分三种点击类型:通过控件tag点击、直接点击控件、手势点击屏幕。点击这里查看详情
注意:如果某个点击模式无效时,请在三个模式间切换(模拟点击、控件内置点击功能、先模拟点击再使用内置点击功能)尝试,一般都可以解决
点击查看「视频教程」
1.通过控件tag点击,先按tag找到控件,然后再点击控件
属性名 类型 说明
root var 搜索控件时指定的root,若指定则从root开始搜索
tag tag 被点击控件的tag
family array 点击查看「视频教程」
false module 搜索控件失败后执行的模块,通常在这里打印出错日志
failed popup 搜索tag失败一次后调用这个模块,一般常用于处理弹窗或者广告
mode select 点击模式,支持三种点击模式:模拟点击、控件内置点击功能、先模拟点击再使用内置点击功能。注意使用控件内置点击功能的前提是控件的clickable属性必须为true,或者其某一个祖先控件的clickable属性为true
widgetIndex integer 挑选找到所有控件中的一个进行点击,-1表示挑选最后一个返回,0表示挑选第一个返回,依次类推,默认为0
longClick boolean 是否长按
duration integer 两次搜索间隔时间,默认500,单位毫秒
maxStep integer 当搜索tag失败时重试次数,默认5次
beforeWait integer 执行前等待时间,默认0,单位毫秒
afterWait integer 执行完成后等待时间,默认1000,单位毫秒
2.直接点击控件,target存放将被点击的控件。
属性名 类型 说明
target var 被点击控件
family array 点击查看「视频教程」
false module 执行失败后执行的模块,通常在这里打印出错日志。
mode select 点击模式,支持三种点击模式:模拟点击、控件内置点击功能、先模拟点击再使用内置点击功能。注意使用控件内置点击功能的前提是控件的clickable属性必须为true,或者其某一个祖先控件的clickable属性为true
beforeWait integer 执行前等待时间,默认0,单位毫秒
afterWait integer 执行完成后等待时间,默认1000,单位毫秒
3.手势点击屏幕,直接在屏幕上模拟用手点击。
属性名 类型 说明
x coord 被点击屏幕x坐标
y coord 被点击屏幕y坐标
unit string unit表示坐标的单位,默认为像素(px),可以取dp,percent,px,详见这里
false module 执行失败后执行的模块,通常在这里打印出错日志。
beforeWait integer 执行前等待时间,默认0,单位毫秒
afterWait integer 执行完成后等待时间,默认1000,单位毫秒

· 点击进入页面(clickAndEnter)

点击控件,进入另一个页面,如果进入成功,则按顺序执行所有子模块(通常变量viewContainer存放搜索checkTag找到的控件数组,view存放搜索checkTag找到的第一个控件)。分两种点击类型:通过控件tag点击、直接点击控件。
应用场景:当需要进入某个页面时使用,一般在进入页面时都是点击某个按钮或者文本进入下个页面。
点击查看「视频教程」
1.通过控件tag点击
属性名 类型 说明
root var 搜索控件时指定的root,若指定则从root开始搜索
clickTag tag 被点击控件的tag
family array 点击查看「视频教程」
checkTag tag 进入另一个页面后的控件tag,若出现该tag则表示进入页面成功
clickWidgetIndex integer 挑选找到控件中的一个进行操作,-1表示挑选最后一个返回,0表示挑选第一个返回,依次类推
mode select 点击模式,支持三种点击模式:模拟点击、控件内置点击功能、先模拟点击再使用内置点击功能。注意使用控件内置点击功能的前提是控件的clickable属性必须为true,或者其某一个祖先控件的clickable属性为true
false module 执行失败后执行的模块,通常在这里打印出错日志。
failed popup 搜索tag失败一次后调用这个模块,一般常用于处理弹窗或者广告
duration integer 两次搜索间隔时间,默认500,单位毫秒
maxStep integer 当搜索tag失败时重试次数,默认5次
beforeWait integer 执行前等待时间,默认0,单位毫秒
afterWait integer 执行完成后等待时间,默认0,单位毫秒
2.直接点击控件
属性名 类型 说明
target var 被点击控件变量
family array 点击查看「视频教程」
checkTag tag 进入另一个页面后的控件tag,若出现该tag则表示进入页面成功
mode select 点击模式,支持三种点击模式:模拟点击、控件内置点击功能、先模拟点击再使用内置点击功能。注意使用控件内置点击功能的前提是控件的clickable属性必须为true,或者其某一个祖先控件的clickable属性为true
false module 搜索控件失败后执行的模块,通常这里打印出错日志。
failed popup 搜索tag失败一次后调用这个模块,一般常用于处理弹窗或者广告
duration integer 两次搜索间隔时间,默认500,单位毫秒
maxStep integer 当搜索tag失败时重试次数,默认5次
beforeWait integer 执行前等待时间,默认0,单位毫秒
afterWait integer 执行完成后等待时间,默认0,单位毫秒

· 返回页面(back2Page)

多次按返回键直到返回指定页面为止。成功后按顺序执行所有子模块。
应用场景:当使用「点击进入页面(clickAndEnter)」模块成功进入下一个页面后,任务完成后一般需要返回原来的页面,这时可以选择「返回页面(back2Page)」模块
属性名 类型 说明
root var 搜索控件时指定的root,若不为空则从root开始搜索
tag tag 返回页面中的某个控件tag,出现该tag表示已经成功返回该页面了
backFirst boolean 是否先按返回键再判断是否返回指定页面,默认true
false module 执行失败后执行的模块,通常在这里打印出错日志。
failed popup 搜索tag失败一次后调用这个模块,一般常用于处理弹窗或者广告
duration integer 两次搜索间隔时间,单位毫秒
maxStep integer 一趟搜索中最大尝试次数。
beforeWait integer 执行前等待时间,单位毫秒
afterWait integer 执行完成后等待时间,单位毫秒

· 滚动处理(scroll)

滚动页面。分两种类型:手势滚动、系统翻页。
应用场景:当需要向上或者向下滚动页面时,比如:下一个视频、上一个视频,滚动页面浏览文本等场景。
1.手势滚动,模拟用手来滚动屏幕
属性名 类型 说明
tag tag 若找到tag对应的控件则滚动该控件,否则滚动屏幕
family array 点击查看「视频教程」
widgetIndex integer 挑选找到控件中的一个进行操作,-1表示挑选最后一个返回,0表示挑选第一个返回,依次类推,默认为0
direction string 取值:向上滚动、向下滚动、向左滚动、向右滚动
minScrollDistance float 最小滚动距离,取值范围[0-1],1表示整个控件高度(左右滚动时为宽度),默认0.8
maxScrollDistance float 最大滚动距离,取值范围[0-1],默认0.8。若minScrollDistance不等于maxScrollDistance,则系统取[minScrollDistance, maxScrollDistance]间的一个随机值
minDuration integer 滚动一次最小时间,默认500,单位毫秒
maxDuration integer 滚动一次最长时间,默认500,单位毫秒。若minDuration不等于maxDuration,则系统取[minDuration, maxDuration]间随机值
beforeWait integer 执行前等待时间,默认1000,单位毫秒
afterWait integer 执行完成后等待时间,默认1000,单位毫秒
2.系统翻页,使用系统自带的翻页功能
属性名 类型 说明
direction string 取值:向上滚动、向下滚动
beforeWait integer 执行前等待时间,默认1000,单位毫秒
afterWait integer 执行完成后等待时间,默认1000,单位毫秒

· 按返回键(back)

模拟按手机中的返回键,常用于返回上一页面。
应用场景:当使用「点击进入页面」模块成功进入下一个页面后,任务完成后一般需要返回原来的页面,这时可以选择「按返回键」模块
属性名 类型 说明
count integer 按count次返回键,默认1
duration integer 两次按键间隔时间,默认1000,单位毫秒
beforeWait integer 执行前等待时间,默认0,单位毫秒
afterWait integer 执行完成后等待时间,默认0, 单位毫秒

· 循环处理(loop)

用于有循环处理需求的场景,每次循环都会按顺序执行所有子模块;分三种类型:通过时间控制循环、通过次数控制循环、永久循环。
例:看5个短视频,就可以用次数循环;看5分钟视频,就可以用时间循环。
1.通过时间控制循环
属性名 类型 说明
minRunTime float 最小运行时长,默认1,单位分
maxRunTime float 最长运行时长,默认1,单位分。若minRunTime不等于maxRunTime,则实际运行时间取[minRunTime,maxRunTime]间的随机值
2.通过次数控制循环
index变量存放当前循环的次数,取值范围:[0, count - 1]
属性名 类型 说明
minCount integer 最少运行次数,默认1
maxCount integer 最大运行次数,默认1。minCount不等于maxCount,则实际运行次数取[minCount,maxCount]间的随机值
indexVarName string 每次循环索引变量名,默认为index。当次数循环嵌套次数循环时,相同的index有可能导致循环错乱,出错时建议更改indexVarName值。
3.永久循环,一直执行下去,直到遇到「跳出循环」模块才跳出循环
属性名 类型 说明

· 跳出循环(break)

「跳出循环」模块,跳出当前循环,注意:若有多层循环嵌套,则只跳出最近一层循环。分三种类型:直接跳出循环、找到tag跳出循环、满足条件跳出循环。
注意:一般与「循环处理」模块配合使用,「循环处理」模块可以为「跳出循环」模块的任一祖先模块(不一定是父模块)
点击这里查看「视频教程」
1.直接跳出最近一个循环模块,无条件跳出当前循环
属性名 类型 说明
2.找到tag就跳出最近一个循环模块
属性名 类型 说明
breakTag tag 找到该tag就跳出循环
failed popup 搜索tag失败一次后调用这个模块,一般常用于处理弹窗或者广告
3.满足条件跳出最近一个循环模块
属性名 类型 说明
expr string 条件表达式

· 遍历容器(traverse)

用于有遍历访问容器中每个控件的场景,每次遍历都会按顺序执行所有子模块,一般遍历时容器的子控件存放在item变量中,可以在子孙模块(注意不仅仅是子模块)中的target参数中直接使用。分两种类型:通过控件tag搜索容器、从变量获取容器。
应用场景:一般用于顺序或者随机阅读容器中的文章或者做任务,如下图所示,容器RecyclerView有4个子控件,点击子控件执行一个任务,可以使用「遍历容器」模块,依次执行每个任务。选择使用「遍历容器」模块,其子模块使用「点击」模块,选择"直接点击控件"类型,target选择item变量
点击这里查看「视频教程」
1.通过搜索tag得到容器
属性名 类型 说明
tag tag 被搜索容器的tag
family array 点击查看「视频教程」
failed popup 搜索tag失败一次后调用这个模块,一般常用于处理弹窗或者广告
retryCount integer 当搜索容器失败后,刷新下界面再次重试的次数,默认0
startIndex integer 从容器的第几个孩子开始遍历 取值>=0,0表示第一个孩子依次类推,默认0
lastIndex integer 从容器的倒数第几个孩子停止遍历 取值>=0,0表示最后一个孩子依次类推,默认0
randomPickCount integer 默认为0,0表示直接按顺序访问所有有效子控件,>0表示随机取randomPickCount个子控件,<0表示在所有效子控件中随机取随机个子控件
clickable boolean 是否仅处理可点击的子控件,默认false
2.从变量获取容器
属性名 类型 说明
target var 被遍历的容器变量
family array 点击查看「视频教程」
startIndex integer 从容器的第几个孩子开始遍历 取值>=0,0表示第一个孩子依次类推,默认0
lastIndex integer 从容器的倒数第几个孩子停止遍历 取值>=0,0表示最后一个孩子依次类推,默认0
randomPickCount integer 默认为0,0表示直接按顺序访问所有有效子控件,>0表示随机取randomPickCount个子控件,<0表示在所有效子控件中随机取随机个子控件
clickable boolean 是否仅处理可点击的子控件,默认false

· 概率(prob)

概率,落在概率内则返回true表示成功。成功后按顺序执行所有子模块。
应用场景:当我们要以一定概率执行某个操作时使用该模块,例子:比如我要进入某页面,但又不想每次都进入,想以80%的概率进入(10次大概有8次进入,2次不进入),此时prob参数取80,每次执行到这里时,系统会自动以80%的概率执行其子模块(进入),20的概率不执行,也就是10次,有8次执行,2次不执行(不进入)。
属性名 类型 说明
prob integer 取之[0-100],100表示100%概率,0表示0%概率

· 日志(log)

打日志。
应用场景:主要用于调试,打印运行过程中的信息。
点击这里查看「视频教程」
属性名 类型 说明
logType integer 日志类型,取值:log,error,warning,info
info value array 系统会自动把数组中的所有值按顺序连接起来,然后打印出来。

· 弹出框(toast)

弹出框,当x>=0且y>=0时,按坐标来显示,否则显示在屏幕中央,注意:左上角为(0, 0),x坐标向为正,y坐标向下为正。
应用场景:主要用于调试和显示信息。除了显示信息外,还可以指定左上角坐标,当我们使用屏幕点击的时候可以协助我们定位准确位置。
属性名 类型 说明
textList value array 系统会自动把数组中的所有值按顺序连接起来,然后通过toast显示出来。
x integer x坐标,单位像素,默认-1
y integer y坐标,单位像素,默认-1
duration integer 持续多长时间,单位毫秒,默认1000
beforeWait integer 执行前等待时间,默认0,单位毫秒
afterWait integer 执行完成后等待时间,默认0,单位毫秒

· 延时(sleep)

延时,暂停当前操作一段时间。
应用场景:当执行太快时,可以延迟一段时间再继续执行,比如进入APP后,可以延时3000毫秒后再继续后面的操作。
属性名 类型 说明
minTime integer 最短延时时间,默认1000,单位毫秒
maxTime integer 最长延时时间,默认1000,单位毫秒,若minTime不等于maxTime,则取[minTime,maxTime]间的随机值

· 刷新当前页面(refresh)

刷新当前页面,实现原理:模拟按下最近执行应用键、然后选中当前执行的app,以便于系统重新刷新下app界面。
应用场景:在实际操作过程中由于各种原因可能通过tag找不到控件,这时可以调用「刷新当前页面」来刷新下界面,通常可以成功找到tag对应的控件。
属性名 类型 说明
appName string 刷新后切换到该app上运行,注意该app必须是「冰狐智能辅助」启动的app
packageName string 刷新后切换到该app上运行,注意该app必须是「冰狐智能辅助」启动的app
beforeWait integer 执行前等待时间,默认0,单位毫秒
afterWait integer 执行完成后等待时间,默认0,单位毫秒

· 最近运行app(recentApps)

显示最近运行的app,模拟手机中的显示最近使用app的效果。
应用场景:可以用于切换app,显示最近运行的app后,点击目标app即可切换。

· 显示桌面 (home)

显示桌面,模拟手机中的home按键效果。
应用场景:当切换到桌面后,然后执行「最近运行app」,最后模拟点击"清除"按钮,可以清除内存中所有可清除的app,以优化内存。

· 粘贴文本(paste)

粘贴文本,目标控件一般为EditView等可编辑的控件。分两种类型:通过控件tag粘贴、直接粘贴到控件。
注意:当粘贴无效时,请切换到另外一种mode试试(set,paste),一般都可以解决问题。
1.通过控件tag粘贴
属性名 类型 说明
root var 搜索控件时指定的root,若不为空则从root开始搜索
data value 待粘贴的数据
tag tag 控件tag
family array 点击查看「视频教程」
mode string 粘贴模式,取值:set,paste
widgetIndex integer 挑选找到控件中的一个进行操作,-1表示挑选最后一个返回,0表示挑选第一个返回,依次类推,默认为0
duration integer 两次搜索间隔时间,默认500,单位毫秒
failed popup 搜索tag失败一次后调用这个模块,一般常用于处理弹窗或者广告
maxStep integer 一趟搜索中最大尝试次数,默认5次
beforeWait integer 执行前等待时间,默认0,单位毫秒
afterWait integer 执行完成后等待时间,默认0,单位毫秒
2.直接粘贴到控件
属性名 类型 说明
target var 控件变量
family array 点击查看「视频教程」
data value 待粘贴的数据
mode string 粘贴模式,取值:set,paste
beforeWait integer 执行前等待时间,默认0,单位毫秒
afterWait integer 执行完成后等待时间,默认0,单位毫秒

· 获取控件文本(getText)

获取控件的文本,返回值存放在text变量中。分两种方式:通过控件tag获取、直接通过控件获取。
1.通过控件tag获取
属性名 类型 说明
root var 搜索控件时指定的root,若不为空则从root开始搜索
tag tag 控件tag
family array 点击查看「视频教程」
failed popup 搜索tag失败一次后调用这个模块,一般常用于处理弹窗或者广告
maxStep integer 一趟搜索中最大尝试次数,默认5次
2.直接从控件获取
属性名 类型 说明
target var 控件变量
family array 点击查看「视频教程」

· 获取自定义数据(getCustomData)

从「自定义数据服务」中获取数据,根据服务名(service name)获取数据,然后再根据分隔符(separator)把数据分成n份,默认返回分隔后的数组,fetchResultIndex表示想获取第几个数据。获取的数据存储data变量。
例:网页端进入「管理中心」/「自定义数据」,新建名为"test"的服务,然后输入数据:您好#你好#hello#hi,并保存。在自动构建中添加「获取自定义数据」服务,serviceName填:test,其他默认值;执行时系统会在[您好、你好、hello、hi]中随机取一个存入data变量,供后续使用
点击这里查看「视频教程」
属性名 类型 说明
serviceName string 服务名称
separator string 多个数据的分隔符,默认:#
returnJsonData boolean 是否返回json数据,默认值:false
returnVarName string 存放返回值的变量,默认值:data
returnVarIsLocal boolean 存放返回值变量是否仅在当前层有效,默认值:false
fetchResultIndex integer 如果结果为数组,则-2表示直接返回结果,-1表示随机选择一个数据,0表示获取第一个数据,若指定index超过实际数据大小,则取最后一个数据。默认为-2

· 添加自定义数据项(appendCustomDataItem)

把数据item添加到自定义数据服务的最后,在item前自动添加分隔符,返回boolean,成功返回true,失败返回false,返回值存在在ret变量中。
属性名 类型 说明
serviceName string 服务名称
separator string 多个数据的分隔符,默认:#
item value array 系统会自动把数组中的所有值按顺序连接起来组成item。

· 搜索控件并循环处理(searchAndLoopDeal)

根据处理项的tag搜索控件并进行循环多次处理,常用于多个任务处理,注意与「查找控件并处理」模块的区别。系统在找到tag并执行对应的处理模块后会继续搜索tag,如果找到则继续处理,直到找不到tag为止才算完成一趟搜索。这里的每个tag都带一个最大处理次数count(默认为1),当该tag被处理一次后count减1,若为0则自动删除该tag不再参与后续搜索(通常变量viewContainer存放搜索到的控件数组(可能找到多个控件),view存放搜索到的第一个控件)。
注意:一趟搜索包含多次搜索。
应用场景:常用于多任务处理,例子:比如当前任务页包含两个任务,任务的tag分别为文本"看广告"和"获取能量",其中,"看广告"可以执行2次,而"获取能量"只能执行一次。对应的任务项为:[看广告+2, 点击]和[获取能量+1, 点击],假如第一趟搜索到文本"看广告",执行对应任务,任务完成后count-1,任务项变成[看广告+1, 点击];第二趟搜索到文本"获取能量",执行对应的任务,任务完成后count-1,此时"获取能量"的count为0,所以移除"获取能量"任务项;第三趟搜索到文本"看广告",执行对应的任务,任务完成后count-1,count为0,移除"看广告"任务项;没有可执行的任务项了,所以退出「搜索控件并循环处理」模块。
属性名 类型 说明
root var 搜索控件时指定的root,若不为空则从root开始搜索
retryCount integer 搜索一趟失败后,最多再重新搜索几趟,默认为0,一般不需要修改
false module 执行一趟失败后执行的模块,通常在这里滚动屏幕以便于继续搜索其他控件
failed popup 搜索tag失败一次后调用这个模块,一般常用于处理弹窗或者广告
duration integer 两次搜索间隔时间,默认500,单位毫秒
maxStep integer 一趟搜索中最大尝试次数,默认8
beforeWait integer 执行前等待时间,默认0,单位毫秒
afterWait integer 执行完成后等待时间,默认0,单位毫秒
处理项由[tag+count, module]对组成,tag表示被搜索控件的tag,count表示该tag最多能被处理几次,超过了次数会被系统自动移除,默认取1。module表示对应处理模块。

· 条件处理(if)

表达式为true时,按顺序执行所有子模块。
1.UI控件条件
属性名 类型 说明
target var 控件变量
family array 点击查看「视频教程」
conditions condition 所有条件逻辑与(&&),控件相关的条件处理,比如尺寸、文本、类名、子控件数、是否可点击、是否被选中等
2.直接写入条件
属性名 类型 说明
expr string 表达式

· 导入脚本(importScript)

导入脚本后,可以直接调用脚本中的自定义模块或者函数。
属性名 类型 说明
name string 脚本名
exportModuleNames string list 导出模块

· 调用脚本(callScript)

调用脚本,返回值放在ret变量中。
属性名 类型 说明
name string 脚本名
params value array 系统会自动把数组中的所有值按顺序传递给微服务
returnVarName string 存放返回值的变量,默认值:ret
returnVarIsLocal boolean 存放返回值变量是否仅在当前层有效,默认值:true

· 调用微服务(callMicroService)

调用微服务,返回值放在ret变量中。
属性名 类型 说明
serviceName string 服务名
params value array 系统会自动把数组中的所有值按顺序传递给微服务
returnVarName string 存放返回值的变量,默认值:ret
returnVarIsLocal boolean 存放返回值变量是否仅在当前层有效,默认值:true

· 调用函数(callFunction)

调用函数,返回值放在ret变量中。
1.调用字符串函数
属性名 类型 说明
target var 字符串变量
name string 函数名
params value array 系统会自动把数组中的所有值按顺序传递给函数
returnVarName string 存放返回值的变量,默认值:ret
returnVarIsLocal boolean 存放返回值变量是否仅在当前层有效,默认值:true
fetchResultIndex integer 若返回值为数组,则挑选其中和一个值返回,-2表示不挑选,-1表示挑选最后一个返回,0表示挑选第一个返回,依次类推
2.调用数组函数
属性名 类型 说明
target var 数组变量
name string 函数名
params value array 系统会自动把数组中的所有值按顺序传递给函数
returnVarName string 存放返回值的变量,默认值:ret
returnVarIsLocal boolean 存放返回值变量是否仅在当前层有效,默认值:true
fetchResultIndex integer 若返回值为数组,挑选其中和一个值返回,-2表示不挑选,-1表示挑选最后一个返回,0表示挑选第一个返回,依次类推
3.调用全局函数
属性名 类型 说明
name string 函数名
params value array 系统会自动把数组中的所有值按顺序传递给函数
returnVarName string 存放返回值的变量,默认值:ret
returnVarIsLocal boolean 存放返回值变量是否仅在当前层有效,默认值:true
fetchResultIndex integer 若返回值为数组,挑选其中和一个值返回,-2表示不挑选,-1表示挑选最后一个返回,0表示挑选第一个返回,依次类推

· 调度脚本(调用多个脚本 scheduleScript)

按规则执行多个脚本。
属性名 类型 说明
nameList array 脚本名数组
random boolean 是否随机挑选脚本调用(注意:在一轮中不会重复调用);默认值:false表示顺序调用所有脚本
permanent boolean 是否永久执行,若为true,则一轮执行完后继续执行下一轮,直到强制退出任务为止;默认值:false

· 调用自定义模块(callCustomModule)

调用自定义模块,返回值放在ret变量中(等同于调用自定义函数)。
属性名 类型 说明
name string 自定义模块名
params value array 系统会自动把数组中的所有值按顺序传递给模块

· 自定义模块(customModule)

自定义模块,父模块只能是root。按顺序执行所有子模块(等同于自定义函数)。
属性名 类型 说明
name string 模块名
params string array 参数列表

· 退出执行(return)

退出自定义模块或者业务逻辑处理模块。
属性名 类型 说明
returnValue value 返回值

· 调度(定时 scheduler)

调度,父模块只能是root。当满足调度条件时,系统会自动执行所有子模块。
应用场景:主要用于精确定时执行任务,或者周期性执行任务。
属性名 类型 说明
returnVar var 返回值存放变量
cron string cron表达式中文文档

· GET网络请求(get)

对地址url进行一次HTTP GET请求,同步支持,直接返回结果。
应用场景:主要用于请求外部网络场景。
属性名 类型 说明
url string 网络url
headers object 请求头
returnVarName var 返回值存放变量,默认为ret
returnVarIsLocal boolean 存放返回值变量是否仅在当前层有效,默认值:false

· POST网络请求(post)

对地址url进行一次HTTP POST请求,同步支持,直接返回结果。
应用场景:主要用于请求外部网络场景。
属性名 类型 说明
url string 网络url
data string/object 数据
headers object 请求头
returnVarName var 返回值存放变量,默认为ret
returnVarIsLocal boolean 存放返回值变量是否仅在当前层有效,默认值:false

· 模块组(group)

组合多个模块,按顺序执行所有子模块。

· js模块(js)

js模块,直接写入js代码。
属性名 类型 说明
code string js代码

· 音频模块(audio)

音频模块。
1.播放音频
属性名 类型 说明
path value 音频路径,例:/sdcard/sample.mp3,https://afn.com/sample.mp3
2.停止播放
属性名 类型 说明

· 手势操作(gesture)

模拟人工的手势操作,由多个坐标点连接而成。
属性名 类型 说明
cord string 偶数个点的坐标(浮点型),依次顺序排列:x1,y1,x2,y2...
unit string 表示坐标的单位,默认为像素(px),可以取dp,percent,px,控件的尺寸(px单位)可以在UI树中获取;dp为设备无关单位,换算公式为:px=dp*rsDensity;percent,取[0-1],表示为屏幕宽或高成比例,换算公式:宽(px)=rsScreenWidth*x,高(px)=rsScreenHeight*y
duration integer 表示多长时间完成手势操作,单位:毫秒
beforeWait integer 执行前等待时间,单位毫秒
afterWait integer 执行完成后等待时间,单位毫秒

· 写文件(writeFile)

写文件。
属性名 类型 说明
content string 内容
fileName string 文件名,若为相对目录则存储在sdcard目录下
append boolean 是否在文件末尾追加,默认为false

· 获取控件颜色(getWidgetColor)

获取控件中某点的颜色值,默认获取中点颜色值,返回整型值。
1.通过tag获取控件颜色
属性名 类型 说明
x integer x坐标,像素值,-1表示取中点值
y integer y坐标,像素值,-1表示取中点值
confirmPermissionTag string 确认权限控件的tag,用于自动确认权限
root var 搜索控件时指定的root,若不为空则从root开始搜索
tag tag 控件tag
family array 点击查看「视频教程」
widgetIndex integer 挑选找到控件中的一个进行操作,-1表示挑选最后一个返回,0表示挑选第一个返回,依次类推,默认为0
duration integer 两次搜索间隔时间,默认500,单位毫秒
failed popup 搜索tag失败一次后调用这个模块,一般常用于处理弹窗或者广告
maxStep integer 一趟搜索中最大尝试次数,默认5次
beforeWait integer 执行前等待时间,默认0,单位毫秒
afterWait integer 执行完成后等待时间,默认0,单位毫秒
returnVarName string 存放返回值的变量,默认值:ret
returnVarIsLocal boolean 存放返回值变量是否仅在当前层有效,默认值:false
2.直接获取控件颜色
属性名 类型 说明
target NodeObject 目标控件对象
x integer x坐标,像素值,-1表示取中点值
y integer y坐标,像素值,-1表示取中点值
confirmPermissionTag string 确认权限控件的tag,用于自动确认权限
returnVarName string 存放返回值的变量,默认值:ret
returnVarIsLocal boolean 存放返回值变量是否仅在当前层有效,默认值:false

· 获取屏幕颜色(getScreenColor)

获取屏幕某点的颜色值。
属性名 类型 说明
x integer x坐标,像素值
y integer y坐标,像素值
confirmPermissionTag string 确认权限控件的tag,用于自动确认权限
returnVarName string 存放返回值的变量,默认值:ret
returnVarIsLocal boolean 存放返回值变量是否仅在当前层有效,默认值:false

· 找图(findImage)

找图,返回找到图片的左上角坐标point,point.x和point.y表示坐标位置。
属性名 类型 说明
imageFileName string 图像的文件名,支持手机sdcard路径和app资源文件,比如:asset:logo.png
left float 识别区域的left,若取值在[0, 1]之间表示比例,例:0.5表示left位于屏幕x轴中点;若取值大于1表示像素值。
top float 识别区域的top,若取值在[0, 1]之间表示比例,例:0.5表示left位于屏幕x轴中点;若取值大于1表示像素值。
width float 识别区域的width,若取值在[0, 1]之间表示比例,例:0.5表示left位于屏幕x轴中点;若取值大于1表示像素值。
height float 识别区域的height,若取值在[0, 1]之间表示比例,例:0.5表示left位于屏幕x轴中点;若取值大于1表示像素值。
returnVarName string 存放返回值的变量,默认值:ret
returnVarIsLocal boolean 存放返回值变量是否仅在当前层有效,默认值:false

· 文字识别(ocr)

文字识别,返回值为数组,里面存放识别到的文本和对应的区域。
属性名 类型 说明
left float 识别区域的left,若取值在[0, 1]之间表示比例,例:0.5表示left位于屏幕x轴中点;若取值大于1表示像素值。
top float 识别区域的top,若取值在[0, 1]之间表示比例,例:0.5表示left位于屏幕x轴中点;若取值大于1表示像素值。
width float 识别区域的width,若取值在[0, 1]之间表示比例,例:0.5表示left位于屏幕x轴中点;若取值大于1表示像素值。
height float 识别区域的height,若取值在[0, 1]之间表示比例,例:0.5表示left位于屏幕x轴中点;若取值大于1表示像素值。
returnVarName string 存放返回值的变量,默认值:ret
returnVarIsLocal boolean 存放返回值变量是否仅在当前层有效,默认值:false

· 亮屏(wakeup)

亮屏
属性名 类型 说明

· 变量声明(declareVar)

声明一些变量用于辅助构建,这些变量会在脚本运行过程中系统自动进行赋值,我们只需要在合适时机使用即可,一般不需要修改这里。支持4种类型变量:普通变量,全局变量,持久变量,day变量,分别表示不同的作用域。详见这里
注意:只能在最顶层创建变量声明模块,且最多只能创建一个变量声明模块
默认变量:
变量名 类型 说明
ret 普通变量 默认用于存放模块返回值,例:var ret = findView('txt:讲解');
view 普通变量 默认用于存放控件变量,例:var ret = findView('txt:讲解');view=ret.views[0];
viewContainer 普通变量 默认用于存放控件容器,例:var ret = findView('txt:讲解');viewContainer=ret.views;
item 普通变量 默认用于存放遍历容器时的孩子,例:var ret = findView('txt:讲解');for(var item of ret.views){};

· 弹窗处理(exitPopup)

处理app在运行过程中随机弹出来的窗口,比如:升级对话框、确认对话框等。
注意:只能在最顶层创建弹窗处理模块,且可以创建多个弹窗处理模块 上图为升级对话框,通过文本tag:监测到更新,判断是否出现升级对话框,若出现则点击"以后再说",处理项为[监测到更新, 点击]
点击这里查看「视频教程」
属性名 类型 说明
name string 函数名,弹出处理模块最后会被编译成一个函数供其他模块调用
false array 弹窗处理数组,当前弹窗处理模块不能处理弹窗时,依次调用数组中的模块处理(可以包含弹窗处理和广告处理),直到成功处理为止
例:当前弹窗处理模块在执行过程中就有可能处理不了所有的弹窗,此时即有可能出现对话框也有可能出现广告,所以需要把其他的弹窗处理模块和广告处理模块放到array参数里,如果弹窗处理或广告处理有一个能处理,则执行成功
处理项由[tag,module]对组成,tag表示弹窗中的某个控件tag,若出现该tag则表示弹窗出现。module表示处理该弹窗的模块。
应用场景:当我们判断在运行某个模块的过程中,有可能会弹出对话框时,在模块的failed参数里选择弹窗处理,如下图所示:
处理app在运行过程中弹出广告的场景,可以和「弹窗处理」模块一起使用也可以单独使用,广告如下图所示:
注意:只能在最顶层创建广告窗处理模块,且最多只能创建一个广告处理模块
点击这里查看「视频教程」
属性名 类型 说明
enterWindowClassName array 广告窗口类名数组。当出现其中一个窗口时表示进入广告了
enterTags array 广告窗口某个控件的tag数组。出现其中一个tag,表示进入广告了
breakTags array 退出广告后的显示窗口控件的tag数组。出现其中一个tag,表示退出广告了
处理项由[tag,module]对组成,tag表示广告窗口中某个控件的tag,当广告完成后,点击该控件或者控件的family可以退出广告,默认使用view变量存放找到的控件。module表示对应处理模块,比如点击等。
应用场景1:若当前模块执行过程中有可能出现广告,则在模块failed属性中选择dealAD模块,如下图所示:
应用场景2:若当前模块执行过程中即有可能出现弹窗,也有可能出现广告,则在弹窗处理模块的false属性中添加dealAD模块,如下图所示:

· 窗口变化处理 (windowChange)

当出现新窗口时,作出相应的处理。比如出现"授权权限对话框"时,可以选择取消或者授权。
注意:只能在最顶层创建窗口变化处理模块,且最多只能创建一个窗口变化处理模块
处理项由[className,module]对组成,className表示窗口类名。module表示对应处理模块,比如点击等。

· 通知处理(notification)

通知处理,变量item存放匹配到的文本,该变量可用于后续处理模块访问。
应用场景:可以处理微信消息,支付宝消息,短信息以及其他各种其他app的通知消息。
注意:通知处理模块生效的前提:必须开启app的通知权限。只能在最顶层创建通知处理模块,且最多只能创建一个通知处理模块
属性名 类型 说明
packageName string 仅处理指定包名app的通知
stopMainTaskBeforeStart boolean 运行前是否停止主业务逻辑处理
exeDefaultTaskWhenFinished boolean 结束时是否启动默认任务
处理项由[filter,module]对组成,filter表示通知中的某个标志性文本,变量item存放匹配的文本,比如:微信消息。module表示相应的处理模。已经匹配到filter后,不再匹配其他filter。