Sikuli:for循环/if else语句不正常

1 投票
1 回答
11072 浏览
提问于 2025-04-18 15:56

我在Sikuli里有一段代码,用来执行复制和粘贴的任务。我希望当caption.png这个文件不存在的时候,能执行“if not exists”里面的操作。但是有时候即使这个文件确实不存在,它还是会去找,结果报错说“找不到caption.png”。

     for idx in range(1, 77):
         if not exists("caption.png"):
              click("1406907972716.png")
              type(Key.PAGE_DOWN)        
              print "skip" + str(idx)
         else: 
              click("caption.png")
              type(Key.F2)
              type("a", KeyModifier.CTRL)
              type("c", KeyModifier.CTRL)
              click("CLICKBOX-4.PNG")
              click("BOX2-4.PNG")
              type("a", KeyModifier.CTRL)
              type(Key.DELETE)
              type("v", KeyModifier.CTRL)
              type(str(idx))
              type(Key.HOME)
              for i in range(25):
                  type(Key.DELETE)
              click("1406907972716.png")
              type(Key.PAGE_DOWN)

我试了下面的代码,它是有效的,但还有其他地方不太正常:有时候它会随机跳过一个索引。我搞不清楚为什么会这样。

    for idx in range(1, 77):
        if not exists("caption.png"):
            click("1406907972716.png")
            type(Key.PAGE_DOWN)        
            print "skip" + str(idx)
        else: 
            if exists("caption.png"):
                click("caption.png")
                type(Key.F2)
                type("a", KeyModifier.CTRL)
                type("c", KeyModifier.CTRL)
                click("CLICKBOX-4.PNG")
                click("BOX2-4.PNG")
                type("a", KeyModifier.CTRL)
                type(Key.DELETE)
                type("v", KeyModifier.CTRL)
                type(str(idx))
                type(Key.HOME)
                for i in range(25):
                    type(Key.DELETE)
                click("1406907972716.png")
                type(Key.PAGE_DOWN)

1 个回答

0

你是在sikuli-IDE里尝试做这个吗?这里的问题是,有时候它不会提供很好的错误追踪信息。

在你的第二个例子中,你似乎完全跳过了一个索引,可能是因为没有找到标题,所以什么都没执行,直接跳到下一个循环。这就导致了这个循环没有输出,因为所有的代码都在一个条件判断里,而这个判断是用来重新检查已经确定存在的东西。

我觉得第一个部分的问题是你没有找到匹配项,然后在调用click()时失败了(而错误追踪信息也没什么帮助)。exists()会返回一个匹配项,同时也会为getLastMatch()设置值。你可以尝试用exists()返回的匹配项设置一个局部变量,或者在else语句中使用getLastMatch().click()来点击找到的区域(大概就是你的“caption.png”)。

你也可以尝试在exists()这一行指定一个等待时间。

最后,你可以尝试把每个图片设置为一个模式,并使用相似度来缩小结果到一个单一的匹配项。

没有截图或关于屏幕上显示内容的信息,很难给出明确的答案,也不知道屏幕上可能有多少个相同的图片。我现在不能评论,但如果你能提供更多信息,我可以修改这个回答,给出更具体的解答。

撰写回答