# Основные операции автоматизации

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

## Получение информации об устройстве

Получение информации о текущем устройстве, такой как имя устройства, размер экрана, ориентация экрана, текущее приложение и т.д.

```python
d.device_info()
```

```python
>>> d.device_info()
productName: "bumblebee"
sdkInt: 34
displayHeight: 2400
displaySizeDpX: 411
displaySizeDpY: 914
displayWidth: 1080
screenOn: true
naturalOrientation: true
currentPackageName: "com.android.launcher3"
```

```python
>>> result = d.device_info()
>>> print (result.displayWidth)
1080
```

## Получение информации о службе

Получение информации о текущей службе, такой как версия, уникальный ID устройства, версия, ABI и т.д.

```python
d.server_info()
```

```python
>>> d.server_info( )
uniqueId: "673abbe0-ff7b-9d82-1792-8876cb72cf56"
version: "8.28"
architecture: "arm64-v8a"
uptime: 293
secure: True
```

```python
>>> result = d.server_info()
>>> print (result.secure)
False
```

## Выключение экрана

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

```python
d.sleep()
```

## Включение экрана

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

```python
d.wake_up()
```

## Проверка, включен ли экран

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

```python
d.is_screen_on()
```

## Проверка, заблокирован ли экран

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

```python
d.is_screen_locked()
```

## Отображение Toast-уведомления

Вы можете использовать следующий интерфейс для отображения Toast-уведомления с сообщением `Hello from Lamda!` на экране телефона.

```python
d.show_toast("Hello from Lamda!")
```

## Чтение из буфера обмена

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

```python
d.get_clipboard()
```

## Запись в буфер обмена

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

```python
d.set_clipboard("Содержимое буфера обмена")
```

## Физические кнопки

Вы можете использовать следующие методы для имитации нажатия клавиш. Поддерживается более десяти клавиш, таких как KEY_BACK, KEY_DOWN, KEY_HOME и другие.

```python
d.press_key(Keys.KEY_BACK)
d.press_key(Keys.KEY_CAMERA)
d.press_key(Keys.KEY_CENTER)
d.press_key(Keys.KEY_DELETE)
d.press_key(Keys.KEY_DOWN)
d.press_key(Keys.KEY_ENTER)
d.press_key(Keys.KEY_HOME)
d.press_key(Keys.KEY_LEFT)
d.press_key(Keys.KEY_MENU)
d.press_key(Keys.KEY_POWER)
d.press_key(Keys.KEY_RECENT)
d.press_key(Keys.KEY_RIGHT)
d.press_key(Keys.KEY_SEARCH)
d.press_key(Keys.KEY_UP)
d.press_key(Keys.KEY_VOLUME_DOWN)
d.press_key(Keys.KEY_VOLUME_MUTE)
d.press_key(Keys.KEY_VOLUME_UP)
```

