You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SikuliX IDE中if/else循环触发FindFailed错误原因排查

SikuliX脚本触发FindFailed错误的排查与修复

错误原因分析

  • setFindFailedResponse(RETRY) 仅对主动调用find()/click()等会抛出异常的方法生效,你用exists()做判断时,exists()默认超时后返回None不会触发重试逻辑,但后续region.click("xxx.png")如果此时图片因界面瞬间变化消失,就会直接抛出FindFailed异常导致脚本崩溃。
  • 每次循环重复设置Settings.ObserveScanRate = 1、setAutoWaitTimeout(0)等全局配置,可能引发扫描机制冲突,尤其是setAutoWaitTimeout(0)会让所有操作等待时间变为0,没有缓冲空间应对界面加载延迟。
  • 滚动操作type(Key.DOWN)依赖窗口焦点,若约会APP运行中失去焦点,滚动无效后指定区域永远找不到目标图片,最终触发异常。

修复方案

方案1:优化点击逻辑,避免二次查找异常

while True:
    # 全局配置移到循环外,避免重复初始化
    Settings.ObserveScanRate = 0.5  # 降低扫描频率,减少误判
    setAutoWaitTimeout(2)  # 给界面响应留缓冲时间
    setFindFailedResponse(RETRY)
    
    region = Region(1710,270,210,637)
    # 显式设置超时时间,找到目标后直接用对象点击
    target = region.exists("1704231969599.png", 2)
    if target:
        target.click()
    else:
        for _ in range(10):
            # 可选:先激活APP窗口,避免焦点丢失
            # App.focus("你的约会APP窗口标题")
            type(Key.DOWN)

方案2:捕获异常,保证循环不中断

from sikuli import FindFailed

while True:
    Settings.ObserveScanRate = 1
    setAutoWaitTimeout(0)
    setFindFailedResponse(RETRY)
    region = Region(1710,270,210,637)
    try:
        if region.exists("1704231969599.png"):
            region.click("1704231969599.png")
        else:
            for _ in range(10):
                type(Key.DOWN)
    except FindFailed:
        # 捕获异常后跳过当前循环,继续执行
        continue

额外优化建议

  • 全局配置类操作(Settings、超时设置)移到循环外部,减少资源消耗。
  • 滚动前强制激活APP窗口,避免焦点丢失导致滚动无效。
  • 适当降低Settings.ObserveScanRate值,过高的扫描频率易引发界面识别不稳定。

内容的提问来源于stack exchange,提问作者Александр Анохин

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:38:26