Базовая автоматизация¶
В этой главе описываются базовые функции автоматизации, предоставляемые FIRERPA. Более продвинутые функции будут описаны в последующих главах. Здесь представлены некоторые часто используемые базовые интерфейсы.
Получение информации об устройстве¶
Получите информацию о текущем устройстве: имя устройства, размер экрана, ориентацию экрана, текущее приложение и другие сведения.
d.device_info()
>>> d.device_info()
productName: "bumblebee"
sdkInt: 34
displayHeight: 2400
displaySizeDpX: 411
displaySizeDpY: 914
displayWidth: 1080
screenOn: true
naturalOrientation: true
currentPackageName: "com.android.launcher3"
>>> result = d.device_info()
>>> print (result.displayWidth)
1080
Получение информации о сервисе¶
Получите информацию о текущей версии сервиса, уникальном идентификаторе устройства, ABI и другие сведения.
d.server_info()
>>> d.server_info()
uniqueId: "673abbe0-ff7b-9d82-1792-8876cb72cf56"
version: "9.25"
architecture: "arm64-v8a"
uptime: 293
secure: false
Примечание
Значения полей version, secure и других следует смотреть в фактическом выводе d.server_info(). Если сертификат сервиса не включён, secure обычно равен false.
>>> result = d.server_info()
>>> print (result.secure)
False
Выключение экрана¶
Следующий интерфейс выключает экран текущего телефона. Это эквивалентно однократному нажатию кнопки питания при включённом экране.
d.sleep()
Включение экрана¶
Следующий интерфейс включает экран текущего телефона. Это эквивалентно однократному нажатию кнопки питания при выключенном экране.
d.wake_up()
Включён ли экран¶
С помощью следующего интерфейса можно проверить, включён ли экран текущего устройства, чтобы определить, можно ли с ним работать.
d.is_screen_on()
Заблокирован ли экран¶
С помощью следующего интерфейса можно проверить, заблокирован ли экран текущего устройства, чтобы определить, можно ли с ним работать.
d.is_screen_locked()
Показ Toast¶
Вы можете использовать следующий интерфейс, чтобы показать на экране телефона Toast-сообщение Hello from Lamda!.
d.show_toast("Hello from Lamda!")
Чтение буфера обмена¶
Следующий интерфейс используется для чтения текущего содержимого буфера обмена телефона. Android 10+ временно не поддерживается.
d.get_clipboard()
Запись в буфер обмена¶
Следующий интерфейс используется для записи содержимого в буфер обмена текущего устройства.
d.set_clipboard("Содержимое буфера обмена")
Аппаратные кнопки¶
Вы можете использовать следующий метод для имитации нажатия кнопок. Поддерживается более десяти кнопок, таких как KEY_BACK, KEY_DOWN, KEY_HOME и другие.
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.
d.press_keycode(KeyCodes.KEYCODE_CALL)
Снимок экрана¶
Мы предоставляем метод создания снимков экрана, чтобы вы могли записывать процесс или выполнять распознавание изображений. В следующем примере показано, как сделать снимок с качеством 60 и сохранить его в файл screenshot.png в текущем каталоге.
d.screenshot(60).save("screenshot.png")
>>> 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. Предположим, текущий экран портретный, разрешение 1080×1920. Тогда, если нужно сделать снимок всей области экрана, можно сделать так:
d.screenshot(60, bound=Bound(top=0, left=0, right=1080, bottom=1920)).save("screenshot.png")
Это создаст полноэкранный снимок, хотя в этом нет необходимости, потому что по умолчанию и так создаётся полноэкранный снимок. А если мы хотим сделать снимок изображения 200×200 в левом верхнем углу, как поступить? Это тоже просто:
d.screenshot(60, bound=Bound(top=0, left=0, right=200, bottom=200)).save("screenshot.png")
Здесь необходимо объяснить смысл этих параметров: top означает смещение вниз по оси Y на top пикселей, bottom — смещение вниз по оси Y на bottom пикселей, left и right — смещение вправо по оси X на соответствующее число пикселей. При этом top всегда меньше bottom, а left всегда меньше right. Теперь продемонстрируем ещё один пример: чтобы сделать снимок изображения 200×200 в правом нижнем углу экрана, достаточно вызвать интерфейс следующим образом:
d.screenshot(60, bound=Bound(top=1920-200, bottom=1920, left=1080-200, right=1080)).save("screenshot.png")
Нажатие на точку на экране¶
Вы можете имитировать нажатие на экран с помощью следующего интерфейса — нажать на точку с координатами (100, 100) на экране.
d.click(Point(x=100, y=100))
Длинное нажатие на точку на экране¶
Вы можете имитировать длинное нажатие на экран с помощью следующего интерфейса — нажать на точку с координатами (100, 100) на экране и отпустить через три секунды.
d.long_click(Point(x=100, y=100), timeout=1000*3) # 3 с, 0 — длительность по умолчанию
Перетаскивание объекта из точки A в точку B¶
С помощью следующего интерфейса можно перетащить объект из точки A в точку B, например, переместить значок в папку и т. п.
A = Point(x=100, y=100)
B = Point(x=500, y=500)
d.drag(A, B)
Смахивание из точки A в точку B¶
С помощью следующего интерфейса можно выполнить смахивание от координат экрана (100, 100) к (500, 500).
A = Point(x=100, y=100)
B = Point(x=500, y=500)
d.swipe(A, B)
Более сложное многоточечное смахивание¶
Следующий интерфейс позволяет имитировать многоточечное смахивание. Например, вызов ниже выполняет смахивание из (100, 100) в (500, 500) и возврат в (200, 200). В демонстрации ниже используется только три точки, но на самом деле вы можете передать больше точек и даже реализовать разблокировку по графическому ключу 3×3.
p1 = Point(x=100, y=100)
p2 = Point(x=500, y=500)
p3 = Point(x=200, y=200)
d.swipe_points(p1, p2, p3)
Открытие быстрых настроек¶
Следующий вызов открывает панель быстрых настроек, но раскрывает её лишь наполовину (полуоткрытое состояние).
d.open_quick_settings()
Открытие панели уведомлений¶
Следующий вызов открывает панель уведомлений на экране.
d.open_notification()
Получение макета страницы¶
Следующий вызов позволяет получить XML-макет текущей страницы. Вы также можете самостоятельно разобрать его, чтобы поддерживать автоматизацию через XPath.
d.dump_window_hierarchy()
>>> 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 означает ожидание 5000 миллисекунд (то есть 5 секунд).
d.wait_for_idle(5*1000)
Получение последнего Toast¶
Вы можете выполнить следующий вызов, чтобы получить последнее Toast-сообщение в системе. Обратите внимание: поддерживаются только Toast-сообщения, отправленные через системный API. Toast-подобные сообщения, реализованные сторонними приложениями, получить невозможно.
d.get_last_toast()
>>> 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)
Вы уже находитесь в режиме разработчика, выполнять это действие не нужно.