【问题标题】:Fix the find failed issue in sikuli script修复 sikuli 脚本中查找失败的问题
【发布时间】:2021-08-12 19:57:23
【问题描述】:

我的以下代码在找不到 end_turn 图像时总是返回 findfailed 错误。

def clickCards():
    # region.wait(end_turn,90)
    # search for the cards and click all of them
    if exists(zero):
        z = region.findAll(zero)
        for i in z:
            click(i)
            sleep(1)
    else:
        pass
                     
    if exists(one): 
        o = region.findAll(one)
        for i in o:
            click(i)
            sleep(1)
    else:
        pass

    click(end_turn)

while exists(level):
    
    with region:
        
        if exists(end_turn):
            clickCards()
        elif exists(victory):
           click(victory)
        else:
            wait(end_turn,90)

我正在尝试自动化以下游戏视觉效果:

  • 纸牌游戏开始
  • 在结束按钮可用时点击卡片
  • 用结束转弯按钮结束转弯
  • 继续玩直到我赢
  • 胜利出现,不再可见结束回合按钮
  • 点击胜利图片

脚本会运行,但当我获胜时,它会出现找不到end_turn 按钮的错误。

错误信息:

[error] script [ axieTest ] stopped with error at line --unknown--
[error] Error caused by: Traceback (most recent call last): File "C:\Users\Mortada\Desktop\axieTest.sikuli\axieTest.py", line 47, in <module> wait(end_turn,90) File "C:\Users\Mortada\AppData\Roaming\Sikulix\Lib\sikuli\Sikuli.py", line 69, in wait return SCREEN.wait(target, timeout) Line 2761, in file Region.java 
at org.sikuli.script.Region.wait(Region.java:2761)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
org.sikuli.script.FindFailed: FindFailed: end_turn.png: (129x48) seen at (1439, 676) with 1.00 in R[322,156 1278x763]@S(0) E:Y, T:3.0 Line 2761, in file Region.java 

【问题讨论】:

  • @mkrieger1 实际上是 end_turn 和所有其他变量都被定义为 sikuli 中的快照,这就是为什么我没有将它们包含在代码中的原因。
  • 显然这没有像你预期的那样工作。
  • @mkrieger1 确切地说,我想知道为什么我的 if 语句在找不到 end_turn 后不起作用,它应该寻找胜利图像,否则它应该等待 end_turn 图像出现。但是在找不到 end_turn 图像后失败。
  • 能否请您显示准确且完整的错误消息以及您收到的回溯信息?
  • @mkrieger1 错误日志添加,似乎我的代码逻辑不正确,因为代码执行 else 语句并且它没有找到它破坏的元素

标签: python python-3.x sikuli sikuli-x


【解决方案1】:

我遇到了类似的问题。幸运的是,在这种情况下,文档很好。 https://sikulix-2014.readthedocs.io/en/latest/region.html#exceptionfindfailed

根据设计,region.findAll() 在找不到匹配项(隐式或显式)时会引发FindFailed 异常。在您的情况下,我认为它是 click() 操作期间的隐式调用。

幸运的是,Sikuli 让一个人切换这个例外,从而提供了一条出路。

您可以使用setThrowException() 为某个区域切换此例外。

def clickCards():
# region.wait(end_turn,90)
# search for the cards and click all of them
region.setThrowException(False)
if exists(zero):
    z = region.findAll(zero)
    for i in z:
        click(i)
        sleep(1)
else:
    pass
                 
if exists(one): 
    o = region.findAll(one)
    for i in o:
        click(i)
        sleep(1)
else:
    pass

click(end_turn)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-15
    • 2018-05-18
    • 2019-12-10
    • 2019-12-03
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多