本文档旨在详细介绍自动化脚本项目的结构、核心组件及其工作流程。
资源文件统一存放在 res 目录下,用于管理脚本运行所需的各类静态数据。
此目录用于存放字符串资源。例如,zh.json 文件定义了中文字符串资源。在脚本中,可以通过全局变量 $stringResources 的
getString 方法来读取这些内容。
最佳实践:建议将脚本中用到的所有固定文本(如日志信息、UI提示等)在
zh.json中进行定义。这样做不仅便于未来的国际化(多语言支持),也能有效避免在脚本模块中使用中文字符串时可能出现的乱码问题。
此文件用于配置打包后的应用(APK)在启动时是否自动执行脚本。文件内容应为 true 或 false。
此文件用于设置打包后应用在主界面底部显示的版权信息。例如:© 2025 M8Test. All rights reserved.。
此文件用于配置版权信息的点击事件。当用户点击底部版权文本时,应用将跳转到此处设置的网址。例如:https://www.m8test.com。
这部分是项目自动化逻辑的核心。
项目代码的执行流程遵循以下模式:
- 创建任务:首先,创建一个
AutoTask实例,它代表一个完整的自动化任务。 - 添加屏幕:通过
AutoTask.addScreen方法向任务中添加一个或多个“屏幕”(Screen)。每个屏幕代表应用的一个特定界面,例如首页、搜索结果页、私信页等。 - 运行任务:调用
AutoTask.run方法启动自动化任务。运行时,框架会自动识别当前设备界面匹配哪个已定义的“屏幕”,并执行该屏幕下相应的操作逻辑。 - 停止任务:通过
AutoTask.stop方法可以随时终止自动化任务的执行。
每个“屏幕”所包含的一系列动作(Action)都由一个 ActionContainer 来管理。其执行逻辑如下:
- 获取动作序列:框架通过调用
ActionContainer.getActionNames方法获取一个包含动作名称的数组。该方法可以根据当前状态动态返回需要执行的动作序列,也可以返回一个固定的动作列表。 - 执行动作:框架根据获取到的动作名称,找到对应的动作对象,并执行其内部的
run方法来完成具体操作。
此目录存放了自动化任务中所有“屏幕”的定义文件。每个 .js 文件通常代表一个屏幕,例如 HomeScreen.js 用于定义首页的行为和识别规则。
此目录包含项目的主入口文件 primary.js,是整个自动化任务的起点。
此目录存放了项目中使用的类型定义文件。它们主要用于增强代码编辑器(如 VS Code)的智能提示和类型检查,在脚本实际运行时并不会被加载,对功能没有直接影响。
此目录存放了项目中用到的各类工具模块,例如随机数生成器、本地存储封装等,以便在不同脚本文件中复用。
项目UI文件位于 webview 目录下,用于构建脚本的交互界面。您可以利用现代前端技术,甚至是 AI 辅助工具,来构建功能丰富且美观的用户界面。
用于显示脚本UI的HTML文件。其编写方式与标准HTML文件完全相同,通常会引入 style.css 和 index.js。
用于定义UI界面的样式表文件,编写方式与标准CSS文件完全相同。
用于处理UI界面逻辑的JavaScript文件。它与普通的Web前端JS类似,但包含一个关键的初始化部分,用于与原生脚本进行通信。
(function () {
// 初始化函数,建立与原生脚本的通信桥梁
function init() {
/**
* $webViewBridge.registerHandler() 用于注册一个处理器,供原生脚本端调用。
* @param {string} handlerName - 处理器名称,脚本端将通过此名称调用。
* @param {function(data, responseCallback)} handler - 处理器函数。
* - data: 从脚本端传递过来的数据。
* - responseCallback: 一个回调函数,用于将处理结果返回给脚本端。
*/
// 示例:
// $webViewBridge.registerHandler("functionForScriptToCall", function (data, responseCallback) {
// console.log("接收到来自脚本端的数据:", data);
// if (responseCallback) {
// var responseData = "我是来自 JavaScript 的返回结果";
// responseCallback(responseData);
// }
// });
// 在 $webViewBridge 初始化完成后,加载配置
loadConfig();
}
// 监听 WebViewBridgeReady 事件,确保 $webViewBridge 对象可用
if (window.$webViewBridge) {
init();
} else {
document.addEventListener('WebViewBridgeReady', init, false);
}
})();1. UI端(WebView)调用脚本端方法
UI端可以通过 $webViewBridge.callHandler 来调用在原生脚本端注册的方法。例如,加载配置时调用脚本端的 readConfig 方法:
function loadConfig() {
// 调用脚本端的 "readConfig" 处理器
$webViewBridge.callHandler("readConfig", "", function (savedConfig) {
// 这个回调函数会接收到脚本端的返回值
if (savedConfig) {
const config = JSON.parse(savedConfig);
// 使用配置数据更新UI界面...
document.getElementById('viewDetailTime').value = config.viewDetailTime;
// ... 其他UI更新逻辑
}
});
}2. 脚本端注册供UI调用的方法
为了响应UI端的调用,原生脚本端需要在入口文件(如 primary.js)中注册相应的处理器:
/**
* 注册 "readConfig" 处理器,供 WebView UI 端调用。
*
* @param {string} params - 从 UI 端调用时传递的参数 (此处未使用)。
* @returns {string} - 返回读取到的配置对象的 JSON 字符串。
*/
bridge.registerHandler("readConfig", (params) => {
const config = xhsStorage.readConfig();
const result = JSON.stringify(config);
$console.log($stringResources.getString("read_config"), result);
return result; // 将配置对象序列化为 JSON 字符串并返回
});保存配置的功能也采用同样的通信机制:UI端将表单数据序列化为JSON字符串,通过 callHandler 发送到脚本端,脚本端再通过相应的
registerHandler 接收数据并执行保存操作。