我现在需要完成一个手机上的自动化操作。我现在需要做一个脚本,具体步骤如下:1、点击页面上第一个(核实信息)按钮,等待载入完成,点击右下角提交,其中提交会出现两个分支,1、弹出小窗:存在未核实人员标签,是否去核实? 如果出现这个小窗,则点击(继续保存),会显示:人口基本信息保存成功。2、直接显示:人口基本信息保存成功。不管哪条分支,等出现后点击返回键(这是一个安卓手机投屏窗口,可以点击物理按钮返回也可以点击左上角返回)。然后回到上一层的列表(就是有核实信息的那一列。)点击右上角的筛选,然后点击最上层的筛选,等待载入后出现新列表,开始下一轮。但是注意的是,每一次操作都有概率出现:请求中 小窗,要等待该窗口消失后再继续下一步操作。我建议选择HAMIBOT平台,请你根据我的要求,我们两个一步一步搭建出一个可用的HAMIBOT脚本,你可以向我自由提问?我现在已经通过USB连接手机,ADB如果默认不能调用,则调用G:\scrcpy-win64-v3.3.4目录的。目前手机已经打开了第一个页面 也就是有核实窗口的页面,请你自己规划路径,一步一步慢慢实现我的要求。如果需要帮助,你可以告诉我我要怎么做,我会尽可能协助你(但是我代码能力为0)

373919217_hpw9 · 2 天前

回答

Hamibot AI
1
· 2 天前

你好!很高兴能协助你搭建这个自动化脚本。Hamibot 是一个运行在安卓手机上的应用,脚本也是直接在手机上执行的,而不是通过电脑端的 ADB 或 Scrcpy 直接控制(Scrcpy 仅用于投屏查看)。

为了让你能够顺利运行,我们需要分步骤进行。由于你的代码基础为零,我会尽量简化操作,并提供一个可以直接复制使用的脚本模板,但需要你配合确认一些界面上的具体文字。

第一步:环境准备与权限检查

在开始写脚本前,必须确保手机权限已开启,否则脚本无法点击屏幕。

  1. 无障碍服务:进入手机「设置」→「无障碍」→找到 Hamibot → 开启开关。
  2. 后台弹出界面:进入手机「设置」→「应用管理」→ 找到 Hamibot → 允许「显示悬浮窗」或「后台弹出界面」。
  3. 截图权限:首次运行脚本时,系统会弹窗请求截图权限,请点击「允许」。

第二步:确认界面元素信息

脚本的核心是识别界面上的按钮和文字。我需要你提供以下关键信息的准确内容(你可以打开 Hamibot 的「调试」功能或使用截图工具查看):

  1. 「核实信息」按钮的确切文字是什么?(例如:“核实信息”还是“去核实”?)
  2. 「提交」按钮的确切文字是什么?
  3. 「继续保存」按钮的确切文字是什么?
  4. 「筛选」按钮的确切文字是什么?
  5. 「请求中」小窗的确切文字是什么?

如果你暂时无法获取这些 ID,我们可以先用文字匹配的方式编写脚本。

第三步:脚本搭建方案

我为你规划了一个包含循环、异常处理和返回逻辑的脚本结构。你可以将下面的代码复制到 Hamibot 在线编辑器中。

注意: 代码中用 // TODO: 标记的地方,需要你根据实际界面文字进行修改。

// 文档地址 https://docs.hamibot.com/

// 全局配置区域,请在此处修改实际界面文字
var CONFIG = {
    btn_verify_info: "核实信息", // 第一个要点的按钮文字
    btn_submit: "提交",          // 右下角提交按钮文字
    btn_continue_save: "继续保存", // 未核实人员弹窗的按钮文字
    msg_success: "人口基本信息保存成功", // 保存成功的提示文字
    btn_filter: "筛选",          // 列表页右上角筛选按钮文字
    popup_request: "请求中",     // 可能出现的请求中弹窗文字
    sleep_interval: 1000         // 每次操作间隔时间(毫秒)
};

// 核心函数:等待特定弹窗消失
function waitForPopupDisappear(text) {
    var startTime = new Date().getTime();
    while (true) {
        var exists = text(text).exists();
        if (!exists) {
            return true;
        }
        // 如果超过 30 秒还没消失,强制退出防止死循环
        if (new Date().getTime() - startTime > 30000) {
            toast("检测到" + text + "窗口长时间未消失,请手动处理");
            return false;
        }
        sleep(500);
    }
}

