Наблюдатель интерфейса

Наблюдатель используется для отслеживания изменений текущего экрана в реальном времени и при выполнении заданных условий выполняет заданные действия, такие как касание элемента, нажатие клавиш или подсчёт количества появлений. Его можно рассматривать как низкоуровневую реализацию функций, аналогичных Li Tiaotiao или другим инструментам автоматического пропуска рекламы. Поскольку эта функция автоматически выполняет касания или нажатия клавиш, при необходимости ручного вмешательства могут возникнуть непредвиденные действия, поэтому используйте её с осторожностью.

Совет

В нормальных условиях регистрация наблюдателей и событий должна выполняться в самом начале скрипта; во время выполнения она обычно больше не выполняется.

Включение наблюдателя

Следующий интерфейс включает наблюдатель интерфейса. По умолчанию только что зарегистрированный наблюдатель находится в отключённом/выключенном состоянии.

Внимание

Перед включением наблюдателя или событий наблюдения любые изменения на экране, соответствующие условиям наблюдения, не будут автоматически обрабатываться.

d.set_watcher_loop_enabled(True)

Проверка, включён ли наблюдатель

С помощью следующего интерфейса можно узнать, включён ли в данный момент наблюдатель интерфейса.

d.get_watcher_loop_enabled()

Отключение наблюдателя

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

d.set_watcher_loop_enabled(False)

Внимание

Регистрация слишком большого числа событий наблюдения может повлиять на производительность системы или оперативность выполнения операций.

Удаление всех наблюдателей

Удаляет все применённые события наблюдения. Это позволяет очистить правила, применённые ранее запущенными или аварийно завершёнными скриптами. Рекомендуется выполнять один раз перед каждым запуском скрипта, чтобы события, зарегистрированные предыдущим запуском или аварийно завершённым скриптом, не повлияли на текущий нормальный процесс обработки.

d.remove_all_watchers()

Получение всех наблюдателей

Возвращает все зарегистрированные наблюдатели, включая все состояния (включённые и отключённые наблюдатели).

>>> d.get_watchers()
[name: "ClickAcceptWhenShowAggrement"
, name: "PressBackWhenHomePageShows"
enabled: true
, name: "RecordElementAppearTimes"
enabled: true
]
>>> d.get_watchers()[0].enabled
False
>>>

Получение всех включённых наблюдателей

Возвращает все наблюдатели, находящиеся во включённом состоянии.

>>> d.get_enabled_watchers( )
[name: "PressBackWhenHomePageShows"
enabled: true
, name: "RecordElementAppearTimes"
enabled: true
]
>>> 

Регистрация события касания

Событие касания будет автоматически выполнять касание и другие действия при появлении на экране подходящего селектора, например автоматически пропускать всплывающие окна приложений: пользовательские соглашения, уведомления об обновлениях и т. п., а также автоматически нажимать на определённых экранах.

Внимание

Перед включением наблюдателя или событий наблюдения любые изменения на экране, соответствующие условиям наблюдения, не будут автоматически обрабатываться.

d.register_click_target_selector_watcher("ClickAcceptWhenShowAggrement", [Selector(textContains="用户协议")], Selector(textContains="同意", clickable=True))

Подсказка

Второй параметр поддерживает несколько Selector, что означает, что обработка события выполняется только при выполнении всех условий Selector.

После регистрации указанного события, когда на экране появляется элемент с текстом 用户协议 (пользовательское соглашение), будет автоматически нажата кнопка 同意 (согласиться).

Регистрация события нажатия клавиши

Событие нажатия клавиши будет автоматически выполнять нажатие клавиши при появлении на экране подходящего селектора, например автоматически возвращаться назад и т. п. Это позволяет автоматически избегать перехода на определённые экраны; конечно, того же можно добиться и с помощью события касания.

Внимание

Перед включением наблюдателя или событий наблюдения любые изменения на экране, соответствующие условиям наблюдения, не будут автоматически обрабатываться.

