while(true){
console.log("====")
try{text("确定").findOne().click()}catch(e){console.log(e)}
try{text("确认信息并支付").findOne().click()}catch(e){console.log(e)}
try{text("就是这家").findOne().click()}catch(e){console.log(e)}
try{text("我知道了").findOne().click()}catch(e){console.log(e)}
if(text('确认无误').exists()){
try{className("android.widget.TextView").text('确认无误').findOne().click()}catch(e){console.log(e)}
detectWechatPay()
}
}; 执行第二遍程序卡主了不执行了
回答
文档地址 https://docs.hamibot.com/
在你的代码中存在以下潜在问题:
-
高频循环阻塞:while(true)循环没有延时,会导致脚本以最大频率执行点击操作,可能触发应用防刷机制或导致UI线程过载。
-
上下文依赖风险:当页面跳转时(如进入支付页面),原有控件可能已失效,后续操作会持续失败但未跳出循环。
-
函数嵌套隐患:
detectWechatPay()
函数内部若存在阻塞操作(如无限等待支付结果),会导致主循环停滞。
优化方案
while(true){
console.log("====")
// 添加循环间隔,避免高频触发
sleep(1000);
// 优化控件查找逻辑,增加超时机制
var confirm = text("确定").findOne(1000);
if(confirm && confirm.clickable()) confirm.click();
var payBtn = text("确认信息并支付").findOne(1000);
if(payBtn && payBtn.clickable()) payBtn.click();
// 使用组合条件判断减少误触
var thisStore = text("就是这家").findOnce();
if(thisStore && thisStore.bounds().height() > 0) thisStore.click();
// 异常处理标准化
try{
className("android.widget.Button").text("我知道了").findOne(500).click();
}catch(e){
// 记录具体错误
console.error("跳过按钮异常: " + e.message);
}
// 支付检测逻辑优化
if(text('确认无误').exists()){
clickConfirmAndHandlePay();
}
}
// 提取独立函数增强可维护性
function clickConfirmAndHandlePay(){
try{
className("android.widget.TextView").text('确认无误').findOne(500).click();
// 启动独立线程处理支付检测
threads.start(function(){
// 设置最大等待时间(10秒)
var payResult = detectWechatPay(10000);
console.log("支付检测结果: " + (payResult ? "成功" : "超时"));
});
}catch(e){
console.error("确认操作失败: " + e.message);
}
}
关键改进点
-
增加
sleep()
间隔:每轮循环强制暂停1秒,降低资源消耗 -
控件存在性检查:
- 使用
findOne(timeout)
设置查找超时时间 - 添加
clickable()
和bounds()
检查防止无效点击
- 使用
-
支付检测多线程化:
// 为detectWechatPay添加超时参数 function detectWechatPay(timeoutMs){ var startTime = new Date().getTime(); while(new Date().getTime() - startTime < timeoutMs){ if(text("支付成功").exists()){ return true; // 检测到支付成功 } sleep(500); // 降低检测频率 } return false; // 超时返回 }
-
错误分类处理:
- 记录具体错误类型(如
clickable()
为 false 时) - 不同环节的异常单独捕获
- 记录具体错误类型(如
建议在实际运行时监控控制台日志,定位具体卡顿环节。如果问题仍然存在,请提供卡顿时的界面截图和日志输出。