// 核心函数:等待特定文字出现
function waitForTextAppear(text) {
    var startTime = new Date().getTime();
    while (true) {
        if (text(text).exists()) {
            return true;
        }
        if (new Date().getTime() - startTime > 10000) {
            return false;
        }
        sleep(500);
    }
}

// 主循环逻辑
function mainLoop() {
    while (true) {
        // 1. 检查是否有“请求中”弹窗,如果有则等待消失
        if (text(CONFIG.popup_request).exists()) {
            toast("检测到请求中,等待窗口关闭");
            waitForPopupDisappear(CONFIG.popup_request);
        }

        // 2. 点击第一个“核实信息”按钮
        toast("开始点击核实信息");
        if (!text(CONFIG.btn_verify_info).findOne()) {
            toast("未找到核实信息按钮,可能已结束任务");
            exit();
        }
        text(CONFIG.btn_verify_info).findOne().click();
        sleep(CONFIG.sleep_interval);

        // 3. 点击“提交”按钮
        toast("点击提交");
        if (!text(CONFIG.btn_submit).findOne()) {
            toast("未找到提交按钮");
            exit();
        }
        text(CONFIG.btn_submit).findOne().click();
        sleep(CONFIG.sleep_interval);

        // 4. 处理分支逻辑
        // 分支 A: 存在未核实人员标签弹窗
        if (text(CONFIG.btn_continue_save).exists()) {
            toast("发现未核实弹窗,点击继续保存");
            text(CONFIG.btn_continue_save).findOne().click();
            sleep(CONFIG.sleep_interval);
        }

        // 5. 等待“保存成功”提示出现
        toast("等待保存成功");
        if (!waitForTextAppear(CONFIG.msg_success)) {
            toast("未检测到保存成功,可能流程中断");
            // 这里可以选择重试或退出,建议先退出观察
            exit();
        }

        // 6. 点击返回键
        toast("执行返回");
        back();
        sleep(CONFIG.sleep_interval);

        // 7. 点击筛选
        toast("点击筛选");
        if (!text(CONFIG.btn_filter).findOne()) {
            toast("未找到筛选按钮");
            exit();
        }
        text(CONFIG.btn_filter).findOne().click();
        sleep(CONFIG.sleep_interval);

        // 8. 点击最上层筛选选项(此处需要确认具体是哪个选项的文字)
        // 假设筛选后会出现一个新的列表项,你需要指定点击哪一个
        // 这里暂时用通用查找,请根据实际情况调整
        toast("点击筛选选项");
        // 示例:点击第一个出现的筛选结果,或者指定文字
        // text("具体筛选选项文字").findOne().click(); 
        // 由于不确定具体选项文字,这里暂不写死,请你在测试时补充
        
        // 9. 等待新列表载入
        toast("等待新列表载入");
        sleep(CONFIG.sleep_interval * 3);

        // 10. 循环继续
        toast("一轮完成,开始下一轮");
    }
}

// 启动脚本
mainLoop();

第四步:如何测试与调试

  1. 保存脚本:将上述代码粘贴到 Hamibot 编辑器,点击保存。
  2. 运行脚本:在设备列表中选中你的手机,点击运行。
  3. 观察日志:脚本运行时,Hamibot 界面下方会有日志输出。如果报错,请查看日志中的错误信息。
  4. 关于筛选选项:代码第 8 步中,我留了注释。因为你说“点击最上层的筛选”,这通常意味着筛选后会弹出一个下拉菜单或新页面。你需要告诉我那个选项的具体文字,或者告诉我它是否会自动加载。

第五步:需要你确认的问题

为了让脚本更精准,请回答以下问题:

  1. 界面上所有按钮的确切文字是什么?(特别是“筛选”后的那个选项文字)。
  2. “请求中”的小窗出现时,是否需要点击“确定”关闭,还是自动消失?(如果是自动消失,上面的代码已经处理;如果需要点击,需增加点击逻辑)。
  3. 脚本运行过程中,如果出现意外情况(比如找不到按钮),你是希望它停止,还是重试一次?

请先尝试按照上述步骤操作,并回复我上述问题的答案,我会帮你优化代码。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实