d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(textContains="个人中心")], Keys.KEY_HOME)

Подсказка

Второй параметр поддерживает несколько Selector, что означает, что обработка события выполняется только при выполнении всех условий Selector.

После регистрации указанного события, когда на экране появляется элемент с текстом 个人中心 (личный кабинет), будет автоматически нажата клавиша HOME телефона.

Регистрация события подсчёта

Событие подсчёта увеличивает счётчик на 1 при появлении на экране операции, соответствующей определённому селектору. Если на экране появляется важная информация, которая быстро исчезает, с помощью этой функции можно подсчитать, появлялся ли определённый экран и сколько раз.

Внимание

Перед включением наблюдателя или событий наблюдения любые изменения на экране, соответствующие условиям наблюдения, не будут автоматически обрабатываться.

d.register_none_op_watcher("RecordElementAppearTimes", [Selector(textContains="好的")])

Подсказка

Второй параметр поддерживает несколько Selector, что означает, что обработка события выполняется только при выполнении всех условий Selector.

Указанное выше событие записывает количество появлений экрана, содержащего текст 好的 (хорошо). Для получения количества срабатываний события подсчёта используйте следующий интерфейс.

d.get_watcher_triggered_count("RecordElementAppearTimes")

Включение события

После регистрации событие необходимо включить, чтобы оно было добавлено в цикл наблюдателя интерфейса, иначе оно не будет применяться.

Внимание

Перед включением наблюдателя или событий наблюдения любые изменения на экране, соответствующие условиям наблюдения, не будут автоматически обрабатываться.

d.set_watcher_enabled("RecordElementAppearTimes", True)

Отключение события

Вы можете вызвать следующий интерфейс, чтобы наблюдатель интерфейса перестал отслеживать определённое событие.

Внимание

Перед включением наблюдателя или событий наблюдения любые изменения на экране, соответствующие условиям наблюдения, не будут автоматически обрабатываться.

d.set_watcher_enabled("RecordElementAppearTimes", False)

Удаление события

Полностью удаляет событие из наблюдателя, а также удаляет его из списка зарегистрированных событий.

d.remove_watcher(name)

Проверка, включено ли событие

Вызовите следующий интерфейс, чтобы проверить, что событие правильно включено, и избежать ситуации, когда событие зарегистрировано, но не включено.

d.get_watcher_enabled(name)

Расширенные селекторы

Помимо простых селекторов, вы также можете использовать более сложные селекторы для сопоставления элементов. В следующем примере показано, как написать сложный селектор.

d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(resourceId="com.android.market:id/v_app_item").child(index=3).sibling(index=2).child(index=2).child()], Keys.KEY_HOME)

Полный пример кода

Ниже приведён пример блока кода, который включает цикл наблюдателя и регистрирует три события наблюдения. Когда на экране появляется текст, содержащий 用户协议 (пользовательское соглашение), автоматически нажимается кнопка 同意 (согласиться); когда появляется текст, содержащий 个人中心 (личный кабинет), выполняется немедленный возврат на рабочий стол; когда появляется текст, содержащий 好的 (хорошо), записывается количество появлений этого экрана.

Внимание

Перед включением наблюдателя или событий наблюдения любые изменения на экране, соответствующие условиям наблюдения, не будут автоматически обрабатываться.

d.remove_all_watchers()
d.set_watcher_loop_enabled(True)

d.register_click_target_selector_watcher("ClickAcceptWhenShowAggrement", [Selector(textContains="用户协议")],
                                         Selector(textContains="同意", clickable=True))
d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(textContains="个人中心")], Keys.KEY_HOME)
d.register_none_op_watcher("RecordElementAppearTimes", [Selector(textContains="好的")])

d.set_watcher_enabled("ClickAcceptWhenShowAggrement", True)
d.set_watcher_enabled("PressBackWhenHomePageShows", True)
d.set_watcher_enabled("RecordElementAppearTimes", True)