Основные операции автоматизации¶
В этой главе описываются основные функции автоматизации, предоставляемые 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
Получение информации о службе¶
Получение информации о текущей службе, такой как версия, уникальный ID устройства, версия, ABI и т.д.
d.server_info()
>>> d.server_info( )
uniqueId: "673abbe0-ff7b-9d82-1792-8876cb72cf56"
version: "8.28"
architecture: "arm64-v8a"
uptime: 293
secure: True
>>> 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). Предположим, что текущий экран находится в портретной ориентации с разрешением 1080x1920. Чтобы сделать снимок всей области экрана, вы можете сделать следующее.
d.screenshot(60, bound=Bound(top=0, left=0, right=1080, bottom=1920)).save("screenshot.png")
Это создаст полноэкранный снимок, что, конечно, излишне, так как по умолчанию снимок делается на весь экран. Если мы хотим сделать снимок области 200x200 в верхнем левом углу, это тоже очень просто. Вам нужно сделать следующее.
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 в правом нижнем углу экрана. Вам нужно просто вызвать интерфейс следующим образом.
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))
Нажатие и перетаскивание из точки A в точку B¶
С помощью следующего интерфейса можно перетащить объект из точки A в точку B, например, перетащить иконку в папку.
A = Point(x=100, y=100)
B = Point(x=500, y=500)
d.drag(A, B)
Свайп от точки A к точке B¶
С помощью следующего интерфейса можно выполнить свайп от координат 100x100 до 500x500 на экране.
A = Point(x=100, y=100)
B = Point(x=500, y=500)
d.swipe(A, B)
Более сложный свайп по нескольким точкам¶
Следующий интерфейс может имитировать свайп по нескольким точкам. Например, следующий вызов выполнит свайп от 100x100 к 500x500, а затем вернется к 200x200. В приведенном ниже примере используется только три точки, но на самом деле вы можете указать больше точек и даже реализовать разблокировку графическим ключом.
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 означает ожидание в течение 5 секунд (1000 миллисекунд в секунде).
d.wait_for_idle(5*1000)
Получение последнего Toast-уведомления¶
Вы можете выполнить следующий вызов, чтобы получить последнее Toast-уведомление в системе. Однако следует отметить, что поддерживаются только Toast-уведомления, отправленные через системный API. Сообщения, реализованные сторонними библиотеками и имитирующие Toast UI, получить нельзя.
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)
Вы уже в режиме разработчика, это действие не требуется.