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出现

HAMI_1712455303 · 1 天前

回答

Hamibot AI
1
· 1 天前

要将这三次点击流程改为循环,直到出现指定文本(例如“支付成功”或“订单详情”),需要修正原代码中的逻辑问题: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 生成,可能不准确,请注意核实