Для поддержки большего количества клавиш можно также использовать этот метод. Вы можете найти все поддерживаемые имена клавиш в официальной документации Android по этой ссылке: [https://developer.android.com/reference/android/view/KeyEvent](https://developer.android.com/reference/android/view/KeyEvent#KEYCODE_0).

```python
d.press_keycode(KeyCodes.KEYCODE_CALL)
```

## Снимок экрана

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

```python
d.screenshot(60).save("screenshot.png")
```

```python
>>> result = d.screenshot(60)
>>> result
<lamda.types.BytesIO object at 0x7a28361d60>
>>> result.save("screenshot.png")
52917
>>> result.getvalue( )
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01....'
```

В настоящее время мы также поддерживаем создание снимков области и элементов. Снимки элементов не рассматриваются в этой главе. Здесь мы познакомим вас со снимками области. Вам необходимо понимать концепцию и определение области. В нашем интерфейсе область определяется как `Bound` и включает четыре параметра: top, left, right, bottom. Координатная система экрана Android отличается от обычной: верхний левый угол экрана является началом координат (x=0, y=0). Предположим, что текущий экран находится в портретной ориентации с разрешением 1080x1920. Чтобы сделать снимок всей области экрана, вы можете сделать следующее.

```python
d.screenshot(60, bound=Bound(top=0, left=0, right=1080, bottom=1920)).save("screenshot.png")
```

Это создаст полноэкранный снимок, что, конечно, излишне, так как по умолчанию снимок делается на весь экран. Если мы хотим сделать снимок области 200x200 в верхнем левом углу, это тоже очень просто. Вам нужно сделать следующее.

```python
d.screenshot(60, bound=Bound(top=0, left=0, right=200, bottom=200)).save("screenshot.png")
```

Теперь давайте объясним значение этих параметров. В параметрах `top` представляет собой отступ в пикселях от верхнего края по оси Y, `bottom` — отступ в пикселях от верхнего края по оси Y, а `left` и `right` — отступы в пикселях от левого края по оси X. При этом `top` всегда меньше `bottom`, а `left` всегда меньше `right`. Ниже мы продемонстрируем еще один пример: создание снимка области 200x200 в правом нижнем углу экрана. Вам нужно просто вызвать интерфейс следующим образом.

```python
d.screenshot(60, bound=Bound(top=1920-200, bottom=1920, left=1080-200, right=1080)).save("screenshot.png")
```

## Нажатие на точку на экране

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

```python
d.click(Point(x=100, y=100))
```

## Нажатие и перетаскивание из точки A в точку B

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

```python
A = Point(x=100, y=100)
B = Point(x=500, y=500)

d.drag(A, B)
```

## Свайп от точки A к точке B

С помощью следующего интерфейса можно выполнить свайп от координат 100x100 до 500x500 на экране.

```python
A = Point(x=100, y=100)
B = Point(x=500, y=500)

d.swipe(A, B)
```

## Более сложный свайп по нескольким точкам

Следующий интерфейс может имитировать свайп по нескольким точкам. Например, следующий вызов выполнит свайп от 100x100 к 500x500, а затем вернется к 200x200. В приведенном ниже примере используется только три точки, но на самом деле вы можете указать больше точек и даже реализовать разблокировку графическим ключом.

```python
p1 = Point(x=100, y=100)
p2 = Point(x=500, y=500)
p3 = Point(x=200, y=200)

d.swipe_points(p1, p2, p3)
```

## Открытие быстрых настроек

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

```python
d.open_quick_settings()
```

## Открытие панели уведомлений

Следующий вызов может открыть панель уведомлений на экране.

```python
d.open_notification()
```

## Получение иерархии представления страницы

Следующий вызов может получить XML-иерархию текущей страницы. Вы также можете самостоятельно разобрать ее для поддержки автоматизации с помощью XPath.

```python
d.dump_window_hierarchy()
```

```python
>>> result = d.dump_window_hierarchy()
>>> result
<lamda.types.BytesIO object at 0x7add660680>
>>> result.getvalue()
b'<?xml version=\'1.0\' encoding=\'UTF-8\' standalone=\'yes\' ?>\r\n<hierarchy rotation="0">\r\n  <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false"...
```

## Ожидание бездействия окна

Вы можете выполнить следующий вызов, чтобы дождаться, пока текущее окно перейдет в состояние бездействия, аналогично `implicitly_wait` в Selenium. Единица измерения параметра — миллисекунды, поэтому `5*1000` означает ожидание в течение 5 секунд (1000 миллисекунд в секунде).

```python
d.wait_for_idle(5*1000)
```

## Получение последнего Toast-уведомления

Вы можете выполнить следующий вызов, чтобы получить последнее Toast-уведомление в системе. Однако следует отметить, что поддерживаются только Toast-уведомления, отправленные через системный API. Сообщения, реализованные сторонними библиотеками и имитирующие Toast UI, получить нельзя.

```python
d.get_last_toast()
```

```python
>>> result = d.get_last_toast()
>>> print (result)
timestamp: 1700000000000
package: "com.android.settings"
message: "\346\202\250\345\267\262\345\244\204\344\272\216\345\274\200\345\217\221\350\200\205\346\250\241\345\274\217\357\274\214\346\227\240\351\234\200\350\277\233\350\241\214\346\255\244\346\223\215\344\275\234\343\200\202"
>>> print (result.message)
Вы уже в режиме разработчика, это действие не требуется.
```