var watchBtn = findText(controls, ["看全集"]);
if (watchBtn) {
   if (watchBtn.text().length < 5)  {     
    click(watchBtn.x, watchBtn.y);
    toast("点击:" + watchBtn.text);
    sleep(3000);
    continue;
     }
}

这段代码有什么问题

jrmtpk2515 · 2 小时前

回答

Hamibot AI
1
· 2 小时前

这段代码存在几个关键问题,会导致脚本运行报错或逻辑失效。以下是具体分析和修正方案:

主要问题分析

  1. API 函数不存在
    Hamibot 标准环境中没有 findText(controls, [...]) 这个函数。你应该使用选择器链式调用,例如 text("看全集").findOne()

  2. 属性访问错误
    watchBtn.text 是获取对象的方法,必须加括号调用,即 watchBtn.text()。直接写 watchBtn.text 可能返回函数对象而不是字符串,导致后续比较出错。

  3. continue 语句位置
    continue 只能在循环(如 forwhile)内部使用。如果这段代码在循环外,会直接报错。如果在循环内,它的作用是跳过本次循环剩余部分,直接进入下一次循环。

  4. 点击方式不稳定
    虽然 click(x, y) 可用,但直接使用控件对象的 .click() 方法更稳定,能自动适配不同分辨率和控件状态。

  5. 逻辑判断风险
    length < 5 的判断条件比较脆弱。如果按钮文字变成“看全集免费”(5 个字),逻辑就会失效。建议直接匹配完整文字。

修正后的代码示例

假设你需要在一个循环中不断检测并点击,以下是符合 Hamibot 规范的写法:

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

function main() {
    while (true) {
        // 查找控件
        var btn = text("看全集").findOne(5000); // 设置超时时间防止阻塞
        
        if (btn) {
            // 验证文本内容
            var txt = btn.text();
            if (txt && txt.length > 0) {
                btn.click(); // 使用控件自带点击方法
                toast("点击成功:" + txt);
                sleep(3000);
                continue; // 跳过本次循环剩余部分,重新查找
            }
        } else {
            // 如果找不到控件,可以选择退出或等待
            log("未找到按钮,等待刷新");
            sleep(2000);
        }
    }
}

main();

修改要点说明

  1. 使用 text("...").findOne():这是标准的控件查找方式,支持超时参数(如 5000 毫秒)。
  2. 调用 btn.click():比坐标点击更可靠,避免因为屏幕滑动导致点击偏移。
  3. 移除 controls 参数:不需要传入未定义的变量。
  4. 增加超时机制findOne(5000) 确保脚本不会无限期卡住等待不存在的控件。
  5. 规范日志输出:使用 log() 记录后台信息,toast() 提示前台信息。

如果你是在特定的循环结构中使用,请确保 continue 确实位于 whilefor 的大括号内部。如果有其他具体的上下文需求,可以告诉我,我帮你调整结构。

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