Как заставить сикули ждать, пока указатель мыши не изменится с занятого на не занятый?

Я взаимодействую с приложением с графическим интерфейсом как локально, так и удаленно (через VPN). Когда я работаю с ним локально, большинство действий происходят довольно быстро, и мои сценарии сикули выполняются нормально. Однако, когда я работаю с ним удаленно, действия выполняются дольше.

То есть Sikuli может определить экран и элементы для ожидания, но курсор все еще «занят» (например, вращающийся круг в окнах). Это приводит к тому, что мои сценарии сикули ломаются при удаленной работе с приложением из-за увеличения «задержки» (не уверен, что это правильный термин для этого).

Например, если бы я сделал

wait(laggy_field.jpg)
click(laggy_field.jpg)
type("so laggy")

Сикули будет ждать laggy_field. Laggy_field появится, но курсор все еще будет занят. Однако сикули, похоже, не знает об этом, перемещает курсор на поле и щелкает поле. В результате фокус находится не на этом поле, потому что курсор был фактически занят/неактивен. Таким образом, команда type("so laggy") приводит к отправке ключей в никуда.

Если я поставлю произвольное время, например 30 секунд, для ожидания между командами ожидания и щелчка, сценарии будут «работать», но мне бы хотелось более элегантное решение. Похоже, что способность обнаруживать изменения в указателе мыши несколько отличается от дорожной карты Sikuli.


person JoeyC    schedule 10.02.2014    source источник


Ответы (3)


Не совсем уверен, в чем вопрос, но вот несколько предложений:

(1) Вы уверены, что ваш скрипт видит laggy_field?

wait(laggy_field.jpg)
hover(laggy_field.jpg)
click(laggy_field.jpg)
type("so laggy")

Если мышь не перемещается в поле laggy_field, вам необходимо увеличить время ожидания инструкции wait(). См. ниже, где я жду максимум 10 секунд на laggy_field.jpg

wait(laggy_field.jpg, 10)

(2) Если вы вставите произвольное время ожидания, сработает ли щелчок?

wait(laggy_field.jpg, 10)
hover(laggy_field.jpg)
wait(10)
click(laggy_field.jpg)
type("so laggy")

(3) Попробуйте заменить ожидание (10) на ожидание правильного указателя мыши (jpg, взятый из места наведения в поле с задержкой)?

wait(laggy_field.jpg, 10)
hover(laggy_field.jpg)
wait(laggy_not_busy_mouse.jpg, 10)
click(laggy_field.jpg)
type("so laggy")
person spearson    schedule 05.03.2014
comment
1) да, он видит поле, потому что туда перемещается курсор. И когда я не использую VPN (и, следовательно, курсор не слишком занят), ключи отправляются в laggy_field 2) да, произвольное количество времени (например, 30 секунд) будет работать - но я ищу более более надежное решение, чем это, иначе выполнение тестов займет ненужное количество времени, когда мне не нужно использовать VPN. 3) К сожалению, я не могу найти способ заставить сикули распознавать изменения указателя мыши. Это запрос на улучшение Sikuli, который поступит только в начале 2015 года. - person JoeyC; 09.03.2014
comment
Я обновлю свой вопрос, чтобы быть более ясным. Спасибо, что зашли :) - person JoeyC; 09.03.2014

Лучший способ избавиться от сбоя выполнения скрипта из-за задержки — дождаться определенного шаблона изображения, вы можете написать что-то вроде этого

пока не существует ('some_image.jpg'): подождите .. выполните следующий шаг

Примечание: этот метод ожидания не имеет параметра, после того как это условие выполнено, вам не нужно полагаться на явное указание времени с помощью сна (x) и т. д.

вам нужно будет идентифицировать конкретное изображение в вашем приложении, которое появляется до тех пор, пока выполнение следующего шага не будет выполнено. и, соответственно, вы можете использовать критерий зацикливания, пока он не существует в вашем скрипте sikuli.

person turmoilawaits    schedule 10.03.2014
comment
К сожалению, единственное, что меняется в пользовательском интерфейсе, — это указатель мыши. И, в конце концов, обнаружение изменений в указателе мыши находится в некотором отдалении (см. ссылку в конце моего вопроса для получения более подробной информации) - person JoeyC; 12.03.2014

Извините, что копаю могилу, но я придумал класс, чтобы сделать это проще. Он использует метод exact() для изменения алгоритма сопоставления с «нечеткого» на более точный алгоритм.

class Element:
    def __init__(self, element, region):
        self.element = element
        self.region = region

    def stateChanged(self):
        if self.region.exists(Pattern(self.element).exact()):
            return False
        return True

Использование:

gmailEmailField = Element("1458930208197.png", Region(438,239,388,342))

while not gmailEmailField.stateChanged():
    wait(.5)

Просто сделайте это с каждым элементом в вашем приложении, если оно перестанет отвечать на запросы. Таким образом, вы можете убедиться, что ваши элементы заполнены, или отследить, когда приложение снова станет отзывчивым, поскольку оно использует точное соответствие.

person RattleyCooper    schedule 25.03.2016