Как можно использовать 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(), даже если кнопка не существует на экране). Я думал написать обработчик, но кажется излишним.

Что я делаю не так и как лучше всего долго ждать такого визуального события?


person sakatc    schedule 25.07.2012    source источник
comment
Почему вы автоматизируете веб-сайты с помощью sikuli? Для этого есть лучшие инструменты, такие как Selenium или Watir.   -  person Željko Filipin    schedule 26.07.2012
comment
Инструменты @ŽeljkoFilipin, такие как Selenium (функциональное тестирование), хороши. Но это не только добавляет ценности, но и дает больше качества, повышает производительность, когда тестирование на основе графического интерфейса, такое как sikuli, дополняется функциональным тестированием или без него.   -  person Sree Rama    schedule 07.11.2013


Ответы (4)


Другие мысли для вас...

 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))

Ссылки:

person spearson    schedule 26.07.2012
comment
Действительно ли это хороший подход с использованием while(1)? У меня работает впервые. Я понимаю, что лучше применить: Наблюдение за визуальными событиями в регионе, предложенное @Alessandro Da Rugna. doc.sikuli.org/region.html?highlight=observ#Region. наблюдать - person Sree Rama; 07.11.2013

Может быть, Сикули распознает что-то, похожее на вашу кнопку, и попытается нажать на нее. Если вы щелкните правой кнопкой мыши в 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/

Я думаю, вы можете просто настроить свои обработчики и пойти с

наблюдать (НАВСЕГДА)

person Alessandro Da Rugna    schedule 26.07.2012
comment
Демо-версия Angry Birds — действительно отличный аналог этой проблемы. - person spearson; 26.07.2012

Если вы хотите, чтобы сикули делал что-то, пока вы ждете изображения, я бы использовал методы 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 продолжает выполнение после слов, поэтому он сканирует во время работы. при появлении указанного изображения он перейдет к функции, которую вы указали в качестве второго параметра onAppear.

person switch201    schedule 04.03.2015

У меня такая же проблема, как описано. Дело не в том, чтобы ждать вечно. И Observe тоже не сработает, потому что он смотрит вечно. Подумайте о желании проверить событие только в течение определенного периода времени, скажем, 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.. Должно быть короче.

person roguecode    schedule 01.01.2018