# Монитор интерфейса

Монитор используется для отслеживания изменений в интерфейсе в реальном времени и выполнения предопределенных действий, таких как клики по элементам, нажатия клавиш или подсчет событий, при выполнении заданных условий. Вы можете представить это как базовую реализацию функций, подобных **Li Tiaotiao** (приложение для автоматического пропуска рекламы). Поскольку эта функция автоматически выполняет клики или нажатия клавиш, при необходимости ручного вмешательства могут произойти непредвиденные действия, поэтому используйте ее с осторожностью.

```{tip}
Как правило, монитор и регистрация событий должны выполняться в самом начале скрипта, и обычно не повторяются в процессе его выполнения.
```

## Включение монитора

Следующий интерфейс включает монитор интерфейса. По умолчанию монитор отключен.

```{attention}
Любые действия, соответствующие событиям, произошедшим на экране до включения монитора или события мониторинга, не будут обработаны!
```

```python
d.set_watcher_loop_enabled(True)
```

## Получение статуса монитора

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

```python
d.get_watcher_loop_enabled()
```

## Отключение монитора

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

```python
d.set_watcher_loop_enabled(False)
```

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

## Удаление всех мониторов

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

```python
d.remove_all_watchers()
```

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

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

```{attention}
Любые действия, соответствующие событиям, произошедшим на экране до включения монитора или события мониторинга, не будут обработаны!
```

```python
d.register_click_target_selector_watcher("ClickAcceptWhenShowAggrement", [Selector(textContains="Пользовательское соглашение")], Selector(textContains="Согласен", clickable=True))
```

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

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

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

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

```{attention}
Любые действия, соответствующие событиям, произошедшим на экране до включения монитора или события мониторинга, не будут обработаны!
```

```python
d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(textContains="Личный кабинет")], Keys.KEY_HOME)
```

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

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

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

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

```{attention}
Любые действия, соответствующие событиям, произошедшим на экране до включения монитора или события мониторинга, не будут обработаны!
```

```python
d.register_none_op_watcher("RecordElementAppearTimes", [Selector(textContains="OK")])
```

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

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

```python
d.get_watcher_triggered_count("RecordElementAppearTimes")
```

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

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

```{attention}
Любые действия, соответствующие событиям, произошедшим на экране до включения монитора или события мониторинга, не будут обработаны!
```

```python
d.set_watcher_enabled("RecordElementAppearTimes", True)
```


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

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

```{attention}
Любые действия, соответствующие событиям, произошедшим на экране до включения монитора или события мониторинга, не будут обработаны!
```

```python
d.set_watcher_enabled("RecordElementAppearTimes", False)
```

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

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

```python
d.remove_watcher(name)
```

## Получение статуса события

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

```python
d.get_watcher_enabled(name)
```

## Продвинутые селекторы

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

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

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

Ниже приведен пример блока кода, который включает цикл монитора и регистрирует три типа событий мониторинга. Когда на экране появляется текст "Пользовательское соглашение", автоматически нажимается кнопка "Согласен". Когда появляется текст "Личный кабинет", происходит немедленный возврат на главный экран. Когда появляется текст "OK", регистрируется количество появлений этого экрана.

```{attention}
Любые действия, соответствующие событиям, произошедшим на экране до включения монитора или события мониторинга, не будут обработаны!
```

```python
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="OK")])

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