function waitAndClick(){
if(true){
return true;
} else {
return false;
}

var btn = waitAndClick()
if(btn){
log("ok")
},我写这种自定义函数,都无法执行,请问错在哪里?

已存档
费兰 · 21 天前
第 1 条补充
·
21 天前

function waitAndClick(selector, timeout = 5000) {
var btn = selector.findOne(timeout);
if (btn) {
btn.click();
return true;
}
return false;
}

var btn = waitAndClick(id("view_tab_title_title").text("我"))
if(btn){
log("ok")
},写成这样报错,错在哪里

第 2 条补充
·
21 天前

timeout = 5000

function waitAndClick(selector, timeout) {
var btn = selector.findOne(timeout);
if (btn) {
btn.click();
return true;
}
return false;
}

var btn = waitAndClick(text("我"))
if(btn){
log("ok")
} else {
log("no")
},写成这样还是报错

回答

Hamibot AI
1
· 21 天前

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

你写的代码存在语法错误,问题出在 waitAndClick 函数的结构上:函数没有正确闭合就直接开始写后续逻辑了

JavaScript 要求函数必须有完整的 {} 包裹,并且函数定义结束后才能执行其他语句。你在 if...else 之后直接写 var btn = waitAndClick(),这会让 JS 引擎认为 var btn = ... 是函数体的一部分,但由于它不在任何块之外,会导致语法错误(例如 "Unexpected token")。

此外,你的 if(true) 是恒为真的条件,所以这个函数永远返回 true,逻辑上也可以简化。

正确写法如下:

// 定义函数
function waitAndClick() {
  if (true) {
    return true;
  } else {
    return false;
  }
}

// 调用函数
var btn = waitAndClick();
if (btn) {
  log("ok");
}

更简洁的版本(推荐):

由于 if(true) 永远成立,可以直接简化为:

function waitAndClick() {
  return true;
}

var btn = waitAndClick();
if (btn) {
  log("ok"); // 输出: ok
}

常见注意事项:

  • 确保函数的 {} 成对出现。
  • 不要在函数体内未闭合的情况下写函数外的代码。
  • 在 Hamibot 中使用 Rhino 引擎,不支持 ES6 箭头函数等新特性,建议使用传统函数写法。

这样修改后,你的代码就可以正常运行了。


补充回答 1

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

你的代码有两个关键问题:


❌ 问题 1:不能使用函数默认参数语法

Hamibot 使用的是 Rhino 1.7.15 引擎,不支持 ES6 的默认参数语法(即 timeout = 5000)。

function waitAndClick(selector, timeout = 5000) { // ❌ 不支持这种写法

这会导致脚本解析失败,直接报错。

正确做法:使用 typeof 判断参数是否传入,手动设置默认值。


❌ 问题 2:选择器链式调用必须在函数内完成

你传入的是 id("view_tab_title_title").text("我") 这个选择器对象。虽然 Hamibot 支持传递 UiSelector 对象,但在函数外部构建复杂选择器再传入时,如果执行环境有延迟或上下文变化,可能无法正确匹配。

更稳妥的做法是:在函数内部执行选择逻辑,或者确保调用时界面已加载完毕。


✅ 正确修改后的代码如下:

// 文档地址 https://docs.hamibot.com/
function waitAndClick(selector, timeout) {
  // 设置默认超时时间为 5000 毫秒
  if (typeof timeout === 'undefined') {
    timeout = 5000;
  }

  var btn = selector.findOne(timeout);
  if (btn) {
    btn.click();
    return true;
  }
  return false;
}

// 调用函数(注意:选择器要确保此时界面上存在)
var btn = waitAndClick(id("view_tab_title_title").text("我"));

if (btn) {
  log("ok");
}

✅ 建议增强健壮性:添加点击前的控件有效性判断

function waitAndClick(selector, timeout) {
  if (typeof timeout === 'undefined') {
    timeout = 5000;
  }

  var btn = selector.findOne(timeout);
  if (btn && btn.enabled()) { // 确保控件存在且可点击
    btn.click();
    return true;
  }
  return false;
}

📝 补充说明:

  • findOne(timeout) 在指定时间内未找到控件会返回 null
  • 请确保调用此函数时目标应用已经打开并显示了对应页面。
  • 若页面需要滑动才能出现该控件,需先加入滑动操作。

这样修改后,你的函数就可以正常运行了。


补充回答 2

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

你现在的写法:

timeout = 5000

function waitAndClick(selector, timeout) {
    var btn = selector.findOne(timeout);
    if (btn) {
        btn.click();
        return true;
    }
    return false;
}
  
var btn = waitAndClick(text("我"))
if(btn){
  log("ok")
} else {
  log("no")
}

存在一个关键问题:你在函数外部直接写了 timeout = 5000,这会导致语法错误或变量作用域混乱。

JavaScript 中,语句不能随意放在函数定义之前而没有分隔符(尤其在全局作用域),而且你在函数参数中也用了同名变量 timeout,会因作用域问题导致传入的值被覆盖或未正确读取。


❌ 错误分析

  1. 缺少分号timeout = 5000 和后面的 function 之间没有分号,Rhino 可能将其解析为一条表达式,导致语法错误。
  2. 全局污染 + 参数遮蔽:你在外面设置了一个全局变量 timeout,但在函数内部又用 timeout 作为参数名,此时函数内的 timeout 是形参,但如果你不传第二个参数,它不会自动取全局值 —— 所以实际上传入的是 undefined
  3. 因此,selector.findOne(undefined) 等价于 findOne() 没有超时限制?但实际上,findOne(undefined) 的行为等同于 findOne(0),即只搜索一次当前画面,如果没找到就立即返回 null,可能导致点击失败。

✅ 正确写法(推荐):

你应该在函数内部处理默认值,而不是依赖外部变量:

// 文档地址 https://docs.hamibot.com/
function waitAndClick(selector, timeout) {
  // 设置默认超时时间
  if (typeof timeout === 'undefined') {
    timeout = 5000;
  }

  var btn = selector.findOne(timeout);
  if (btn) {
    btn.click();
    return true;
  }
  return false;
}

// 调用函数
var btn = waitAndClick(text("我"));

if (btn) {
  log("ok");
} else {
  log("no");
}

✅ 或者明确传入超时时间(更清晰)

var btn = waitAndClick(text("我"), 5000); // 明确指定超时

这样就不需要依赖默认值判断了。


🔍 补充建议

  • 确保你要找的控件文本确实是 "我",并且当前页面已加载完成。
  • 如果是进入新页面后查找,建议加一点延迟:
sleep(1000); // 等待界面刷新
var btn = waitAndClick(text("我"), 5000);
  • 可加上日志调试:
log("开始查找 [我]");

✅ 总结:删除外部的 timeout = 5000,改用函数内判断 typeof timeout === 'undefined' 来设置默认值,你的代码就能正常运行。

ℹ️ 本回答由 AI 生成,内容仅供参考