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,提问作者Александр Анохин
相关产品推荐
相关产品推荐

