如何使用Sikuli长时间等待按钮,中间可能还有一些维护任务?

时间:2012-07-25 18:07:49

标签: automation wait sikuli

我有一个网页,我正在等待按钮出现,当它出现时我想点击它。该按钮位于计时器上,可能需要一个小时才能显示。此外,如果按钮的显示时间超过一定时间,我想移动鼠标(否则网站会自动将我注销)。

所以,等待按钮出现我设计了这个Sikuli脚本:

button = "button.png"

while(1):
    if exists(button):
        print("found it")
        click(button)
        break
    else:
        print("wait longer")
        wait(button,30*60)
        # do a regular task

print "all done!"

以上似乎不起作用。如果按钮在屏幕上,脚本将找到它...但是,如果它必须等待它将只是快速超时FindFailed异常(在click()上,即使屏幕上不存在该按钮) 。我考虑过写一个处理程序,但看起来有些过分。

我做错了什么,等待这么长时间的视觉事件的最佳方法是什么?

4 个答案:

答案 0 :(得分:6)

其他一些想法...

 while(1):
 wait(Button, 30*60) # This will spinlock for 30 minutes for the button to appear
 if exists(Button):
     hover(Button) # Debug statement allowing user to see what Sikuli has matched to
     click (Button)
 else:
     mouseMove(Location(50,100))
     mouseMove(Location(50,200))

链接:

答案 1 :(得分:5)

也许Sikuli会识别看起来很像你的按钮的东西,并试图点击它。 如果右键单击IDE中的按钮模式,则可以微调公差级别以进行识别。尝试在按钮周围精确切割图像,并将值增加到更精确。

我建议你阅读本教程 http://doc.sikuli.org/tutorials/surveillance/surveillance.html
并设置一个事件处理程序来管理按钮出现时 http://doc.sikuli.org/region.html#Region.onAppear
http://doc.sikuli.org/region.html#observingvisualeventsinaregion
写的代码不多。

您可以在Sikuli的博客中获得完整源代码的好例子 http://sikuli.org/blog/2011/08/15/sikuli-plays-angry-birds-on-google-games/

我认为您可以设置处理程序并使用

  

观察(永远)

答案 2 :(得分:1)

如果你希望sikuli在你等待图像的时候做东西,我会使用onAppear(pic,function)和观察(FOREVER,true)方法,这就是它的工作原理

event = Sikuli.event

def function(event):
    click(yourButton.png)

onAppear(picYourWaitingFor.png, function)
observe(FOREVER, true)

基本上它的作用是onAppear会不断扫描屏幕上的picYourWaitingFor.png。 sikuli继续执行单词,因此它在工作时扫描。在所述pic的外观上,它将跳转到你放下的函数作为onAppear的第二个参数。

答案 3 :(得分:0)

我有同样的问题。它不是要永远等待。观察也不会起作用,因为那确实会永远观察。想想只在60秒内检查一段时间的事件。如果没有发生,继续前进。这可能发生在一系列特定的事件中。如果图像未在60秒内出现,请继续执行另一系列。

wait(image,60)

...如果没有找到图像,将在60秒后崩溃,这在我的情况下根本不是想要的。

所以我做了这样的事情:

attempt = 1
count=0
while attempt:
     if exists(image):
         attempt=0
     else:
        count=count+1
        if count>60:
          attempt=0
        else:
           wait(1)

可能是更好的方式而且没有给出确切的时间,但是方法不会使脚本崩溃。

你也可以试试:except it..应该更短。