1打开猫眼app
2判断立即预订是否出现
if(className("android.widget.TextView").text("立即预订").exists()){
如果有
className("android.widget.TextView").text("立即预订").waitFor()
如果没有,等待控件出现
className("android.widget.TextView").text("立即预订").waitFor()
点击
className("android.widget.TextView").text("立即预订").waitFor()
}
点击
className("android.widget.TextView").text("确认").findOne().click()
点击
className("android.widget.TextView").text("立即支付").findOne().click()
怎么将3次点击流程改成循环,直到下个text出现
回答
要将这三次点击流程改为循环,直到出现指定文本(例如“支付成功”或“订单详情”),需要修正原代码中的逻辑问题:waitFor() 无超时参数会永久阻塞线程;多次重复调用 waitFor() 属于冗余逻辑;缺少明确的循环终止条件。
以下是符合 Hamibot 运行环境(Rhino 1.7.15)的优化实现:
// 文档地址 https://docs.hamibot.com/
// 设置循环终止的目标文本,请根据实际页面修改
var targetText = "支付成功";
var timeout = 5000; // 单个控件最大等待时间(毫秒)
var maxLoops = 10; // 最大循环次数,防止死循环
var loopCount = 0;
while (loopCount < maxLoops) {
// 1. 优先检查是否已到达目标页面
if (className("android.widget.TextView").text(targetText).exists()) {
log("已检测到目标文本:" + targetText + ",流程结束");
break;
}
// 2. 依次等待并点击控件(使用 findOne(timeout) 避免无限阻塞)
var btn1 = className("android.widget.TextView").text("立即预订").findOne(timeout);
if (btn1) { btn1.click(); sleep(1000); }
var btn2 = className("android.widget.TextView").text("确认").findOne(timeout);
if (btn2) { btn2.click(); sleep(1000); }
var btn3 = className("android.widget.TextView").text("立即支付").findOne(timeout);
if (btn3) { btn3.click(); sleep(1000); }
loopCount++;
log("当前循环次数:" + loopCount);
}
if (loopCount >= maxLoops) {
log("达到最大循环次数,自动退出以防卡死");
}
核心改进说明:
findOne(timeout)替代waitFor():带超时参数的查找会在指定时间内未找到控件时返回null,不会挂起脚本,便于流程控制。- 每次点击后加入
sleep(1000):为页面跳转、网络请求或动画渲染留出缓冲时间,显著提升点击成功率。 - 双重退出机制:通过
targetText判断业务终点,通过maxLoops防止因网络异常或UI未加载导致的死循环。 - 逻辑顺序优化:先判断目标文本是否存在,再执行点击序列,避免在目标页面重复触发点击。
最佳实践建议:
- 若三个按钮并非严格按顺序出现,可将文本放入数组遍历,或根据实际页面层级调整判断逻辑。
- 优先使用
id()或desc()定位控件,比className().text()更稳定且执行效率更高。 - 复杂自动化流程建议包裹
try...catch并记录关键节点日志,便于异常排查。 - 避免在循环中频繁调用
exists()或findOne()无参版本,始终携带超时参数。
如需根据实际页面的控件特征(如固定ID、特定父节点结构)进一步精简或增加重试策略,可提供具体控件信息,我将为你调整代码。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实