Представляем вам библиотеку расширяющую возможности фреймворка Appium-Python-Client. С AppiumExtended вам будут доступны новые удобные функции и возможности, которые позволят более эффективно и легко автоматизировать ваши тесты. Позвольте вашим разработчикам сосредоточиться на более сложных задачах, а наша библиотека облегчит взаимодействие с Appium и сделает процесс автоматизации более приятным и эффективным. Дайте вашим тестам возможность раскрыть свой полный потенциал с помощью этого интуитивного расширения для Appium-Python-Client.
Вероятно библиотека не установится с первого раза, из за Pillow и его зависимости zlib. Попробуйте ввести команду:
pip cache purge
И повторить установку.
Для успешной установки и работы с AppiumExtended вам могут понадобиться некоторые системные зависимости.
Требуется установить Appium с плагинами: appium-device-farm, appium-dashboard.
npm i -g appium@next
appium driver install uiautomator2
appium plugin install --source=npm appium-device-farm
appium plugin install --source=npm appium-dashboard
Существует три способа установки AppiumExtended.
-
Установка из PyPi, как 'AppiumExtended'.
pip install AppiumExtended
Историю выпусков можно посмотреть здесь
-
Установка исходного кода, через PyPi. Из 'AppiumExtended', скачайте и разархивируйте исходный архив (AppiumExtended-X.X.tar.gz).
tar -xvf AppiumExtended-X.X.tar.gz cd AppiumExtended-X.X python setup.py install
-
Установка исходного кода из GitHub.
git clone https://github.com/molokov-klim/appium_extended.git cd appium_extended python setup.py install
- connect
- disconnect
- is_running
- get_element
- find_and_get_element
- get_elements
- get_image_coordinates
- get_inner_image_coordinates
- get_many_coordinates_of_image
- get_text_coordinates
- get_screenshot_as_base64_decoded
- get_element_contains
- get_elements_contains
- is_element_within_screen
- is_text_on_screen
- is_image_on_the_screen
- tap
- swipe
- swipe_top_to_bottom
- swipe_bottom_to_top
- swipe_right_to_left
- swipe_left_to_right
- wait_for
- wait_for_not
- wait_return_true
- draw_by_coordinates
- input_by_virtual_keyboard
- get_element
- get_attributes
- click
- double_click
- click_and_move
- adb_tap
- adb_multi_tap
- adb_swipe
- tap
- double_tap
- tap_and_move
- get_elements
- scroll_down
- scroll_up
- scroll_to_bottom
- scroll_to_top
- scroll_until_find
- get_parent
- get_parents
- get_sibling
- get_siblings
- get_cousin
- get_cousins
- is_contains
- zoom
- unzoom
- get_center
- get_coordinates
- adb_shell
- push
- pull
- start_activity
- get_current_app_package
- close_app
- reboot_app
- uninstall_app
- is_app_installed
- press_home
- press_back
- press_menu
- input_keycode_num
- input_keycode
- input_by_virtual_keyboard
- input_text
- tap
- swipe
- check_vpn
- stop_logcat
- know_pid
- is_process_exist
- run_background_process
- kill_by_pid
- kill_all
- delete_files_from_internal_storage
- delete_file_from_internal_storage
- record_video
- stop_video
- reboot
- get_screen_resolution
- install_app
- is_app_installed
- uninstall_app
- get_device_model
- push
- pull
- start_activity
- close_app
- reboot_app
- press_home
- press_back
- press_menu
- input_keycode_num
- input_keycode
- input_by_virtual_keyboard
- input_text
- tap
- swipe
- get_current_app_package
- check_vpn
- stop_logcat
- reload_adb
- know_pid
- is_process_exist
- run_background_process
- kill_by_pid
- kill_by_name
- kill_all
- delete_files_from_internal_storage
- pull_video
- stop_video
- record_video
- reboot
- get_screen_resolution
Основной класс расширяющий Appium-Python-Client.
Метод connect
выполняет подключение к устройству на основе заданных возможностей или свойств, передаваемых в формате словаря.
capabilities
: Словарь, который содержит набор возможностей устройства, к которому производится подключение. Этот словарь может включать такие параметры, как имя устройства, версию операционной системы, путь к приложению и пр.
app = AppiumExtended()
capabilities_with_install = {
"platformName": "android",
"appium:automationName": "uiautomator2",
"appium:deviceName": device_model,
"appium:udid": device_uuid,
"appium:app": path_to_apk,
"appium:appPackage": package,
"appium:appWaitActivity": activity_launchable,
"appium: autoGrantPermissions": True,
}
capabilities_without_install = {
"platformName": "android",
"appium:automationName": "uiautomator2",
"appium:deviceName": device_model,
"appium:udid": device_uuid,
"appium:noReset": True,
"appium: autoGrantPermissions": True,
}
app.connect(capabilities=self.capabilities_without_install)
Метод включает следующие основные этапы:
- Сохранение переданных возможностей в свойстве объекта
self.capabilities
. - Запуск локального сервера Appium, если не используется прокси и сервер ещё не запущен. Для запуска сервера используется задержка в 10 секунд, чтобы дать ему время для инициализации.
- Инициализация драйвера
webdriver.Remote
с заданными возможностями и адресом сервера. Сохранение драйвера в свойстве объектаself.driver
. - Инициализация объекта
AppiumImage
с созданным драйвером. - Запись в лог информации о подключении и номере сессии драйвера.
Метод не генерирует исключения напрямую, но может пробросить исключения, сгенерированные внутренними вызовами, такими как ошибка запуска сервера Appium или ошибки, связанные с webdriver.Remote
.
В связи с использованием appium-device-farm указывать device udid необязательно.
capabilities = {
"platformName": "android",
"appium:automationName": "uiautomator2",
}
Метод disconnect
отвечает за отключение от устройства.
app.disconnect()
- Проверка, установлен ли драйвер (
self.driver
). Если драйвер установлен, то выполняется его завершение с помощью методаquit()
и затем драйвер обнуляется. В процессе выполнения этих операций в лог записывается информация о номере сессии, от которой происходит отключение. - Если не установлено значение
self.keep_alive_server
, то останавливается работа сервера с помощью методаstop()
.
Метод не генерирует исключения напрямую, но может пробросить исключения, сгенерированные внутренними вызовами, например, при ошибке остановки сервера.
Метод is_running
проверяет, активна ли текущая сессия драйвера.
Возвращает True
если текущая сессия драйвера активна, и False
в противном случае.
if device.is_running():
print("Устройство активно")
else:
print("Устройство не активно")
Метод может генерировать исключения, в случае если self.driver
не инициализирован. Также исключения могут быть сгенерированы внутренними вызовами метода is_running
из объекта self.driver
, например, при проблемах сети или сервера.
Этот метод обеспечивает поиск элемента в текущей структуре DOM. Метод должен получать либо локатор, либо значения by
и value
.
locator
: Определяет локатор элемента. Это может быть:
- кортеж - локатор в виде ('стратегия поиска', 'значение')
- объект WebElement
- словарь, содержащий пары атрибут: значение искомого элемента
- строка - путь до файла с изображением элемента.
by
: Тип локатора для поиска элемента (всегда в связке с value
). Может быть типом MobileBy, AppiumBy, By, или строкой.
value
: Значение локатора, если используется AppiumBy.XPATH. Может быть строкой, словарём или None
.
timeout_elem
: Время ожидания элемента в секундах.
timeout_method
: Время ожидания метода поиска элемента в секундах.
elements_range
: Ограничивает поиск элемента в указанном диапазоне. Используется при поиске по изображению. Может быть кортежем, списком, словарём или None
.
contains
: Используется для поиска по словарю. Если True
, ищет элемент, содержащий фрагмент значения.
Возвращает объект WebElementExtended или None
, если элемент не был найден.
element = app.get_element(locator=("id", "foo"))
element = app.get_element(element)
element = app.get_element(locator={'text': 'foo'})
element = app.get_element(locator='/path/to/file/pay_agent.png')
element = app.get_element(locator=part_image, elements_range={'class':'android.widget.FrameLayout', 'package':'ru.app.debug'})
element = app.get_element(by="id", value="ru.sigma.app.debug:id/backButton")
element = app.get_element(by=MobileBy.ID, value="ru.sigma.app.debug:id/backButton")
element = app.get_element(by=AppiumBy.ID, value="ru.sigma.app.debug:id/backButton")
element = app.get_element(by=By.ID, value="ru.sigma.app.debug:id/backButton")
Метод может генерировать исключения, в случае если введены некорректные аргументы или возникают ошибки при обработке элементов (например, NoSuchElementException
, TimeoutException
или WebDriverException
).
Этот метод используется для поиска элемента. Если элемент не найден, метод будет скроллить все скроллируемые элементы, пока не найдет искомый элемент или пока не будет проскроллено все доступное пространство.
-
locator
(Union[Tuple, WebElement, 'WebElementExtended', Dict[str, str], str]): Это местоположение или определение элемента, который нужно найти. Это может быть кортеж, экземпляр WebElement, словарь или строка. -
timeout
(int, опционально): Это максимальное время ожидания для поиска элемента. По умолчанию это 10 секунд.
Метод возвращает экземпляр WebElementExtended
, если элемент найден. Если элемент не найден после прокрутки всей доступной страницы, возвращается None
.
element = app.find_and_get_element(locator={'id': 'element_id'})
Внутри этого метода сначала проверяется, виден ли элемент на экране с помощью is_element_within_screen()
. Если это так, то элемент возвращается с помощью get_element()
.
Если элемент не виден на экране, то метод производит поиск во всех доступных для прокрутки элементах страницы. Если элемент найден в каком-то из этих элементов, он возвращается. Если элемент не найден после прокрутки всей доступной страницы, метод возвращает None
.
Этот метод обеспечивает поиск элементов в текущей структуре DOM. Метод может получать либо локатор, либо пару значений by
и value
.
-
locator
: Определяет локатор элементов. Это может быть:- Кортеж - локатор в виде ('атрибут', 'значение')
- Список объектов WebElement
- Словарь, содержащий пары атрибут: значение
- Строка - путь до файла с изображением элемента.
-
by
: Тип локатора для поиска элемента (всегда используется в связке сvalue
). Может быть типом MobileBy, AppiumBy, By, или строкой. -
value
: Значение локатора или словарь аргументов, если используется AppiumBy.XPATH. Может быть строкой, словарём илиNone
. -
timeout_elements
: Время ожидания в секундах для появления каждого элемента. -
timeout_method
: Общее время ожидания в секундах для выполнения всего метода. -
elements_range
: Ограничивает поиск элементов в указанном диапазоне. Используется при поиске по изображению. Может быть кортежем, списком, словарём илиNone
. -
contains
: Используется для поиска по словарю. ЕслиTrue
, ищет элементы, содержащие фрагмент значения.
Возвращает список объектов WebElementExtended, или None
, если элементы не были найдены.
elements = app.get_elements(locator=("id", "foo"))
elements = app.get_elements(locator={'text': 'foo'})
elements = app.get_elements(locator='/path/to/file/pay_agent.png')
elements = app.get_elements(locator=part_image, elements_range={'class':'android.widget.FrameLayout', 'package':'ru.app.debug'})
elements = app.get_elements(by="id", value="ru.sigma.app.debug:id/backButton")
elements = app.get_elements(by=MobileBy.ID, value="ru.sigma.app.debug:id/backButton")
elements = app.get_elements(by=AppiumBy.ID, value="ru.sigma.app.debug:id/backButton")
elements = app.get_elements(by=By.ID, value="ru.sigma.app.debug:id/backButton")
Метод может генерировать исключения, в случае если введены некорректные аргументы или возникают ошибки при обработке элементов (например, NoSuchElementException
, TimeoutException
или WebDriverException
).
Этот метод находит координаты наиболее вероятного совпадения частичного изображения в полном изображении. Используется для поиска элементов или участков интерфейса на экране по изображению.
-
image
: Путь к файлу частичного изображения, которое нужно найти внутри полного изображения. Может быть байтами, массивомnp.ndarray
, объектомImage.Image
, или строкой (путь к файлу). -
full_image
: Путь к файлу полного изображения. Может быть байтами, массивомnp.ndarray
, объектомImage.Image
, или строкой (путь к файлу). ЕслиNone
, то будет использовано текущее скриншотное изображение. -
threshold
: Минимальный порог совпадения, необходимый для считывания совпадения допустимым. По умолчанию равно 0.7.
Возвращает кортеж с координатами наиболее вероятного совпадения в формате (x1, y1, x2, y2) или None
, если совпадение не найдено.
coords = app.get_image_coordinates(image="/path/to/partial/image.png", full_image="/path/to/full/image.png", threshold=0.8)
Этот метод использует декоратор retry
, который выполняет функцию до тех пор, пока она не вернет результат, отличный от None
или False
, или пока не будет достигнуто максимальное количество попыток (3 попытки по умолчанию). После каждой неудачной попытки происходит пауза на 1 секунду.
Метод может генерировать исключения при обработке изображений или при работе с файлами.
Этот метод сначала находит изображение на экране (внешнее изображение), а затем находит другое изображение (внутреннее изображение) внутри обнаруженного изображения.
-
outer_image_path
: Путь к файлу с изображением, которое нужно найти на экране. Может быть байтами, массивомnp.ndarray
, объектомImage.Image
, или строкой (путь к файлу). -
inner_image_path
: Путь к файлу с изображением, которое нужно найти внутри внешнего изображения. Может быть байтами, массивомnp.ndarray
, объектомImage.Image
, или строкой (путь к файлу). -
threshold
: Пороговое значение сходства для шаблонного сопоставления. По умолчанию 0.9.
Возвращает координаты внутреннего изображения относительно экрана в формате ((x1, y1), (x2, y2)). Если внутреннее изображение не найдено, возвращает None
.
coords = app.get_inner_image_coordinates(outer_image_path="/path/to/outer/image.png", inner_image_path="/path/to/inner/image.png", threshold=0.8)
Этот метод использует декоратор retry
, который выполняет функцию до тех пор, пока она не вернет результат, отличный от None
или False
, или пока не будет достигнуто максимальное количество попыток (3 попытки по умолчанию). После каждой неудачной попытки происходит пауза на 1 секунду.
Метод может генерировать исключения при обработке изображений или при работе с файлами.
Этот метод находит все вхождения частичного изображения внутри полного изображения.
-
image
: Путь к файлу частичного изображения, которое нужно найти внутри полного изображения. Может быть байтами, массивомnp.ndarray
, объектомImage.Image
, или строкой (путь к файлу). -
full_image
: Путь к файлу полного изображения. Может быть байтами, массивомnp.ndarray
, объектомImage.Image
, или строкой (путь к файлу). ЕслиNone
, то будет сделан скриншот экрана и использован как полное изображение. -
cv_threshold
: Минимальный порог совпадения, необходимый для считывания совпадения допустимым. По умолчанию равно 0.7. -
coord_threshold
: Целое число, представляющее максимальное различие между значениями x и y двух кортежей, чтобы они считались слишком близкими друг к другу. По умолчанию равно 5.
Возвращает список кортежей, содержащий расположение каждого найденного совпадения. Если совпадений не найдено, возвращается None
.
matches = app.get_many_coordinates_of_image(image="/path/to/image.png", full_image="/path/to/full/image.png", cv_threshold=0.7, coord_threshold=5)
Этот метод использует декоратор retry
, который выполняет функцию до тех пор, пока она не вернет результат, отличный от None
или False
, или пока не будет достигнуто максимальное количество попыток (3 попытки по умолчанию). После каждой неудачной попытки происходит пауза на 1 секунду.
Метод может генерировать исключения при обработке изображений или при работе с файлами.
Этот метод возвращает координаты области, содержащей указанный текст на предоставленном изображении или снимке экрана.
-
text
: Искомый текст. -
language
: Язык для распознавания текста. По умолчанию 'rus'. -
image
: Изображение, на котором осуществляется поиск текста. Может быть байтами, строкой (путь к файлу), объектомImage.Image
или массивомnp.ndarray
. Если не указано, будет использован снимок экрана. По умолчаниюNone
. -
ocr
: Булев флаг, определяющий, следует ли использовать распознавание оптических символов (OCR) для извлечения текста из изображения. По умолчаниюTrue
.
Возвращает кортеж из четырех целых чисел, представляющих координаты области с текстом (верхний левый угол и нижний правый угол). Если текст не найден, возвращается None
.
coordinates = app.get_text_coordinates(text="Hello, world!", language="eng", image="/path/to/image.png", ocr=True)
Если флаг ocr
установлен в False
, метод будет использовать внутреннюю реализацию поиска элемента для извлечения координат области, содержащей искомый текст.
Этот метод возвращает текущий снимок экрана в браузере, декодированный из формата base64 в байты.
Метод не требует никаких параметров.
Возвращает байты, представляющие снимок экрана. Эти байты могут быть использованы для создания изображения.
screenshot = app._get_screenshot_as_base64_decoded()
Этот метод используется внутри других методов класса для получения текущего снимка экрана при работе с изображениями.
Этот метод пока не реализован. Ожидается, что он будет использоваться для поиска и возврата родительского элемента, который содержит определённый дочерний элемент.
На данный момент в методе нет параметров.
На данный момент метод возвращает ошибку NotImplementedError
при вызове, так как он ещё не реализован.
# Этот метод еще не реализован, поэтому его нельзя вызвать.
В текущей реализации метод возвращает исключение NotImplementedError
с сообщением "This method is not implemented yet". Это означает, что метод ещё не реализован. Предполагается, что в будущем он будет реализован для поиска и возврата родительского элемента, содержащего определённый дочерний элемент.
Этот метод пока не реализован. Ожидается, что он будет использоваться для поиска и возврата всех родительских элементов, которые содержат определённые дочерние элементы.
На данный момент в методе нет параметров.
На данный момент метод возвращает ошибку NotImplementedError
при вызове, так как он ещё не реализован.
# Этот метод еще не реализован, поэтому его нельзя вызвать.
В текущей реализации метод возвращает исключение NotImplementedError
с сообщением "This method is not implemented yet". Это означает, что метод ещё не реализован. Предполагается, что в будущем он будет реализован для поиска и возврата всех родительских элементов, содержащих определённые дочерние элементы.
Этот метод проверяет, находится ли заданный элемент полностью на экране.
-
locator
(Union[Tuple, WebElement, 'WebElementExtended', Dict[str, str], str]
): Локатор или элемент, который нужно проверить. Может быть кортежем, объектом WebElement, объектом WebElementExtended, словарем или строкой. -
timeout
(int
, необязательный): Время ожидания появления элемента в секундах. По умолчанию равно 10.
-
bool
: ВозвращаетTrue
, если элемент находится на видимой части экрана, иFalse
в противном случае.
# Допустим, мы хотим проверить, находится ли элемент с id 'some_id' на видимой части экрана.
is_visible = app.is_element_within_screen(locator=('id', 'some_id'))
Метод сначала получает размеры экрана, затем ищет элемент с помощью предоставленного локатора. Если элемент не найден или не отображается, метод возвращает False
. Если элемент найден и отображается, метод проверяет, находятся ли координаты элемента в пределах размеров экрана. Если элемент находится за пределами экрана, метод возвращает False
. В противном случае, если элемент находится в пределах видимой области экрана, метод возвращает True
.
Этот метод проверяет, присутствует ли заданный текст на экране.
-
text
(str
): Текст, который нужно найти на экране. -
ocr
(bool
, необязательный): Определяет, производить ли поиск текста на изображении или в DOM. ЕслиTrue
, распознавание текста производится с помощью библиотекиpytesseract
. ЕслиFalse
, производится поиск элемента по xpath. Значение по умолчанию:True
. -
language
(str
, необязательный): Язык для распознавания текста. По умолчанию 'rus'.
-
bool
: ВозвращаетTrue
, если заданный текст найден на экране. В противном случае возвращаетFalse
.
# Допустим, мы хотим проверить, находится ли текст 'Hello' на экране.
is_present = app.is_text_on_screen(text='Hello')
Метод использует разные подходы в зависимости от значения параметра ocr
. Если ocr=True
, то он использует библиотеку pytesseract
для распознавания текста на изображении экрана. Если ocr=False
, то он производит поиск элемента по xpath, используя текст как значение атрибута 'text' элемента.
Этот метод сравнивает, присутствует ли заданное изображение на экране.
-
image
(Union[bytes, np.ndarray, Image.Image, str]
): Изображение для поиска. Это может быть имя файла, байтовый поток, массив numpy или объект PIL Image. -
threshold
(float
, необязательный): Пороговое значение схожести части изображения со снимком экрана. По умолчанию 0.9.
-
bool
: ВозвращаетTrue
, если изображение найдено на экране. В противном случае возвращаетFalse
.
# Допустим, мы хотим проверить, находится ли изображение 'button.png' на экране.
is_present = app._is_image_on_the_screen(image='button.png')
Метод сначала делает снимок текущего экрана, затем преобразует его и искомое изображение в оттенки серого для лучшего сопоставления. Затем используется метод cv2.matchTemplate
для сопоставления мелкого изображения и снимка экрана. Затем используется cv2.minMaxLoc
для извлечения максимального коэффициента схожести и его координат. Если максимальное значение превышает заданный порог, метод возвращает True
, в противном случае False
.
Этот метод выполняет действие "тап" или "клик" по определенным координатам, элементу или изображению на экране.
-
locator
(Union[Tuple[str, str], WebElementExtended, WebElement, Dict[str, str], str]
, необязательный): Элемент или локатор, на который нужно нажать. -
x
(int
, необязательный): X координата точки, по которой следует нажать. -
y
(int
, необязательный): Y координата точки, по которой следует нажать. -
image
(Union[bytes, np.ndarray, Image.Image, str]
, необязательный): Изображение, на котором следует нажать. -
duration
(Optional[int]
, необязательный): Продолжительность нажатия в миллисекундах. -
timeout
(int
, необязательный): Время ожидания в секундах перед тем как метод вернетNone
, если изображение не найдено на экране. По умолчанию равно 5.
-
Union['AppiumExtended', None]
: Возвращает экземпляр классаAppiumExtended
, если действие "тап" или "клик" успешно выполнено. В противном случае возвращаетNone
.
# Нажатие на элемент с указанным локатором
app.tap(locator=('id', 'button'))
# Нажатие по координатам
app.tap(x=100, y=200)
# Нажатие на изображение
app.tap(image='button.png')
Этот метод использует внутренний метод _extract_point_coordinates_by_typing()
для получения координат точки, по которой следует нажать, если был передан locator
или image
. Если указано изображение, метод будет ожидать его появления на экране в течение указанного времени ожидания, прежде чем выполнить действие "тап". Затем вызывается внутренний метод _tap()
для выполнения действия "тап" по заданным координатам.
Этот метод выполняет свайп (перетаскивание) элемента или изображения на экране.
-
start_position
: Позиция начала свайпа. Может быть задана в различных форматах:- Если
start_position
является кортежем и оба его элемента являются строками, то он представляет собой локатор элемента. В этом случае будет выполнен поиск элемента и используется его позиция. - Если
start_position
является словарем, то считается, что это локатор элемента, основанный на атрибутах. Например, {'text': 'some text'} или {'class': 'SomeClass', 'visible': 'true'}. В этом случае будет выполнен поиск элемента по указанным атрибутам, и используется его позиция. - Если
start_position
является экземпляром класса WebElement или WebElementExtended, то используется его позиция. - Если
start_position
является строкой, массивом байтов (bytes), массивом NumPy (np.ndarray) или объектом класса Image.Image, то считается, что это изображение. В этом случае будет вычислен центр изображения и используется его позиция. - Если
start_position
является кортежем, и оба его элемента являются целыми числами, то считается, что это координаты в формате (x_coordinate, y_coordinate).
- Если
-
end_position
: Позиция конца свайпа. Принимает те же форматы, что иstart_position
. По умолчанию None. -
direction
: Направление свайпа. Принимает значения от 0 до 360 градусов. Если указано направление, то будет вычислена конечная точка свайпа на основе текущего размера окна и указанного расстояния. По умолчанию None. -
distance
: Расстояние свайпа. Принимается в пикселях. Используется только в сочетании с параметромdirection
. По умолчанию None. -
duration
: Продолжительность свайпа в миллисекундах. По умолчанию 0.
-
AppiumExtended
: Экземпляр класса AppiumExtended.
- В качестве конечной позиции свайпа должен быть указан
end_position
или параdirection, distance
. -
str
принимается как путь к изображению на экране и вычисляется его центр, а не как локатор элемента
# Свайп элемента на экране по указанным координатам
app.swipe(start_position=(100, 200), end_position=(300, 400))
# Свайп по направлению и расстоянию
app.swipe(start_position=('xpath', '//button[@id="submit"]'), direction=90, distance=100)
# Свайп изображения
app.swipe(start_position='image.png', end_position=(300, 400))
Метод обязательно должен принимать либо end_postition, либо direction и distance
Этот метод выполняет свайп (перетаскивание) с верхней части экрана к нижней.
Метод не принимает параметров.
None
- Метод использует функцию
adb.get_screen_resolution()
для определения размера экрана. - Позиция начала свайпа (
start_position
) вычисляется как 10% от высоты экрана. - Позиция конца свайпа (
end_position
) вычисляется как 90% от высоты экрана.
# Свайп сверху вниз на экране
app.swipe_top_to_bottom()
Этот метод выполняет свайп (перетаскивание) с нижней части экрана к верхней.
Метод не принимает параметров.
None
- Метод использует функцию
adb.get_screen_resolution()
для определения размера экрана. - Позиция начала свайпа (
start_position
) вычисляется как 90% от высоты экрана. - Позиция конца свайпа (
end_position
) вычисляется как 10% от высоты экрана. - Может использоваться для выдвигания шторки.
# Свайп снизу вверх на экране
app.swipe_bottom_to_top()
Этот метод выполняет свайп (перетаскивание) с правой части экрана к левой.
Метод не принимает параметров.
None
- Метод использует функцию
adb.get_screen_resolution()
для определения размера экрана. - Позиция начала свайпа (
start_position
) вычисляется как 90% от ширины экрана. - Позиция конца свайпа (
end_position
) вычисляется как 10% от ширины экрана.
# Свайп справа налево на экране
app.swipe_right_to_left()
Этот метод выполняет свайп (перетаскивание) с левой части экрана к правой.
Метод не принимает параметров.
None
- Метод использует функцию
adb.get_screen_resolution()
для определения размера экрана. - Позиция начала свайпа (
start_position
) вычисляется как 10% от ширины экрана. - Позиция конца свайпа (
end_position
) вычисляется как 90% от ширины экрана.
# Свайп слева направо на экране
app.swipe_left_to_right()
Этот метод ожидает появления на экране указанного локатора или изображения.
-
locator
: Локатор(ы), которые нужно ожидать. Может быть одним локатором или списком локаторов. Принимает форматы, аналогичныеstart_position
в методеswipe()
. По умолчанию None. -
image
: Изображение(я), которые нужно ожидать. Может быть одним изображением или списком изображений. Принимает строку, массив байтов (bytes), массив NumPy (np.ndarray) или объект класса Image.Image. По умолчанию None. -
timeout
: Максимальное время ожидания в секундах. По умолчанию 10. -
contains
: Если True, проверяет, содержит ли элемент указанный локатор. Если False, проверяет, точно ли соответствует элемент указанному локатору. По умолчанию True. -
full_image
: Основное изображение, на котором будет искатьсяimage
. Принимает строку, массив байтов (bytes), массив NumPy (np.ndarray) или объект класса Image.Image. По умолчанию None.
-
bool
: True, если элемент(ы) или изображение(я) найдены в течение периода ожидания, иначе False.
- Этот метод использует приватный метод
_wait_for()
, который реализует основную логику ожидания.
# Ожидание появления элемента по локатору
app.wait_for(locator=('xpath', '//button[@id="submit"]'), timeout=30)
# Ожидание появления изображения
app.wait_for(image='image.png', timeout=20)
# Ожидание появления нескольких элементов и изображений
app.wait_for(locator=[('id', 'button1'), ('id', 'button2')], image=['image1.png', 'image2.png'], timeout=40)
Этот метод ожидает, пока указанный локатор или изображение не исчезнет с экрана или из DOM.
-
locator
: Локатор(ы), которые нужно ожидать. Может быть одним локатором или списком локаторов. Принимает форматы, аналогичныеstart_position
в методеswipe()
. По умолчанию None. -
image
: Изображение(я), которые нужно ожидать. Может быть одним изображением или списком изображений. Принимает строку, массив байтов (bytes), массив NumPy (np.ndarray) или объект класса Image.Image. По умолчанию None. -
timeout
: Максимальное время ожидания в секундах. По умолчанию 10. -
contains
: Если True, проверяет, содержит ли элемент указанный локатор. Если False, проверяет, точно ли соответствует элемент указанному локатору. По умолчанию True.
-
bool
: True, если элемент(ы) или изображение(я) исчезли в течение периода ожидания, иначе False.
# Ожидание исчезновения элемента по локатору
app.wait_for_not(locator=('xpath', '//button[@id="submit"]'), timeout=30)
# Ожидание исчезновения изображения
app.wait_for_not(image='image.png', timeout=20)
# Ожидание исчезновения нескольких элементов и изображений
app.wait_for_not(locator=[('id', 'button1'), ('id', 'button2')], image=['image1.png', 'image2.png'], timeout=40)
Этот метод ожидает, когда другой метод вернет True.
-
method
: ссылка на метод, который мы ожидаем. -
timeout
: максимальное время ожидания в секундах. По умолчанию равно 10.
-
bool
: возвращает True, если метод возвращает True в течение периода времени, указанного в timeout. В противном случае возвращает False.
# Ожидаем, когда метод `check_login_status` вернет True в течение 20 секунд
result = AppiumExtended.wait_return_true(obj.check_login_status, timeout=20)
# Если `check_login_status` вернет True в течение 20 секунд, тогда `result` будет True, иначе `result` будет False.
app.wait_return_true(obj.is_connected, timeout=30)
Обратите внимание, что это статический метод, что означает, что он принадлежит классу, а не экземпляру класса. Это значит, что вам не нужен экземпляр класса, чтобы вызвать этот метод. Вы можете просто вызвать его на самом классе, как показано в примере выше.
Этот метод рисует прямоугольник на указанном изображении или скриншоте экрана. Прямоугольник задается координатами или верхней левой и нижней правой точками. Результирующее изображение сохраняется по указанному пути.
-
image
: Изображение, на котором будет рисоваться прямоугольник. Может быть представлено в форматах bytes, str (путь к файлу) или PIL Image. Если не указано, используется скриншот экрана. По умолчанию равно None. -
coordinates
: Координаты прямоугольника в виде кортежа (x1, y1, x2, y2). По умолчанию равно None. -
top_left
: Координаты верхней левой точки прямоугольника в виде кортежа (x, y). По умолчанию равно None. -
bottom_right
: Координаты нижней правой точки прямоугольника в виде кортежа (x, y). По умолчанию равно None. -
path
: Путь для сохранения результирующего изображения. По умолчанию равно None.
-
AppiumExtended
: Возвращает экземпляр классаAppiumExtended
для дальнейших вызовов методов.
appium_extended = AppiumExtended(driver)
image = driver.get_screenshot_as_base64().encode('utf-8')
appium_extended.draw_by_coordinates(image=image, coordinates=(123, 123, 123, 123), path='pictures')
В этом примере мы делаем скриншот экрана, рисуем на нем прямоугольник с указанными координатами и сохраняем полученное изображение в директории "pictures".
Этот метод пока не реализован. Ожидается, что он будет использоваться для поиска и возврата родительского элемента, который содержит определённый дочерний элемент.
На данный момент в методе нет параметров.
На данный момент метод возвращает ошибку NotImplementedError
при вызове, так как он ещё не реализован.
# Этот метод еще не реализован, поэтому его нельзя вызвать.
В текущей реализации метод возвращает исключение NotImplementedError
с сообщением "This method is not implemented yet". Это означает, что метод ещё не реализован. Предполагается, что в будущем он будет реализован для ввода данных с помощью виртуальной клавиатуры.
WebElementExtended
- это класс, расширяющий базовый класс WebElement
дополнительными возможностями. Он объединяет несколько классов, предоставляя различные методы взаимодействия с веб-элементами.
Инициализируется в AppiumExtended.
Этот метод извлекает элемент из другого элемента. Должен принимать как минимум либо локатор, либо значения параметров by и value.
-
locator
: Определяет локатор элемента. Может быть кортежем, WebElement, словарем или строкой.- Кортеж: Локатор в форме ('стратегия', 'значение'), например, ('xpath', '//*'), ('id', 'elem_id') и т.д.
- WebElement / WebElementExtended: Объект веб-элемента.
- Словарь: Содержит пары атрибут: значение элемента, например, {'text':'foo', 'enabled':'true'}.
- Строка: Путь до файла с изображением элемента.
- По умолчанию: None.
-
by
: Тип локатора для поиска элемента. Используется в связке с параметромvalue
. Может быть MobileBy, AppiumBy, By или строкой. По умолчанию: None. -
value
: Значение локатора или словарь аргументов, если используется AppiumBy.XPATH. Может быть строкой, словарем или None. По умолчанию: None. -
timeout_elem
: Максимальное время ожидания элемента в секундах. По умолчанию: 10. -
timeout_method
: Максимальное время ожидания выполнения метода поиска элемента в секундах. По умолчанию: 600. -
elements_range
: Ограничивает поиск элемента в указанном диапазоне (для поиска по изображению). Может быть кортежем, списком, словарем или None. По умолчанию: None. -
contains
: Если True, проверяет, содержит ли элемент указанные атрибуты. Если False, проверяет, точно ли соответствует элемент указанным атрибутам. По умолчанию: True.
-
WebElementExtended
илиNone
: Возвращает WebElementExtended, если элемент был найден в течение указанного времени ожидания, в противном случае возвращает None.
- Этот метод использует внутренний метод для реализации основной логики поиска элементов.
# Ожидание появления элемента по локатору
inner_element = element.get_element(locator=("id", "foo"), timeout_elem=30)
# Ожидание появления элемента по WebElement
inner_element = element.get_element(locator=element, timeout_elem=20)
# Ожидание появления нескольких элементов и изображений
inner_element = element.get_element(locator={'text': 'foo'}, elements_range={'class':'android.widget.FrameLayout', 'package':'ru.app.debug'}, timeout_elem=40)
Этот метод получает атрибуты элемента. Если хотя бы один из желаемых атрибутов не найден, метод возвращает все атрибуты элемента.
-
desired_attributes
: Список названий атрибутов, которые нужно получить. Если параметр не указан, метод вернет все атрибуты элемента. По умолчанию: None.
-
dict
: Словарь, содержащий атрибуты элемента и их значения. Если указанdesired_attributes
и соответствующие атрибуты найдены у элемента, возвращает словарь только с запрашиваемыми атрибутами. Еслиdesired_attributes
не указан или желаемый атрибут не найден, возвращает словарь со всеми атрибутами.
# Получение атрибутов 'text', 'bounds', 'class' у элемента
attributes = element.get_attributes(['text', 'bounds', 'class'])
# Получение всех атрибутов элемента
all_attributes = element.get_attributes()
Этот метод осуществляет нажатие на заданный элемент.
-
duration
: Время нажатия в секундах. Если параметр равен нулю, осуществляется обычное нажатие, иначе происходит нажатие с удержанием на указанное количество секунд. По умолчанию равно 0. -
decorator_args
: Параметры для декоратора, включая время ожидания нового окна (timeout_window
) и количество попыток нажатия (tries
). Используется только приwait = True
. По умолчанию None. -
wait
: Флаг, указывающий, следует ли ожидать изменения окна после нажатия. ЕслиTrue
, будет использован метод_click_to_element_and_wait()
, иначе_click_to_element()
. По умолчанию False.
- Возвращает экземпляр
WebElementExtended
, представляющий элемент, на котором было произведено действие. - В случае, если не удалось выполнить действие, генерируется AssertionError.
- В случае, если указан
wait = True
и не предоставленыdecorator_args
, используются стандартные параметры декоратора:timeout_window
равно 5 иtries
равно 5.
# Нажатие на элемент с ожиданием изменения окна и кастомными параметрами декоратора
decorator_args = {"timeout_window": 5, "tries": 5}
element.click(duration=0, wait=True, decorator_args=decorator_args)
Этот метод выполняет двойное нажатие (double click) на заданный элемент.
-
decorator_args
: Параметры для декоратора, включая время ожидания нового окна (timeout_window
) и количество попыток нажатия (tries
). Используется только приwait = True
. По умолчаниюtimeout_window
равно 5 иtries
равно 5. -
wait
: Флаг, указывающий, следует ли ожидать изменения окна после нажатия. ЕслиTrue
, будет использован метод_double_click_to_element_and_wait()
, иначе_double_click_to_element()
. По умолчанию False.
- Возвращает экземпляр
WebElementExtended
, представляющий элемент, на котором было произведено действие. - В случае, если не удалось выполнить действие, генерируется AssertionError.
- В случае, если указан
wait = True
и не предоставленыdecorator_args
, используются стандартные параметры декоратора:timeout_window
равно 5 иtries
равно 5.
# Двойное нажатие на элемент без ожидания изменения окна
element.double_click(wait=False)
# Двойное нажатие на элемент с ожиданием изменения окна и кастомными параметрами декоратора
decorator_args = {"timeout_window": 7, "tries": 3}
element.double_click(wait=True, decorator_args=decorator_args)
Этот метод нажимает левую кнопку мыши, перемещает курсор к указанной цели и отпускает кнопку.
-
locator
: Локатор для поиска целевого элемента на веб-странице. Он может быть кортежем,WebElement
,WebElementExtended
, словарем или строкой. Не обязательный параметр. -
x
: Абсолютная координата по оси X для перемещения курсора. Не обязательный параметр. -
y
: Абсолютная координата по оси Y для перемещения курсора. Не обязательный параметр. -
direction
: Направление в градусах для перемещения курсора, где 0/360 - вверх, 90 - вправо, 180 - вниз, 270 - влево. Не обязательный параметр. -
distance
: Расстояние в пикселях для перемещения курсора. Не обязательный параметр.
- Возвращает экземпляр
WebElementExtended
, представляющий элемент, на котором было произведено действие. - В случае, если не удалось выполнить действие, генерируется AssertionError.
# Кликнуть и переместить к элементу, найденному по локатору
element.click_and_move(locator="//button[@id='submit']")
# Кликнуть и переместить на указанные координаты
element.click_and_move(x=100, y=200)
# Кликнуть и переместить в указанном направлении на указанное расстояние
element.click_and_move(direction=90, distance=100)
Целью перемещения может быть WebElement, абсолютные координаты (x, y) или направление и расстояние. Если предоставлены направление и расстояние, функция вычисляет целевую позицию на основе вектора, определенного этими значениями. Если предоставлены абсолютные координаты (x, y), курсор перемещается в указанные позиции. Если предоставлен локатор, функция перемещается к найденному элементу на веб-странице.
Deprecated! Метод устарел. Будет удален в следующих версиях. Вместо него будет реализован метод выполняющий нажатие через driver.execute_script()
Этот метод выполняет нажатие на элемент, используя ADB (Android Debug Bridge).
-
decorator_args
: Дополнительные аргументы для использования в декораторе. Это словарь, который может содержать следующие ключи:-
timeout_window
: Время ожидания нового окна (умножается на количество попыток). -
tries
: Количество попыток нажатия (по умолчанию 3). Этот параметр не обязателен.
-
-
wait
: Флаг, указывающий, нужно ли ожидать изменения окна. Необязательный параметр, по умолчанию False.
- Возвращает экземпляр
WebElementExtended
, представляющий элемент, на котором было произведено действие. - В случае, если не удалось выполнить действие, генерируется AssertionError.
# Нажать на элемент с помощью ADB и не ожидать изменения окна
element.adb_tap()
# Нажать на элемент с помощью ADB и ожидать изменения окна
element.adb_tap(wait=True)
# Нажать на элемент с помощью ADB, ожидать изменения окна и установить время ожидания и количество попыток
element.adb_tap(decorator_args={"timeout_window": 5, "tries": 5}, wait=True)
ADB (Android Debug Bridge) - это инструмент командной строки, который используется для взаимодействия с устройством. В данном контексте он используется для симуляции взаимодействия пользователя с интерфейсом Android.
Этот метод выполняет многократные нажатия (обычно два или три) на элемент, используя ADB (Android Debug Bridge).
-
decorator_args (dict, optional)
: Дополнительные аргументы для декоратора. ЕслиNone
, то будут преобразованы вdecorator_args = {"timeout_window": 5, "tries": 5}
, гдеtimeout_window
- время ожидания изменения окна в секундах, аtries
- количество попыток выполнения метода для изменения окна. -
wait (bool, optional)
: Флаг, указывающий, нужно ли ожидать изменение окна после нажатия. По умолчаниюFalse
.
- Возвращает экземпляр
WebElementExtended
, представляющий элемент, на котором было произведено действие. - В случае, если не удалось выполнить действие, генерируется AssertionError.
# Выполнить многократные нажатия на элемент с помощью ADB
element.adb_multi_tap(decorator_args={"timeout_window": 10, "tries": 3}, wait=True)
ADB (Android Debug Bridge) - это инструмент командной строки, который используется для взаимодействия с устройством. В данном контексте он используется для симуляции взаимодействия пользователя с интерфейсом Android. Многократные нажатия могут быть полезны для выделения текста или активации специальных функций в приложении.
Этот метод выполняет свайп (прокрутку) на элементе или по определенному направлению, используя ADB (Android Debug Bridge).
-
locator (Union[Tuple, WebElement, 'WebElementExtended', Dict[str, str], str], optional)
: Локатор элемента, к которому необходимо прокрутить. Это может бытьTuple
,WebElement
,WebElementExtended
, словарь сstr
или простоstr
. ЕслиNone
, прокрутка производится от центра корневого элемента. -
x (int, optional)
: Координата X целевой позиции прокрутки. -
y (int, optional)
: Координата Y целевой позиции прокрутки. -
direction (int, optional)
: Направление прокрутки в градусах (от 0 до 360). -
distance (int, optional)
: Расстояние прокрутки в пикселях. -
duration (int, optional)
: Длительность прокрутки в секундах. По умолчанию равна 1. -
contains (bool, optional)
: Флаг, указывающий, должен ли локатор содержать текст элемента. По умолчаниюTrue
.
- Возвращает экземпляр
WebElementExtended
, представляющий элемент, на котором было произведено действие. - В случае, если не удалось выполнить действие, генерируется AssertionError.
# Прокрутить до элемента с текстом "Submit"
element.adb_swipe(locator="Submit", duration=2)
# Прокрутить вниз на 500 пикселей за 1 секунду
element.adb_swipe(direction=180, distance=500, duration=1)
ADB (Android Debug Bridge) - это инструмент командной строки, который используется для взаимодействия с устройством. В данном контексте он используется для симуляции взаимодействия пользователя с интерфейсом Android. Прокрутка может быть полезной для навигации по странице или меню приложения.
Этот метод выполняет нажатие (tap) на центре данного веб-элемента.
-
duration (int, optional)
: Длительность нажатия в миллисекундах. По умолчанию равна 0 (моментальное нажатие). -
decorator_args (dict, optional)
: Дополнительные аргументы для использования в декораторе. По умолчанию равноNone
. Если необходимо ожидание результата после нажатия, в словаре можно указать "timeout_window" - время ожидания изменения окна, и "tries" - количество попыток для изменения окна. -
wait (bool, optional)
: Флаг, указывающий, следует ли ожидать результат после нажатия. По умолчанию равноFalse
.
- Возвращает экземпляр
WebElementExtended
, представляющий элемент, на котором было произведено действие. - В случае, если не удалось выполнить действие, генерируется AssertionError.
# Моментальное нажатие на элемент
element.tap()
# Нажатие на элемент на протяжении 500 миллисекунд
element.tap(duration=500)
# Нажатие на элемент с ожиданием изменения окна в течение 5 секунд
element.tap(duration=500, decorator_args={"timeout_window": 5, "tries": 5}, wait=True)
Методы _tap
, _tap_to_element_and_wait
, _tap_to_element
и __tap
используются внутри этого метода для выполнения нажатия и обработки различных сценариев, связанных с ожиданием результатов и обработкой исключений.
Этот метод выполняет двойное нажатие (double tap) на центре данного веб-элемента.
-
decorator_args (dict, optional)
: Дополнительные аргументы для использования в декораторе. По умолчанию равноNone
. Если необходимо ожидание результата после нажатия, в словаре можно указать "timeout_window" - время ожидания изменения окна, и "tries" - количество попыток для изменения окна. -
wait (bool, optional)
: Флаг, указывающий, следует ли ожидать результат после нажатия. По умолчанию равноFalse
. -
pause (float, optional)
: Пауза между двумя нажатиями в секундах. По умолчанию равно 0.2.
- Возвращает экземпляр
WebElementExtended
, представляющий элемент, на котором было произведено действие. - В случае, если не удалось выполнить действие, генерируется AssertionError.
# Двойное нажатие на элемент с паузой в 0.3 секунды между нажатиями
element.double_tap(pause=0.3)
# Двойное нажатие на элемент с ожиданием изменения окна в течение 5 секунд
element.double_tap(decorator_args={"timeout_window": 5, "tries": 5}, wait=True, pause=0.3)
Методы _double_tap
, _double_tap_to_element_and_wait
, _double_tap_to_element
и __double_tap
используются внутри этого метода для выполнения двойного нажатия и обработки различных сценариев, связанных с ожиданием результатов и обработкой исключений.
Этот метод выполняет операцию "нажать и переместить" на веб-элементе или на указанных координатах.
-
locator (Union[Tuple, WebElement, 'WebElementExtended', Dict[str, str], str], optional)
: Локатор элемента, на который будет выполнено нажатие и перемещение. По умолчанию равноNone
. -
x (int, optional)
: Координата X для нажатия и перемещения. По умолчанию равноNone
. -
y (int, optional)
: Координата Y для нажатия и перемещения. По умолчанию равноNone
. -
direction (int, optional)
: Направление перемещения в градусах (0 - вверх, 90 - вправо, 180 - вниз, 270 - влево). По умолчанию равноNone
. -
distance (int, optional)
: Расстояние перемещения в пикселях. По умолчанию равноNone
.
- Возвращает экземпляр
WebElementExtended
, представляющий элемент, на котором было произведено действие. - В случае, если не удалось выполнить действие, генерируется AssertionError.
# Нажатие и перемещение на элемент с локатором
element.tap_and_move(locator=("xpath", "//div[@class='target']"))
# Нажатие и перемещение к координатам (50, 100)
element.tap_and_move(x=50, y=100)
# Нажатие и перемещение на расстояние 200 пикселей вниз
element.tap_and_move(direction=180, distance=200)
Метод _tap_and_move
используется внутри этого метода для выполнения нажатия и перемещения, обработки различных сценариев в зависимости от предоставленных аргументов и обработки исключений.
Этот метод обеспечивает поиск элементов в элементе.
-
locator (Union[Tuple, List[WebElement], Dict[str, str], str], optional)
: Локатор элементов. Может быть кортежем, списком Веб-Элементов, словарем с атрибутом и значением, или строкой как путь до файла с изображением элемента. По умолчанию равноNone
. -
by (Union[MobileBy, AppiumBy, By, str], optional)
: Тип локатора для поиска элемента (всегда в связке сvalue
). По умолчанию равноNone
. -
value (Union[str, Dict, None], optional)
: Значение локатора или словарь аргументов, если используетсяAppiumBy.XPATH
. По умолчанию равноNone
. -
timeout_elements (int, optional)
: Время ожидания для поиска каждого отдельного элемента. По умолчанию равно10
. -
timeout_method (int, optional)
: Общее время ожидания метода. По умолчанию равно600
. -
elements_range (Union[Tuple, List[WebElement], Dict[str, str], None], optional)
: Диапазон для поиска элементов. По умолчанию равноNone
. -
contains (bool, optional)
: ЕслиTrue
, то поиск будет осуществляться по фрагменту текста или атрибута, а не их полному соответствию. По умолчанию равноTrue
.
- Возвращает список экземпляров
WebElementExtended
, представляющих найденные элементы. В случае, если элементы не найдены, возвращает пустой список.
# Поиск элементов по ID
elements = app.get_elements(locator=("id", "foo"))
# Поиск элементов по тексту
elements = app.get_elements(locator={'text': 'foo'})
# Поиск элементов по изображению
elements = app.get_elements(locator='/path/to/file/pay_agent.png')
# Поиск элементов с использованием типа локатора и значения
elements = app.get_elements(by="id", value="ru.sigma.app.debug:id/backButton")
Этот метод выполняет скроллинг элемента вниз. Тап и ведение от нижнего внутреннего элемента до верхнего внутреннего элемента.
-
locator (Union[Tuple, WebElementExtended, Dict[str, str], str], optional)
: Локатор или элемент для прокрутки. Может быть кортежем, экземпляромWebElementExtended
, словарем с атрибутом и значением, или строкой. Если не указан, то будет вычислен автоматически. По умолчанию равноNone
. -
duration (int, optional)
: Продолжительность прокрутки в миллисекундах. Если не указана, прокрутка будет произведена без задержки. По умолчанию равноNone
.
- Возвращает экземпляр
WebElementExtended
, если скроллинг выполнен успешно. - В случае, если не удалось выполнить действие, генерируется AssertionError.
# Скроллинг элемента с заданным локатором
app.scroll_down(locator=("id", "foo"), duration=1000)
# Скроллинг конкретного элемента
element = app.get_element(locator=("id", "foo"))
app.scroll_down(locator=element, duration=1000)
# Скроллинг элемента с заданным атрибутом и значением
app.scroll_down(locator={'class': 'foo'}, duration=1000)
Этот метод выполняет скроллинг элемента вверх. Тап и ведение от верхнего внутреннего элемента до нижнего внутреннего элемента.
-
locator (Union[Tuple, WebElementExtended, Dict[str, str], str], optional)
: Локатор или элемент для прокрутки. Может быть кортежем, экземпляромWebElementExtended
, словарем с атрибутом и значением, или строкой. Если не указан, то будет вычислен автоматически. По умолчанию равноNone
. -
duration (int, optional)
: Продолжительность прокрутки в миллисекундах. Если не указана, прокрутка будет произведена без задержки. По умолчанию равноNone
.
- Возвращает экземпляр
WebElementExtended
, если скроллинг выполнен успешно. - В случае, если не удалось выполнить действие, генерируется AssertionError.
# Скроллинг элемента с заданным локатором вверх
app.scroll_up(locator=("id", "foo"), duration=1000)
# Скроллинг конкретного элемента вверх
element = app.get_element(locator=("id", "foo"))
app.scroll_up(locator=element, duration=1000)
# Скроллинг элемента с заданным атрибутом и значением вверх
app.scroll_up(locator={'class': 'foo'}, duration=1000)
Этот метод выполняет скроллинг элемента до самого нижнего положения.
-
locator (Union[Tuple, WebElementExtended, Dict[str, str], str], optional)
: Локатор или элемент для прокрутки. Может быть кортежем, экземпляромWebElementExtended
, словарем с атрибутом и значением, или строкой. По умолчанию равноNone
. -
timeout_method (int, optional)
: Время ожидания выполнения метода в секундах. Если время ожидания истекает, а скроллинг не достигает нижнего положения, метод возвращает ошибку. По умолчанию равно120
.
- Возвращает экземпляр
WebElementExtended
, если скроллинг выполнен успешно. В случае ошибки выбрасывает исключение AsserionError.
# Скроллинг элемента с заданным локатором до нижнего положения
app.scroll_to_bottom(locator=("id", "foo"), timeout_method=120)
# Скроллинг конкретного элемента до нижнего положения
element = app.get_element(locator=("id", "foo"))
app.scroll_to_bottom(locator=element, timeout_method=120)
# Скроллинг элемента с заданным атрибутом и значением до нижнего положения
app.scroll_to_bottom(locator={'class': 'foo'}, timeout_method=120)
Этот метод выполняет скроллинг элемента до самого верхнего положения.
-
locator (Union[Tuple, WebElementExtended, Dict[str, str], str], optional)
: Локатор или элемент для прокрутки. Может быть кортежем, экземпляромWebElementExtended
, словарем с атрибутом и значением, или строкой. По умолчанию равноNone
. -
timeout_method (int, optional)
: Время ожидания выполнения метода в секундах. Если время ожидания истекает, а скроллинг не достигает верхнего положения, метод возвращает ошибку. По умолчанию равно120
.
- Возвращает экземпляр
WebElementExtended
, если скроллинг выполнен успешно. В случае ошибки выбрасывает исключение AssertionError.
# Скроллинг элемента с заданным локатором до верхнего положения
app.scroll_to_top(locator=("id", "foo"), timeout_method=120)
# Скроллинг конкретного элемента до верхнего положения
element = app.get_element(locator=("id", "foo"))
app.scroll_to_top(locator=element, timeout_method=120)
# Скроллинг элемента с заданным атрибутом и значением до верхнего положения
app.scroll_to_top(locator={'class': 'foo'}, timeout_method=120)
Этот метод выполняет скроллинг элемента вниз и вверх, пока не найдет элемент, указанный в аргументе locator
, или пока не истечет таймаут.
-
locator (Union[Tuple, WebElementExtended, Dict[str, str], str])
: Локатор или элемент, который следует найти. Может быть кортежем, экземпляромWebElementExtended
, словарем с атрибутом и значением, или строкой. -
roll_locator (Union[Tuple, WebElementExtended, Dict[str, str], str], optional)
: Локатор или элемент, который следует прокручивать. Если не указан, прокручивается первый дочерний элемент. Может быть кортежем, экземпляромWebElementExtended
, словарем с атрибутом и значением, или строкой. По умолчанию равноNone
. -
timeout_method (int, optional)
: Время ожидания выполнения метода в секундах. Если время ожидания истекает, а элемент не найден, метод возвращаетNone
. По умолчанию равно120
.
- Возвращает экземпляр
WebElementExtended
, если элемент найден. ВозвращаетNone
, если элемент не найден в течение заданного времени.
# Поиск элемента с заданным локатором, прокручивая элемент с другим локатором
app.scroll_until_find(locator=("id", "target"), roll_locator=("id", "foo"), timeout_method=120)
# Поиск конкретного элемента, прокручивая другой конкретный элемент
element_to_find = app.get_element(locator=("id", "target"))
element_to_scroll = app.get_element(locator=("id", "foo"))
app.scroll_until_find(locator=element_to_find, roll_locator=element_to_scroll, timeout_method=120)
# Поиск элемента с заданным атрибутом и значением, прокручивая элемент с другим атрибутом и значением
app.scroll_until_find(locator={'class': 'target'}, roll_locator={'class': 'foo'}, timeout_method=120)
Этот метод возвращает первый родительский элемент текущего элемента в дереве DOM.
Метод не принимает никаких аргументов.
- Возвращает экземпляр
WebElementExtended
, который представляет родительский элемент.
# Получение родительского элемента
parent_element = app.get_parent()
Этот метод возвращает все родительские элементы текущего элемента в дереве DOM, начиная от ближайшего и до корневого элемента.
Метод не принимает никаких аргументов.
- Возвращает список экземпляров
WebElementExtended
, каждый из которых представляет родительский элемент на различных уровнях вверх по дереву DOM.
# Получение всех родительских элементов
parent_elements = app.get_parents()
Этот метод возвращает соседний (родственный) элемент текущего элемента, соответствующий заданным атрибутам. Возвращаются только непосредственные соседи (братья или сестры) в пределах того же родительского элемента.
-
attributes
(dict
): Словарь, содержащий атрибуты и их значения, которые должны быть найдены у искомого соседнего элемента. Например,{'class': 'myClass', 'name': 'myName'}
ищет элемент, у которого атрибутclass
равенmyClass
иname
равенmyName
. -
contains
(bool
, необязательный): Флаг, указывающий, использовать ли функциюcontains
XPath для атрибутов. ЕслиTrue
, метод будет искать элементы, значение атрибута которых содержит указанное значение (а не полное совпадение). По умолчанию равноTrue
.
- Возвращает экземпляр
WebElementExtended
, представляющий найденный соседний элемент. Если такой элемент не найден, возвращаетсяNone
.
# Получение соседнего элемента с классом 'myClass'
sibling_element = app.get_sibling({'class': 'myClass'})
# Получение соседнего элемента, имя которого содержит 'myName'
sibling_element = app.get_sibling({'name': 'myName'}, contains=True)
Этот метод возвращает все соседние (родственные) элементы текущего элемента. Возвращаются только непосредственные соседи (братья или сестры) в пределах того же родительского элемента.
Метод не требует аргументов.
- Возвращает список экземпляров
WebElementExtended
, каждый из которых представляет одного из родственных элементов текущего элемента. Если таких элементов не найдено, возвращается пустой список.
# Получение всех соседних элементов текущего элемента
sibling_elements = app.get_siblings()
Этот метод предназначен для поиска "кузена" текущего элемента в дереве DOM. Кузен в данном контексте определяется как элемент, находящийся на одинаковом уровне вложенности от общего предка.
-
ancestor
- Предок, относительно которого определяется "кузенство". Может быть представлен в виде кортежа (списка атрибутов и их значений), экземпляра WebElement или WebElementExtended, словаря (атрибутов и их значений) или строки (XPath выражения). -
cousin
- Словарь атрибутов, определяющий искомого кузена. Ключи словаря - это названия атрибутов, значения - соответствующие значения этих атрибутов. -
contains
- Булевый флаг, который определяет, следует ли использовать функциюcontains
при формировании XPath выражения для поиска кузена. ЕслиTrue
, то будет искаться частичное совпадение атрибутов. ЕслиFalse
, то будет искаться полное совпадение. По умолчаниюTrue
.
- Возвращает экземпляр
WebElementExtended
, представляющий кузена текущего элемента. Если кузен не найден, возвращаетсяNone
.
# Ищем кузена текущего элемента, имеющего класс 'desired-class' и находящегося на одинаковой глубине вложенности от общего предка с классом 'parent-class'
cousin_element = app.get_cousin(ancestor={'class': 'parent-class'}, cousin={'class': 'desired-class'})
Этот метод предназначен для поиска "кузенов" текущего элемента в дереве DOM. Кузен в данном контексте определяется как элемент, находящийся на одинаковом уровне вложенности от общего предка.
-
ancestor
- Предок, относительно которого определяется "кузенство". Может быть представлен в виде кортежа (списка атрибутов и их значений), экземпляра WebElement или WebElementExtended, словаря (атрибутов и их значений) или строки (XPath выражения). -
cousin
- Словарь атрибутов, определяющий искомого кузена. Ключи словаря - это названия атрибутов, значения - соответствующие значения этих атрибутов. -
contains
- Булевый флаг, который определяет, следует ли использовать функциюcontains
при формировании XPath выражения для поиска кузенов. ЕслиTrue
, то будет искаться частичное совпадение атрибутов. ЕслиFalse
, то будет искаться полное совпадение. По умолчаниюTrue
.
- Возвращает список экземпляров
WebElementExtended
, представляющих кузенов текущего элемента. Если кузены не найдены, возвращается пустой список.
# Ищем кузенов текущего элемента, имеющих класс 'desired-class' и находящихся на одинаковой глубине вложенности от общего предка с классом 'parent-class'
cousin_elements = app.get_cousins(ancestor={'class': 'parent-class'}, cousin={'class': 'desired-class'})
Этот метод проверяет, содержит ли текущий элемент другой элемент, определенный локатором locator
.
-
locator
- Локатор дочернего элемента. Может быть представлен в виде кортежа (списка атрибутов и их значений), экземпляра WebElement или WebElementExtended, словаря (атрибутов и их значений) или строки (XPath выражения). -
contains
- Булевый флаг, который определяет, следует ли использовать функциюcontains
при формировании XPath выражения для поиска элемента. ЕслиTrue
, то будет искаться частичное совпадение атрибутов. ЕслиFalse
, то будет искаться полное совпадение. По умолчаниюTrue
.
- Возвращает
True
, если текущий элемент содержит искомый дочерний элемент, иFalse
в противном случае.
# Проверяем, содержит ли текущий элемент дочерний элемент с классом 'child-class'
if app.is_contains(locator={'class': 'child-class'}):
print("Child element is present")
else:
print("Child element is not present")
Вызывает NotImplementedError
так как метод не реализован.
Этот метод в будущем реализует функцию увеличения (zoom) на элементе страницы.
-
hold
- Булевый параметр, который определяет, следует ли удерживать увеличение после его выполнения. ЕслиTrue
, увеличение будет удерживаться. ЕслиFalse
, увеличение не будет удерживаться после выполнения действия.
- Вызывает
NotImplementedError
так как метод не реализован.
Метод не реализован
Вызывает NotImplementedError
так как метод не реализован.
Этот метод в будущем реализует функцию увеличения (zoom) на элементе страницы.
-
hold
- Булевый параметр, который определяет, следует ли удерживать увеличение после его выполнения. ЕслиTrue
, увеличение будет удерживаться. ЕслиFalse
, увеличение не будет удерживаться после выполнения действия.
- Вызывает
NotImplementedError
так как метод не реализован.
Метод не реализован
Этот метод вычисляет координаты центра текущего элемента страницы.
- Возвращает кортеж в формате
(x, y)
, гдеx
иy
- это координаты центра элемента. Если во время выполнения произошла ошибка, метод вернётNone
.
# Получаем координаты центра элемента
center_coordinates = element.get_center()
# Печатаем координаты центра
if center_coordinates is not None:
print("The center of the element is located at: ", center_coordinates)
else:
print("An error occurred while getting the center of the element.")
Этот метод используется для получения координат текущего элемента веб-страницы.
-
Возвращает кортеж в формате
(left, top, right, bottom)
, где:-
left
- расстояние от левого края окна браузера до левого края элемента, -
top
- расстояние от верхнего края окна браузера до верхнего края элемента, -
right
- расстояние от левого края окна браузера до правого края элемента, -
bottom
- расстояние от верхнего края окна браузера до нижнего края элемента.
Если во время выполнения произошла ошибка, метод вернёт
None
. -
# Получаем координаты элемента
element_coordinates = element.get_coordinates()
# Печатаем координаты элемента
if element_coordinates is not None:
print("The coordinates of the element are: ", element_coordinates)
else:
print("An error occurred while getting the coordinates of the element.")
Класс AppiumServer
предназначен для управления сервером Appium. Он позволяет запускать и останавливать сервер Appium с заданными параметрами, проверять его доступность и логировать процесс.
-
logger
: Объект для записи логов, основанный на настройках, указанных вconfig.APPIUM_LOG_NAME
. -
port
: Порт, на котором будет запущен сервер Appium. По умолчанию равен4723
. -
log_level
: Уровень детализации логирования. По умолчанию равен'error'
.
Инициализирует новый экземпляр класса AppiumServer
.
Параметры:
-
port: int
- Порт, на котором будет запущен сервер Appium. По умолчанию равен4723
. -
log_level: str
- Уровень детализации логирования. По умолчанию равен'error'
.
Этот метод запускает сервер Appium.
Метод не принимает параметров.
-
bool
: ВозвращаетTrue
, если сервер Appium был успешно запущен. В противном случае возвращаетFalse
.
# Запустить сервер Appium
is_started = app.start()
Метод запускает команду appium server
с рядом параметров в отдельном подпроцессе, используя subprocess.Popen
. Если процесс запуска успешен, метод возвращает True
. В случае исключения типа subprocess.CalledProcessError
или OSError
, метод записывает ошибку в лог и возвращает False
.
Этот метод проверяет статус сервера Appium.
Метод не принимает параметров.
-
bool
: ВозвращаетTrue
, если сервер Appium доступен и готов к использованию. В противном случае возвращаетFalse
.
# Проверить статус сервера Appium
is_ready = app.is_alive()
Метод отправляет GET-запрос на "http://127.0.0.1:4723/wd/hub/sessions" для проверки статуса сервера Appium. Если сервер отвечает с кодом статуса 200, метод возвращает True
. Если сервер отвечает с другим кодом статуса, метод записывает предупреждение в лог и возвращает False
. В случае исключения requests.exceptions.RequestException
, метод записывает ошибку в лог и возвращает False
.
Этот метод останавливает сервер Appium.
Метод не принимает параметров.
-
bool
: ВозвращаетTrue
, если сервер Appium был успешно остановлен. В противном случае возвращаетFalse
.
# Остановить сервер Appium
is_stopped = app.stop()
Метод запускает команду 'taskkill /F /IM node.exe' в подпроцессе, используя subprocess.check_output
. Если процесс остановки успешен, метод возвращает True
. В случае исключения типа subprocess.CalledProcessError
, метод возвращает False
.
Этот метод ожидает, пока сервер Appium не станет доступным.
-
timeout
(int
, необязательный): Максимальное время ожидания в секундах, в течение которого метод будет проверять статус сервера. Значение по умолчанию:60
. -
poll
(int
, необязательный): Интервал времени в секундах между проверками статуса сервера. Значение по умолчанию:2
.
-
bool
: ВозвращаетTrue
, если сервер Appium стал доступным в течение заданного времени ожидания. В противном случае возвращаетFalse
.
# Ожидать, пока сервер Appium не станет доступным в течение 60 секунд с интервалом проверки 2 секунды
is_ready = app.wait_until_alive(timeout=60, poll=2)
Метод использует вспомогательный метод is_alive()
для проверки статуса сервера. Он будет продолжать проверку статуса сервера каждые poll
секунд в течение timeout
секунд или до тех пор, пока сервер не станет доступным. Если сервер становится доступным в течение времени ожидания, метод возвращает True
. Если сервер так и не становится доступным после истечения времени ожидания, метод возвращает False
.
Этот класс предоставляет функционал навигации для приложения, управляемого через сервер Appium.
-
app
(AppiumExtended
): Экземпляр классаAppiumExtended
, который предоставляет API для взаимодействия с сервером Appium. -
graph_manager
(AppiumGraph
): Объект для управления графом приложения. -
logger
(logging.Logger
): Логгер для записи логов. -
image
(AppiumImage
): Объект для работы с изображениями в контексте Appium.
Инициализирует новый экземпляр класса AppiumNavigator
.
Параметры:
-
app
(AppiumExtended
): Экземпляр классаAppiumExtended
, который предоставляет API для взаимодействия с сервером Appium.
Этот метод добавляет вершину в граф навигации приложения.
-
page
(str
): Название страницы (экрана или окна), которую нужно добавить в граф. -
edges
(List[str]
): Список страниц (экранов или окон), к которым можно перейти с текущей страницы. Страницы представлены их названиями.
Метод не возвращает значения.
# Добавить новую страницу в граф навигации приложения
navigator.add_page(page='HomePage', edges=['SettingsPage', 'ProfilePage'])
Метод использует graph_manager
для добавления новой вершины в граф навигации приложения. Вершина представляет собой страницу (экран / окно) в приложении. Метод принимает название страницы и список других страниц, к которым можно перейти с текущей страницы.
Этот метод выполняет навигацию от текущей страницы к указанной целевой странице в приложении.
-
current_page
(Type[YourPageClass]
): Класс текущей страницы, на которой находится пользователь. -
destination_page
(Type[YourPageClass]
): Класс целевой страницы, на которую пользователь хочет перейти. -
timeout
(int
, необязательный): Максимальное время ожидания перехода, по умолчанию 55 секунд.
Метод не возвращает значения.
-
ValueError
: Если не удается найти путь от текущей страницы к целевой странице.
# Перейти с главной страницы на страницу настроек
navigator.navigate(current_page=HomePage, destination_page=SettingsPage)
Метод использует поиск пути и последовательное выполнение шагов навигации, чтобы перейти от текущей страницы к целевой. Если указанная целевая страница совпадает с текущей, никаких действий не выполняется.
Вначале метод находит путь от текущей страницы к целевой с использованием find_path()
. Если путь не найден, генерируется исключение ValueError
. После того как путь найден, метод perform_navigation()
выполняет навигацию, следуя найденному пути.
Примечание: YourPageClass
в параметрах current_page
и destination_page
следует заменить на конкретные классы страниц в вашем приложении.
Этот метод использует поиск в ширину (BFS) для нахождения пути от стартовой страницы до целевой.
-
start_page
(Any
): Начальная страница поиска пути. -
target_page
(Any
): Целевая страница, которую нужно достичь.
-
Optional[List[Any]]
: Список страниц, образующих путь от стартовой до целевой страницы. Если путь не найден, возвращаетNone
.
# Найти путь от главной страницы до страницы настроек
path = navigator.find_path(start_page=HomePage, target_page=SettingsPage)
Метод обходит граф переходов между страницами, сохраняя текущий путь и посещенные страницы. Если стартовая страница совпадает с целевой, никаких действий не выполняется.
Вначале метод создает множество для отслеживания посещенных страниц и очередь для выполнения поиска в ширину. Затем, пока очередь не пуста, метод извлекает текущую страницу и путь от стартовой страницы до нее. Получает переходы (соседние страницы) для текущей страницы и проверяет каждую соседнюю страницу. Если соседняя страница является целевой, возвращает полный путь. Если соседняя страница не была посещена, добавляет ее в очередь для дальнейшего поиска. Если путь не найден, возвращает None
.
Примечание: start_page
и target_page
должны быть конкретными классами страниц в вашем приложении.
Этот метод выполняет навигацию по заданному пути.
-
path
(List[Any]
): Список страниц, образующих путь для навигации. Каждый элемент списка представляет страницу, а порядок элементов в списке определяет последовательность переходов от одной страницы к другой. -
timeout
(int
, необязательный): Максимальное время ожидания перехода, по умолчанию 55 секунд.
None
# Предположим, мы уже нашли путь от главной страницы до страницы настроек
path = [HomePage, MenuPage, SettingsPage]
# Выполняем навигацию по этому пути
navigator.perform_navigation(path)
Метод принимает список страниц, который представляет собой путь для навигации. Он выполняет переходы между соседними страницами, чтобы достичь целевой страницы. Проходит по пути и выполняет переходы между соседними страницами. Если метод перехода между текущей и следующей страницами не найден, выводит сообщение об ошибке. После выполнения каждого перехода ожидает появления изображения целевой страницы.
Примечания:
- Элементы списка
path
должны быть конкретными классами страниц в вашем приложении. - Рекомендуется вместо него использовать метод navigate()
#app_map.py
from pages.page_1 import page_1
from pages.page_2 import page_2
from pages.page_3 import page_3
class ExampleAppMap(AppiumExtended):
def __init__(self, logger: logging.Logger):
super().__init__(logger=logger)
# Инициализация страниц (PageObjects)
self.page_1 = Page1(self)
self.page_2 = Page2(self)
self.page_3 = Page3(self)
self.driver = None
self.navigator: AppiumNavigator = None
self.image: AppiumImage = None
self.keyboard: KeyboardMain = None
self.current_path = os.path.dirname(os.path.abspath(inspect.getframeinfo(inspect.currentframe()).filename))
self.page_images_path = os.path.join(self.current_path, ConstMapPath.FOLDER_TRANSACTION_IMAGES)
self.pages_ndarray_images = None
def connect(self,
capabilities: dict,
server_ip: str = '0.0.0.0',
server_port: int = 4723,
server_log_level: str = 'error',
remote: bool = False,
keep_alive_server: bool = True) -> None:
super().connect(capabilities=capabilities,
server_ip=server_ip,
server_port=server_port,
server_log_level=server_log_level,
remote=remote,
keep_alive_server=keep_alive_server)
# Инициализация необходимых объектов
self.navigator = AppiumNavigator(app=self, logger=self.logger)
self.keyboard = KeyboardMain(app=self, logger=self.logger)
self.image = self.helper
# Установка граней
self.page_1.edges = {
self.page_2: self.go_1_2,
}
self.page_2.edges = {
self.page_1: self.go_2_1,
self.page_3: self.go_2_3
}
self.page_3.edges = {
self.page_2 = self.go_3_2
}
# Добавление страниц и граней в граф
self.navigator.add_page(page=self.page_1,
edges=self.page_1.edges)
self.navigator.add_page(page=self.page_2,
edges=self.page_2.edges)
self.navigator.add_page(page=self.page_3,
edges=self.page_3.edges)
self.pages_ndarray_images = {
self.page_1: self._get_ndarray_images(self.page_1.page_images),
self.page_2: self._get_ndarray_images(self.page_2.page_images),
self.page_3: self._get_ndarray_images(self.page_3.page_images),
}
def go_1_2(self):
...
def go_2_1(self):
...
def go_2_3(self):
...
def go_3_2(self):
...
Структура файлов page: -pages -page_1 -action_images action_image_1.png action_image_2.png -images current_page_fragment_image_1.png current_page_fragment_image_2.png page_1.py
#page_1.py
class Page1(PageBase):
edges: list
def __init__(self, app):
super().__init__(app)
self.app = app
self.current_path = os.path.dirname(os.path.abspath(inspect.getframeinfo(inspect.currentframe()).filename))
self.page_images_path = os.path.join(self.current_path, 'images')
self.page_action_images_path = os.path.join(self.current_path, 'action_images')
self.page_images = self._get_page_images(self.page_images_path)
def is_current_page(self) -> bool:
return self._is_current_page(self.page_images)
def some_logic_on_page(self):
...
#page_base.py
class PageBase(object):
def __init__(self, app):
self.app: AppiumExtended = app
self.page_images_path: str
self.page_images: list[str]
self.logger = logging.getLogger(config.LOGGER_NAME)
def _is_current_page(self, page_images, max_attempts=3) -> bool:
attempts = 0
while attempts < max_attempts:
if len(page_images) == 0:
return False
all_images_found = True # Предполагаем, что все изображения найдены
for image in page_images:
if not self.app.image._is_image_on_the_screen(image=image):
all_images_found = False
break # Прерываем цикл, если хотя бы одно изображение не найдено
if all_images_found:
return True
attempts += 1
time.sleep(1) # Подождать 1 секунду перед следующей попыткой
return False
@staticmethod
def _get_page_images(page_images_path):
page_images = []
if os.path.exists(page_images_path):
page_images = os.listdir(page_images_path)
for index, image_name in enumerate(page_images):
page_images[index] = os.path.join(page_images_path, image_name)
return page_images
Класс
Статический метод, получает название пакета APK-файла с помощью команды aapt. Используется для извлечения информации о пакете из файла APK.
-
path_to_apk
: Путь до APK-файла, из которого требуется извлечь название пакета. Должен быть строкой, содержащей путь к файлу.
Возвращает строку, содержащую название пакета, извлеченное из APK-файла. Если название пакета не может быть извлечено, возвращается None
.
package_name = get_package_name(path_to_apk="/path/to/apk/file.apk")
print(package_name)
Этот метод выполняет системную команду с использованием утилиты aapt
(Android Asset Packaging Tool). В процессе работы создаются логи, которые сохраняются с использованием модуля logging
.
Метод может генерировать исключения, если указанный файл APK не найден, не может быть прочитан или не содержит ожидаемой информации о пакете. Все такие исключения должны быть обработаны в вызывающем коде. Дополнительно, если утилита aapt
не установлена или не доступна для вызова в системе, метод может не работать корректно.
Статический метод, получает название запускаемой активности из APK-файла с помощью команды aapt
. Используется для извлечения информации о запускаемой активности из файла APK.
-
path_to_apk
: Путь до APK-файла, из которого требуется извлечь название запускаемой активности. Должен быть строкой, содержащей путь к файлу.
Возвращает строку, содержащую название запускаемой активности, извлеченное из APK-файла. Если название активности не может быть извлечено, возвращается None
.
launchable_activity = YourClassName.get_launchable_activity(path_to_apk="/path/to/apk/file.apk")
print(launchable_activity)
Этот метод выполняет системную команду с использованием утилиты aapt
(Android Asset Packaging Tool). В процессе работы создаются логи, которые сохраняются с использованием модуля logging
.
Метод может генерировать исключения, если указанный файл APK не найден, не может быть прочитан или не содержит ожидаемой информации о запускаемой активности. Все такие исключения должны быть обработаны в вызывающем коде. Дополнительно, если утилита aapt
не установлена или не доступна для вызова в системе, метод может не работать корректно.
Пожалуйста, замените YourClassName
на имя вашего класса.
Класс отвечает за работу с устройством, командами adb подаваемыми через Appium server.
Этот метод класса Terminal
позволяет выполнить команду adb shell через драйвер Appium. Используется для взаимодействия с устройством на уровне adb.
-
command
: Команда adb shell, которую требуется выполнить. Должна быть строкой, представляющей собой команду adb shell. -
args
: Аргументы команды adb shell. Должны быть представлены в виде строки. По умолчанию, значение этого параметра — пустая строка.
Возвращает значение, возвращаемое драйвером Appium при выполнении скрипта. Тип возвращаемого значения может зависеть от конкретной команды adb shell, но, как правило, это строка, содержащая вывод выполненной команды.
output = Terminal(driver).adb_shell(command="pm list packages", args="-3")
print(output)
Этот метод использует возможности драйвера Appium для выполнения adb shell команд. В зависимости от команды и аргументов, которые передаются в этот метод, он может быть использован для выполнения широкого спектра задач, связанных с управлением устройством на уровне adb.
Метод может генерировать исключения, если указанная команда adb shell не может быть выполнена или возвращает ошибку. Все такие исключения должны быть обработаны в вызывающем коде.
Этот метод класса Terminal
позволяет копировать файл или директорию с локальной машины на подключенное устройство через Appium сервер.
-
source
: Путь к копируемому файлу или директории на локальной машине. Должен быть представлен в виде строки. -
destination
: Путь назначения на устройстве, куда будет скопирован файл или директория. Должен быть представлен в виде строки.
Возвращает True
, если файл или директория были успешно скопированы. В противном случае возвращается False
.
terminal = Terminal(driver)
copy_result = terminal.push(source="/local/path/to/file.txt", destination="/device/path/to/file.txt")
if copy_result:
print("File was successfully copied.")
else:
print("File copying failed.")
Этот метод использует возможности драйвера Appium для копирования файлов или директорий на подключенное устройство. В случае возникновения ошибок в процессе копирования (например, если исходный файл не существует или назначение недоступно), метод возвращает False
и записывает информацию об ошибке в лог.
Метод может генерировать исключение IOError
, если возникают проблемы с чтением исходного файла или записью в целевую директорию на устройстве. Это исключение обрабатывается внутри метода, и информация о нем записывается в лог.
Этот метод класса Terminal
позволяет извлекать файл с подключенного устройства и сохранять его на локальной машине через Appium сервер.
-
source
: Путь к файлу на устройстве, который требуется извлечь. Должен быть представлен в виде строки. -
destination
: Путь, по которому файл должен быть сохранен на локальной машине. Должен быть представлен в виде строки.
Возвращает True
, если файл успешно извлечен и сохранен на локальной машине. В противном случае возвращается False
.
terminal = Terminal(driver)
pull_result = terminal.pull(source="/device/path/to/file.txt", destination="/local/path/to/file.txt")
if pull_result:
print("File was successfully pulled.")
else:
print("File pulling failed.")
Этот метод использует возможности драйвера Appium для извлечения файлов с подключенного устройства. Сначала он извлекает файл с устройства в виде строки в формате base64, затем декодирует эту строку и записывает полученные данные в файл по указанному локальному пути. Если в процессе возникают ошибки (например, если исходный файл не существует или назначение недоступно), метод возвращает False
и записывает информацию об ошибке в лог.
Метод может генерировать исключение IOError
, если возникают проблемы с записью файла на локальной машине. Это исключение обрабатывается внутри метода, и информация о нем записывается в лог.
Этот метод класса Terminal
предназначен для запуска определенной активности в приложении на подключенном устройстве с использованием adb shell команды.
-
package
: Название пакета приложения, в котором находится активность. Должен быть представлен в виде строки. -
activity
: Название активности, которую нужно запустить. Должно быть представлено в виде строки.
Возвращает True
, если активность была успешно запущена. В противном случае возвращается False
.
terminal = Terminal(driver)
activity_started = terminal.start_activity(package="com.example", activity=".MainActivity")
if activity_started:
print("Activity was successfully started.")
else:
print("Activity starting failed.")
Метод использует adb shell команду am start
для запуска активности. В случае успешного выполнения команды метод возвращает True
. Если команда не может быть выполнена (например, если указанное приложение или активность не существуют), метод возвращает False
и записывает информацию об ошибке в лог.
Метод может генерировать исключение KeyError
, если в процессе выполнения adb shell команды возникают проблемы. Это исключение обрабатывается внутри метода, и информация о нем записывается в лог.
Метод класса Terminal
предназначен для получения имени пакета текущего запущенного приложения на подключенном устройстве.
Возвращает строку, содержащую имя пакета текущего запущенного приложения. В случае ошибки возвращает None
.
terminal = Terminal(driver)
current_app_package = terminal.get_current_app_package()
if current_app_package:
print(f"The current running app package is {current_app_package}.")
else:
print("Failed to get the current running app package.")
Метод использует команду adb shell dumpsys window windows
для получения информации о текущем активном окне на устройстве. Эта информация анализируется, и из неё извлекается имя пакета запущенного приложения. Если информацию не удалось извлечь (например, если нет активного окна или приложения), метод возвращает None
.
Метод может генерировать исключение KeyError
, если в процессе выполнения команды adb shell возникают проблемы. Это исключение обрабатывается внутри метода, и информация о нем записывается в лог.
Метод класса Terminal
, который принудительно закрывает приложение на подключенном устройстве с помощью указанного имени пакета.
-
package
: Строка, содержащая имя пакета приложения, которое необходимо закрыть.
Возвращает True
, если приложение было успешно закрыто, и False
в противном случае.
terminal = Terminal(driver)
if terminal.close_app("com.example.myapp"):
print("The app was successfully closed.")
else:
print("Failed to close the app.")
Метод использует команду adb shell am force-stop
, чтобы принудительно остановить приложение с указанным именем пакета.
Метод может генерировать исключение KeyError
, если в процессе выполнения команды adb shell возникают проблемы. Это исключение обрабатывается внутри метода, и информация о нем записывается в лог.
Метод класса Terminal
, который перезапускает указанное приложение, сначала принудительно закрывая его, а затем запуская указанную активность.
-
package
: Строка, содержащая имя пакета приложения, которое необходимо перезапустить. -
activity
: Строка, содержащая имя активности приложения, которую необходимо запустить.
Возвращает True
, если перезапуск приложения выполнен успешно, и False
в противном случае.
terminal = Terminal(driver)
if terminal.reboot_app("com.example.myapp", "com.example.myapp.MainActivity"):
print("The app was successfully rebooted.")
else:
print("Failed to reboot the app.")
Этот метод сначала закрывает приложение с использованием метода close_app()
, а затем пытается его перезапустить с использованием метода start_activity()
. Если какой-либо из этих методов возвращает False
, метод reboot_app()
также вернет False
.
Метод может генерировать исключение, если в процессе его выполнения возникают проблемы. В частности, если методы close_app()
или start_activity()
возвращают False
, метод reboot_app()
также вернет False
.
Метод класса Terminal
, который удаляет указанное приложение с помощью ADB (Android Debug Bridge).
-
package
: Строка, содержащая имя пакета приложения, которое необходимо удалить.
Возвращает True
, если приложение успешно удалено, и False
в противном случае.
terminal = Terminal(driver)
if terminal.uninstall_app("com.example.myapp"):
print("The app was successfully uninstalled.")
else:
print("Failed to uninstall the app.")
Этот метод использует метод remove_app()
из driver
для удаления приложения. Если удаление успешно, метод remove_app()
не возвращает значение, в противном случае он может вызвать исключение.
Метод может генерировать исключение, если в процессе его выполнения возникают проблемы. Если метод remove_app()
вызывает исключение, это исключение будет логироваться, а метод uninstall_app()
вернет False
.
Метод класса Terminal
, который устанавливает указанное приложение с помощью Appium.
-
app_path
: Строка, содержащая путь до APK-файла приложения, которое необходимо установить.
Возвращает True
, если приложение успешно установлено, и False
в противном случае.
terminal = Terminal(driver)
if terminal.install_app("/path/to/myapp.apk"):
print("The app was successfully installed.")
else:
print("Failed to install the app.")
Этот метод использует метод install_app()
из driver
для установки приложения. Если установка успешна, метод install_app()
не возвращает значение, в противном случае он может вызвать исключение.
Метод может генерировать исключение, если в процессе его выполнения возникают проблемы. Если метод install_app()
вызывает исключение, это исключение будет логироваться, а метод install_app()
вернет False
.
Метод класса Terminal
, предназначенный для проверки установки указанного пакета приложения с помощью Appium.
-
package
(тип:str
): Имя пакета приложения, для которого нужно проверить установку.
Возвращает значение True
, если указанный пакет приложения установлен на устройстве, и False
в противном случае.
terminal = Terminal(driver)
if terminal.is_app_installed("com.example.myapp"):
print("The app is installed.")
else:
print("The app is not installed.")
Метод is_app_installed()
использует команду pm list packages
для получения списка установленных пакетов приложений. Затем он фильтрует список и проверяет, содержится ли указанный пакет среди установленных. Если пакет найден в списке, метод вернет True
, в противном случае вернет False
.
Метод может вызывать исключение типа KeyError
, если в процессе выполнения возникли проблемы с доступом к списку пакетов. В случае возникновения исключения, оно будет залогировано, и метод is_app_installed()
вернет значение False
.
Примечание: Для корректной работы метода is_app_installed()
, убедитесь, что устройство подключено к Appium и правильно настроено для выполнения команд через ADB.
Метод класса Terminal
, который эмулирует нажатие кнопки "Домой" на устройстве, используя Android Debug Bridge (ADB).
Метод не принимает никаких параметров.
Возвращает True
, если команда была успешно выполнена, и False
в противном случае.
terminal = Terminal(driver)
if terminal.press_home():
print("Home button was successfully pressed.")
else:
print("Failed to press the home button.")
Этот метод отправляет команду input_keycode
с кодом "KEYCODE_HOME" к драйверу Appium. Если команда выполнена успешно, метод input_keycode
не возвращает значение, в противном случае он может вызвать исключение.
Метод может вызвать исключение, если возникают проблемы при выполнении его. Если метод input_keycode
вызывает исключение, это исключение будет залогировано, а метод press_home()
вернет False
.
Метод класса Terminal
, который эмулирует нажатие кнопки "Назад" на устройстве, используя Android Debug Bridge (ADB).
Метод не принимает никаких параметров.
Возвращает True
, если команда была успешно выполнена, и False
в противном случае.
terminal = Terminal(driver)
if terminal.press_back():
print("Back button was successfully pressed.")
else:
print("Failed to press the back button.")
Этот метод отправляет команду input_keycode
с кодом "KEYCODE_BACK" к драйверу Appium. Если команда выполнена успешно, метод input_keycode
не возвращает значение, в противном случае он может вызвать исключение.
Метод может вызвать исключение, если возникают проблемы при выполнении его. Если метод input_keycode
вызывает исключение, это исключение будет залогировано, а метод press_back()
вернет False
.
Метод класса Terminal
, который эмулирует нажатие кнопки "Меню" на устройстве, используя Android Debug Bridge (ADB).
Метод не принимает никаких параметров.
Возвращает True
, если команда была успешно выполнена, и False
в противном случае.
terminal = Terminal(driver)
if terminal.press_menu():
print("Menu button was successfully pressed.")
else:
print("Failed to press the menu button.")
Этот метод отправляет команду input_keycode
с кодом "KEYCODE_MENU" к драйверу Appium. Если команда выполнена успешно, метод input_keycode
не возвращает значение, в противном случае он может вызвать исключение.
Метод может вызвать исключение, если возникают проблемы при выполнении его. Если метод input_keycode
вызывает исключение, это исключение будет залогировано, а метод press_menu()
вернет False
.
Этот метод класса Terminal
имитирует нажатие клавиши на числовой клавиатуре устройства с использованием Android Debug Bridge (ADB).
Метод принимает следующие параметры:
-
num (int)
: числовое значение нажимаемой клавиши.
Возвращает True
, если команда была успешно выполнена, и False
в противном случае.
terminal = Terminal(driver)
if terminal.input_keycode_num_(5):
print("Клавиша с числом 5 была успешно нажата.")
else:
print("Не удалось нажать клавишу с числом 5.")
Этот метод отправляет команду adb_shell
с командой input
и аргументом keyevent KEYCODE_NUMPAD_{num}
в драйвер Appium. Если команда успешно выполнена, метод adb_shell
не возвращает значение, в противном случае, он может вызвать исключение.
Метод может вызвать исключение, если при его выполнении возникли проблемы. Если метод adb_shell
вызывает исключение, это исключение будет залогировано, и метод input_keycode_num_()
вернет False
.
Метод класса Terminal
, который имитирует ввод указанного кода клавиши на устройстве с помощью Android Debug Bridge (ADB).
Метод принимает следующий параметр:
-
keycode (str)
: код клавиши для ввода. Это может быть любой код клавиши, поддерживаемый ADB, включая, но не ограничиваясь, такими как "KEYCODE_HOME", "KEYCODE_BACK", "KEYCODE_MENU" и т. д.
Метод возвращает True
, если команда была успешно выполнена, и False
в противном случае.
terminal = Terminal(driver)
if terminal.input_keycode("KEYCODE_HOME"):
print("Клавиша Home была успешно нажата.")
else:
print("Не удалось нажать клавишу Home.")
Метод отправляет команду adb_shell
с командой input
и аргументом keyevent {keycode}
в драйвер Appium. Если команда успешно выполнена, метод adb_shell
не возвращает значение, в противном случае, он может вызвать исключение.
Метод может вызвать исключение KeyError
, если при его выполнении возникли проблемы. Если метод adb_shell
вызывает исключение, это исключение будет залогировано, и метод input_keycode()
вернет False
.
Метод класса Terminal
, который эмулирует ввод строки символов с помощью виртуальной клавиатуры на устройстве.
Метод принимает следующие параметры:
-
key (str)
: Строка символов, которые требуется ввести. -
keyboard (dict)
: Словарь, отображающий символы на координаты нажатия на экране. Ключами словаря являются символы, а значениями - кортежи, содержащие координаты x и y на экране для каждого символа.
Метод возвращает True
, если ввод символов был выполнен успешно, и False
в противном случае.
keyboard_mapping = {
"a": (100, 200),
"b": (120, 220),
...
}
terminal = Terminal(driver)
if terminal.input_by_virtual_keyboard("abc", keyboard_mapping):
print("Ввод символов 'abc' выполнен успешно.")
else:
print("Ошибка при вводе символов 'abc'.")
В данном методе используется функция tap()
, которая выполняет нажатие на указанные координаты на экране. Для каждого символа во входной строке метод вызывает функцию tap()
с координатами, соответствующими этому символу.
Метод может вызвать исключение KeyError
, если при его выполнении возникли проблемы, например, если указанный символ отсутствует в словаре keyboard
. Если метод tap()
вызывает исключение, это исключение будет залогировано, и метод input_by_virtual_keyboard()
вернет False
.
Метод класса Terminal
, который эмулирует ввод указанного текста на устройстве с использованием ADB (Android Debug Bridge).
Метод принимает следующий параметр:
-
text (str)
: Строка текста, которую нужно ввести на устройстве.
Метод возвращает True
, если команда была успешно выполнена, и False
в противном случае.
terminal = Terminal(driver)
if terminal.input_text("Hello, world!"):
print("Текст 'Hello, world!' успешно введен.")
else:
print("Ошибка при вводе текста 'Hello, world!'.")
В данном методе используется функция adb_shell()
, которая отправляет ADB команду в shell Android устройства. С помощью ADB команды "input text" мы можем ввести текст на устройстве.
Метод может вызвать исключение KeyError
, если при его выполнении возникли проблемы. Если возникает исключение, оно будет залогировано, и метод input_text()
вернет False
.
Это метод класса Terminal
, который эмулирует нажатие на указанные координаты на устройстве с использованием ADB (Android Debug Bridge).
Метод принимает следующие параметры:
-
x (int)
: Координата по оси X точки, по которой нужно нажать. -
y (int)
: Координата по оси Y точки, по которой нужно нажать.
Метод возвращает True
, если команда была успешно выполнена, и False
в противном случае.
terminal = Terminal(driver)
if terminal.tap(200, 300):
print("Нажатие на координаты (200, 300) успешно выполнено.")
else:
print("Ошибка при нажатии на координаты (200, 300).")
В данном методе используется функция adb_shell()
, которая отправляет ADB команду в shell Android устройства. С помощью ADB команды "input tap" мы можем выполнить нажатие на определенные координаты экрана.
Метод может вызвать исключение KeyError
, если при его выполнении возникли проблемы. Если возникает исключение, оно будет залогировано, и метод tap()
вернет False
.
Это метод класса Terminal
, который эмулирует жест свайпа (или перетаскивания) с одной точки на экране до другой на устройстве с использованием ADB (Android Debug Bridge).
Метод принимает следующие параметры:
-
start_x (Union[str, int])
: Координата по оси X начальной точки свайпа. -
start_y (Union[str, int])
: Координата по оси Y начальной точки свайпа. -
end_x (Union[str, int])
: Координата по оси X конечной точки свайпа. -
end_y (Union[str, int])
: Координата по оси Y конечной точки свайпа. -
duration (int)
: Длительность свайпа в миллисекундах. По умолчанию равна 300 мс.
Метод возвращает True
, если команда была успешно выполнена, и False
в противном случае.
terminal = Terminal(driver)
if terminal.swipe(200, 300, 400, 500, 1000):
print("Свайп с координат (200, 300) до координат (400, 500) выполнен успешно.")
else:
print("Ошибка при выполнении свайпа.")
В данном методе используется функция adb_shell()
, которая отправляет ADB команду в shell Android устройства. С помощью ADB команды "input swipe" мы можем выполнить свайп по экрану от одних координат до других.
Метод может вызвать исключение KeyError
, если при его выполнении возникли проблемы. Если возникает исключение, оно будет залогировано, и метод swipe()
вернет False
.
Это метод класса Terminal
, который проверяет, активно ли VPN-соединение на устройстве, используя ADB (Android Debug Bridge).
Метод принимает следующий параметр:
-
ip_address (str)
: IP-адрес для проверки VPN-соединения. Если он не указан, то используется значение по умолчанию.
Метод возвращает True
, если VPN-соединение активно, и False
в противном случае.
terminal = Terminal(driver)
if terminal.check_vpn('192.168.0.1'):
print("VPN-соединение активно.")
else:
print("VPN-соединение не активно.")
В данном методе используется функция adb_shell()
, которая отправляет ADB команду в shell Android устройства. С помощью команды "netstat" мы можем проверить состояние сетевых соединений устройства.
Метод может вызвать исключение KeyError
, если при его выполнении возникли проблемы. Если возникает исключение, оно будет залогировано, и метод check_vpn()
вернет False
.
Это метод класса Terminal
, который останавливает выполнение logcat на устройстве, используя ADB (Android Debug Bridge).
Метод не принимает никаких параметров.
Метод возвращает True
, если выполнение logcat остановлено успешно, и False
в противном случае.
terminal = Terminal(driver)
if terminal.stop_logcat():
print("logcat остановлен успешно.")
else:
print("Не удалось остановить logcat.")
Метод stop_logcat()
сначала получает список всех выполняющихся процессов на устройстве с помощью команды ps
. Затем он проходит через этот список и отправляет сигнал SIGINT
каждому процессу logcat
, который он находит, чтобы остановить его.
Метод может вызвать исключение KeyError
, если при его выполнении возникли проблемы. Если возникает исключение, оно будет залогировано, и метод stop_logcat()
вернет False
.
Это метод класса Terminal
, который ищет и возвращает идентификатор процесса (PID) по его имени с помощью команды adb shell ps
.
-
name (str)
: Имя процесса, PID которого необходимо найти.
Метод возвращает int
или None
. Если процесс с указанным именем найден, метод возвращает его PID (как целое число). Если процесс не найден, метод возвращает None
.
terminal = Terminal(driver)
pid = terminal.know_pid("com.example.app")
if pid is not None:
print(f"PID процесса 'com.example.app': {pid}")
else:
print("Процесс 'com.example.app' не найден.")
Метод know_pid()
получает список всех выполняющихся процессов на устройстве с помощью команды adb shell ps
, затем проходит по этому списку и ищет процесс с указанным именем. Если такой процесс найден, метод возвращает его PID. Если процесс не найден, метод возвращает None
.
Метод не обрабатывает исключения и, таким образом, может вызвать любое исключение, которое может вызвать adb_shell(command)
.
Это метод класса Terminal
, который проверяет, существует ли процесс с указанным именем, используя команду adb shell ps
.
-
name (str)
: Имя процесса, которое требуется проверить на существование.
Метод возвращает bool
. Если процесс с указанным именем существует, метод возвращает True
. В противном случае, если процесс не найден, метод возвращает False
.
terminal = Terminal(driver)
if terminal.is_process_exist("com.example.app"):
print("Процесс 'com.example.app' существует.")
else:
print("Процесс 'com.example.app' не существует.")
Метод is_process_exist(name)
получает список всех выполняющихся процессов на устройстве с помощью команды adb shell ps
, затем проверяет, есть ли процесс с указанным именем в этом списке. Если процесс с заданным именем найден, метод возвращает True
, иначе возвращает False
.
Метод не обрабатывает исключения и, таким образом, может вызвать любое исключение, которое может возникнуть при выполнении adb_shell(command)
.
Примечание: В описании метода is_process_exist(name)
вместо is_process_exist() > True
и is_process_exist() > False
, используются логгеры для вывода отладочной информации. В реальной реализации эти строки не будут отображаться. Они присутствуют в данном контексте только для демонстрации логгирования.
Это метод класса Terminal
, который запускает процесс в фоновом режиме на устройстве Android.
-
command (str)
: Команда для выполнения на устройстве. -
args (str)
: Дополнительные аргументы для команды. По умолчанию""
. -
process (str)
: Название процесса, который будет запущен. По умолчанию""
. Если значениеprocess
равно""
, то не будет проверяться его запуск в системе.
Метод возвращает bool
. Если процесс был успешно запущен, метод возвращает True
. В противном случае, если процесс не удалось запустить или указанный процесс не был найден, метод возвращает False
.
terminal = Terminal(driver)
command_to_run = "my_background_command arg1 arg2"
if terminal.run_background_process(command_to_run, args="--option"):
print("Процесс был успешно запущен.")
else:
print("Произошла ошибка при запуске процесса или процесс не найден.")
Метод run_background_process(command, args="", process="")
выполняет переданную команду command
на устройстве Android с дополнительными аргументами args
. Команда запускается в фоновом режиме с использованием nohup
и перенаправлением вывода в /dev/null
для игнорирования вывода в консоль.
Если параметр process
не равен пустой строке, метод после запуска процесса проверяет его существование через метод is_process_exist(name=process)
. Если процесс не найден, метод вернет False
. В противном случае, если процесс успешно запущен или параметр process
равен пустой строке, метод вернет True
.
Метод может вызывать исключение KeyError
, и в таком случае он будет логировать ошибку и возвращать False
.
Это метод класса Terminal
, который посылает сигнал SIGINT процессу с указанным идентификатором процесса (PID), используя команду adb shell kill
.
-
pid (int)
: Идентификатор процесса (PID), который нужно остановить.
Метод возвращает bool
. Если команда выполнена успешно и процесс остановлен, возвращается True
. В противном случае - False
.
terminal = Terminal(driver)
pid = terminal.know_pid("com.example.app")
if pid is not None:
if terminal.kill_by_pid(pid):
print(f"Процесс с PID {pid} успешно остановлен.")
else:
print(f"Не удалось остановить процесс с PID {pid}.")
else:
print("Процесс 'com.example.app' не найден.")
Метод kill_by_pid()
отправляет команду kill -s SIGINT {pid}
на устройство через adb shell
для остановки процесса с указанным идентификатором процесса.
Метод обрабатывает исключение KeyError
, которое может быть вызвано методом adb_shell(command, args)
. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Terminal
предназначен для остановки всех процессов, соответствующих заданному имени или шаблону имени, с помощью команды adb shell pkill
.
-
name (str)
: Имя или шаблон имени процесса, который необходимо остановить.
Метод возвращает bool
. Если команда выполнена успешно и все процессы остановлены, возвращается True
. В противном случае - False
.
terminal = Terminal(driver)
if terminal.kill_all("com.example.app"):
print("Все процессы 'com.example.app' успешно остановлены.")
else:
print("Не удалось остановить все процессы 'com.example.app'.")
Метод kill_all()
отправляет команду pkill -f {name}
на устройство через adb shell
для остановки всех процессов, соответствующих заданному имени или шаблону имени.
Метод обрабатывает исключение KeyError
, которое может быть вызвано методом adb_shell(command, args)
. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Terminal
предназначен для удаления файлов из внутреннего хранилища устройства с помощью команды adb shell rm
.
-
path (str)
: Путь к папке во внутреннем хранилище, из которой необходимо удалить файлы.
Метод возвращает bool
. Если команда выполнена успешно и файлы удалены, возвращается True
. В противном случае - False
.
terminal = Terminal(driver)
if terminal.delete_files_from_internal_storage("/sdcard/Download/"):
print("Файлы успешно удалены из '/sdcard/Download/'.")
else:
print("Не удалось удалить файлы из '/sdcard/Download/'.")
Метод delete_files_from_internal_storage()
отправляет команду rm -rf {path}*
на устройство через adb shell
для удаления всех файлов в указанном каталоге.
Метод обрабатывает исключение KeyError
, которое может быть вызвано методом adb_shell(command, args)
. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Terminal
предназначен для удаления конкретного файла из внутреннего хранилища устройства с помощью команды adb shell rm
.
-
path (str)
: Путь к папке во внутреннем хранилище, из которой необходимо удалить файл. -
filename (str)
: Имя файла, который необходимо удалить.
Метод возвращает bool
. Если команда выполнена успешно и файл удален, возвращается True
. В противном случае - False
.
terminal = Terminal(driver)
if terminal.delete_file_from_internal_storage("/sdcard/Download/", "myfile.txt"):
print("Файл 'myfile.txt' успешно удален из '/sdcard/Download/'.")
else:
print("Не удалось удалить файл 'myfile.txt' из '/sdcard/Download/'.")
Метод delete_file_from_internal_storage()
отправляет команду rm -rf {path}/{filename}
на устройство через adb shell
для удаления указанного файла в указанном каталоге.
Метод обрабатывает исключение KeyError
, которое может быть вызвано методом adb_shell(command, args)
. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Terminal
предназначен для начала записи видео с экрана устройства.
-
**options (Any)
: Опциональные аргументы для настройки записи видео. Обратитесь к документации Appium для получения полного списка доступных параметров.
Метод возвращает bool
. Если запись видео успешно начата, возвращается True
. В противном случае - False
.
terminal = Terminal(driver)
if terminal.record_video():
print("Запись видео успешно начата.")
else:
print("Не удалось начать запись видео.")
Метод record_video()
использует метод start_recording_screen()
из библиотеки Appium для начала записи видео.
Метод обрабатывает исключение KeyError
, которое может быть вызвано методом start_recording_screen()
. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Terminal
предназначен для остановки записи видео с экрана устройства и возвращения записанного видео в формате base64.
-
**options (Any)
: Опциональные аргументы для настройки остановки записи видео. Эти могут включать параметры, такие как 'withFile' и другие. Обратитесь к документации Appium для получения полного списка доступных параметров.
Метод возвращает Union[bytes, None]
. Если запись видео успешно остановлена, возвращается видео в виде декодированных из base64 байтов. В противном случае возвращается None
.
terminal = Terminal(driver)
video_bytes = terminal.stop_video()
if video_bytes is not None:
with open('output.mp4', 'wb') as f:
f.write(video_bytes)
print("Видео успешно остановлено и сохранено.")
else:
print("Не удалось остановить запись видео.")
Метод stop_video()
использует метод stop_recording_screen()
из библиотеки Appium для остановки записи видео. Этот метод возвращает видео в виде строки, закодированной в base64. Метод stop_video()
затем декодирует эту строку в байты и возвращает их.
Метод обрабатывает исключение KeyError
, которое может быть вызвано методом stop_recording_screen()
. Если исключение возникает, оно логируется и метод возвращает None
.
Этот метод класса Terminal
предназначен для перезагрузки устройства с использованием ADB.
Метод не принимает никаких параметров.
Метод возвращает bool
. Если перезагрузка устройства успешно запущена, возвращается True
. В противном случае возвращается False
.
terminal = Terminal(driver)
if terminal.reboot():
print("Устройство успешно перезагружено.")
else:
print("Не удалось запустить перезагрузку устройства.")
Метод reboot()
использует команду reboot
ADB для перезагрузки устройства.
Метод обрабатывает исключение KeyError
, которое может быть вызвано методом adb_shell()
. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Terminal
предназначен для получения разрешения экрана устройства с использованием ADB.
Метод не принимает никаких параметров.
Метод возвращает кортеж из двух целых чисел (tuple[int, int]
) или None
. Кортеж содержит ширину и высоту экрана в пикселях. Если происходит ошибка, возвращается None
.
terminal = Terminal(driver)
resolution = terminal.get_screen_resolution()
if resolution:
print(f"Разрешение экрана устройства: {resolution[0]}x{resolution[1]}")
else:
print("Не удалось получить разрешение экрана.")
Метод get_screen_resolution()
использует команду wm size
ADB для получения разрешения экрана устройства.
Метод обрабатывает исключение KeyError
, которое может быть вызвано методом adb_shell()
. Если исключение возникает, оно логируется и метод возвращает None
.
Предназначен для взаимодействия с Android Debug Bridge (ADB). Этот класс будет использовать для выполнения различных команд на устройстве Android.
Этот метод класса Adb
предназначен для установки приложения на устройство с использованием ADB.
Метод принимает следующие параметры:
-
apk_path (str)
: Путь к APK-файлу приложения на компьютере.
Метод возвращает True
(bool
), если приложение успешно установлено, и False
в противном случае.
adb = Adb()
if adb.install_app("path_to_apk"):
print("Приложение успешно установлено.")
else:
print("Не удалось установить приложение.")
Метод install_app()
использует команду adb install
для установки APK-файла на устройство.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может быть вызвано методом subprocess.check_output()
. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для проверки, установлено ли указанное приложение на подключенном устройстве Android с использованием ADB.
Метод принимает следующий параметр:
-
package
(str
): Имя пакета приложения, которое нужно проверить.
Метод возвращает логическое значение bool
:
-
True
- если приложение установлено на устройстве. -
False
- если приложение не установлено на устройстве или произошла ошибка при проверке.
adb = Adb()
is_installed = adb.is_app_installed("com.example.app")
if is_installed:
print("Приложение установлено на устройстве.")
else:
print("Приложение не установлено на устройстве.")
Метод is_app_installed()
использует команду adb shell pm list packages
для получения списка всех установленных приложений на устройстве. Затем он проверяет, присутствует ли имя пакета в этом списке.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может быть вызвано методом subprocess.check_output()
. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для удаления приложения на подключенном устройстве Android.
Метод принимает следующий параметр:
-
package
(str
): Имя пакета приложения, которое вы хотите удалить.
Метод возвращает логическое значение bool
:
-
True
- если приложение было успешно удалено с устройства. -
False
- если произошла ошибка при удалении приложения.
adb = Adb()
success = adb.uninstall_app("com.example.app")
if success:
print("Приложение успешно удалено с устройства.")
else:
print("Не удалось удалить приложение с устройства.")
Метод uninstall_app()
использует команду adb uninstall
для удаления указанного приложения.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может возникнуть при попытке выполнить команду удаления приложения. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для получения модели подключенного устройства Android с использованием ADB.
Метод не принимает никаких параметров.
Метод возвращает модель устройства в виде строки (str
) или None
, если происходит ошибка при получении модели устройства.
adb = Adb()
model = adb.get_device_model()
if model:
print(f"Модель устройства: {model}")
else:
print("Не удалось получить модель устройства.")
Метод get_device_model()
использует команду adb shell getprop ro.product.model
для получения модели устройства.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может быть вызвано методом subprocess.check_output()
. Если исключение возникает, оно логируется и метод возвращает None
.
Этот метод класса Adb
предназначен для копирования файла или директории с вашего компьютера на подключенное устройство Android с использованием ADB.
Метод принимает следующие параметры:
-
source
(str
): Путь на вашем компьютере к файлу или директории, который вы хотите скопировать. -
destination
(str
): Путь назначения на устройстве, куда вы хотите скопировать файл или директорию.
Метод возвращает логическое значение bool
:
-
True
- если файл или директория были успешно скопированы на устройство. -
False
- если произошла ошибка при копировании файла или директории.
adb = Adb()
success = adb.push("/path/to/local/file.txt", "/path/to/device/file.txt")
if success:
print("Файл успешно скопирован на устройство.")
else:
print("Не удалось скопировать файл на устройство.")
Метод push()
использует команду adb push
для копирования файла или директории на устройство.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может быть вызвано методом subprocess.run()
. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для копирования файла или директории с подключенного устройства Android на ваш компьютер с использованием ADB.
Метод принимает следующие параметры:
-
source
(str
): Путь на устройстве к файлу или директории, которые вы хотите скопировать. -
destination
(str
): Путь назначения на вашем компьютере, куда вы хотите скопировать файл или директорию.
Метод возвращает логическое значение bool
:
-
True
- если файл или директория были успешно скопированы с устройства. -
False
- если произошла ошибка при копировании файла или директории.
adb = Adb()
success = adb.pull("/path/to/device/file.txt", "/path/to/local/file.txt")
if success:
print("Файл успешно скопирован с устройства.")
else:
print("Не удалось скопировать файл с устройства.")
Метод pull()
использует команду adb pull
для копирования файла или директории с устройства.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может быть вызвано методом subprocess.run()
. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для запуска конкретной активности на подключенном устройстве Android с использованием ADB.
Метод принимает следующие параметры:
-
package
(str
): Имя пакета активности, которую вы хотите запустить. -
activity
(str
): Имя активности, которую вы хотите запустить.
Метод возвращает логическое значение bool
:
-
True
- если активность была успешно запущена на устройстве. -
False
- если произошла ошибка при запуске активности.
adb = Adb()
success = adb.start_activity("com.example.app", "com.example.app.MainActivity")
if success:
print("Активность успешно запущена на устройстве.")
else:
print("Не удалось запустить активность на устройстве.")
Метод start_activity()
использует команду adb shell am start
для запуска активности на устройстве. Параметр -n
используется для указания имени активности в формате [package]/[activity]
.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может быть вызвано методом subprocess.check_output()
. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для принудительного завершения указанного пакета на подключенном устройстве Android с использованием ADB.
Метод принимает следующие параметры:
-
package
(str
): Имя пакета приложения, которое вы хотите закрыть.
Метод возвращает логическое значение bool
:
-
True
- если приложение было успешно закрыто на устройстве. -
False
- если произошла ошибка при закрытии приложения.
adb = Adb()
success = adb.close_app("com.example.app")
if success:
print("Приложение успешно закрыто на устройстве.")
else:
print("Не удалось закрыть приложение на устройстве.")
Метод close_app()
использует команду adb shell am force-stop
для принудительного завершения указанного пакета на устройстве.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может быть вызвано методом subprocess.run()
. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для перезапуска приложения на подключенном устройстве Android. Он делает это, закрывая приложение, а затем запуская указанную активность.
Метод принимает следующие параметры:
-
package
(str
): Имя пакета приложения, которое вы хотите перезапустить. -
activity
(str
): Имя активности внутри пакета приложения, которую вы хотите запустить после закрытия приложения.
Метод возвращает логическое значение bool
:
-
True
- если приложение было успешно перезапущено на устройстве. -
False
- если произошла ошибка при перезапуске приложения.
adb = Adb()
success = adb.reboot_app("com.example.app", "com.example.app.MainActivity")
if success:
print("Приложение успешно перезапущено на устройстве.")
else:
print("Не удалось перезапустить приложение на устройстве.")
Метод reboot_app()
использует методы close_app()
и start_activity()
класса Adb
для выполнения своей функции.
Метод не обрабатывает исключения напрямую, но вызываемые им методы close_app()
и start_activity()
обрабатывают исключения subprocess.CalledProcessError
. Если эти методы возвращают False
, что указывает на появление исключения, то reboot_app()
также возвращает False
.
Этот метод класса Adb
предназначен для отправки события нажатия кнопки Home на подключенном устройстве Android.
Метод не принимает никаких параметров.
Метод возвращает логическое значение bool
:
-
True
- если событие нажатия кнопки Home было успешно отправлено на устройство. -
False
- если произошла ошибка при отправке события.
adb = Adb()
success = adb.press_home()
if success:
print("Событие нажатия кнопки Home успешно отправлено.")
else:
print("Не удалось отправить событие нажатия кнопки Home.")
Метод press_home()
использует команду adb shell input keyevent KEYCODE_HOME
для отправки события нажатия кнопки Home.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может возникнуть при попытке выполнить команду отправки события. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для отправки события нажатия кнопки Back на подключенном устройстве Android.
Метод не принимает никаких параметров.
Метод возвращает логическое значение bool
:
-
True
- если событие нажатия кнопки Back было успешно отправлено на устройство. -
False
- если произошла ошибка при отправке события.
adb = Adb()
success = adb.press_back()
if success:
print("Событие нажатия кнопки Back успешно отправлено.")
else:
print("Не удалось отправить событие нажатия кнопки Back.")
Метод press_back()
использует команду adb shell input keyevent KEYCODE_BACK
для отправки события нажатия кнопки Back.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может возникнуть при попытке выполнить команду отправки события. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для отправки события нажатия кнопки Menu на подключенном устройстве Android.
Метод не принимает никаких параметров.
Метод возвращает логическое значение bool
:
-
True
- если событие нажатия кнопки Menu было успешно отправлено на устройство. -
False
- если произошла ошибка при отправке события.
adb = Adb()
success = adb.press_menu()
if success:
print("Событие нажатия кнопки Menu успешно отправлено.")
else:
print("Не удалось отправить событие нажатия кнопки Menu.")
Метод press_menu()
использует команду adb shell input keyevent KEYCODE_MENU
для отправки события нажатия кнопки Menu.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может возникнуть при попытке выполнить команду отправки события. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для отправки события нажатия числовой клавиши на подключенном устройстве Android.
-
num
(int): Числовое значение клавиши для нажатия. Допустимые значения: от 0 до 9 и специальные символы (ADD, COMMA, DIVIDE, DOT, ENTER, EQUALS).
Метод возвращает логическое значение bool
:
-
True
- если событие нажатия числовой клавиши было успешно отправлено на устройство. -
False
- если произошла ошибка при отправке события.
adb = Adb()
success = adb.input_keycode_num_(5)
if success:
print("Событие нажатия числовой клавиши успешно отправлено.")
else:
print("Не удалось отправить событие нажатия числовой клавиши.")
Метод input_keycode_num_()
использует команду adb shell input keyevent KEYCODE_NUMPAD_{num}
для отправки события нажатия числовой клавиши.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может возникнуть при попытке выполнить команду отправки события. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для ввода определенного кода клавиши на подключенном устройстве Android.
-
keycode
(str): Код клавиши для ввода. Примеры допустимых значений: "KEYCODE_HOME", "KEYCODE_BACK", "KEYCODE_VOLUME_UP" и т.д.
Метод возвращает логическое значение bool
:
-
True
- если команда ввода клавиши была успешно выполнена. -
False
- если произошла ошибка при выполнении команды.
adb = Adb()
success = adb.input_keycode("KEYCODE_HOME")
if success:
print("Команда ввода клавиши успешно выполнена.")
else:
print("Не удалось выполнить команду ввода клавиши.")
Метод input_keycode()
использует команду adb shell input keyevent {keycode}
для ввода кода клавиши на устройстве.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может возникнуть при попытке выполнить команду ввода клавиши. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для ввода строки символов с помощью виртуальной клавиатуры на подключенном устройстве Android.
-
text
(str): Строка символов для ввода. -
keyboard
(dict): Словарь с маппингом символов на координаты нажатий на виртуальной клавиатуре. Каждому символу в словаре соответствует кортеж из двух чисел, представляющих координаты нажатия (x, y).
Метод возвращает логическое значение bool
:
-
True
- если ввод выполнен успешно. -
False
- если произошла ошибка при вводе символов.
keyboard_mapping = {
'a': (100, 200),
'b': (150, 200),
# ...
}
adb = Adb()
success = adb.input_by_virtual_keyboard("ab", keyboard_mapping)
if success:
print("Ввод символов выполнен успешно.")
else:
print("Не удалось выполнить ввод символов.")
Метод input_by_virtual_keyboard()
использует функцию tap()
класса Adb
для ввода каждого символа, проходя по всем символам в заданной строке text
.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может возникнуть при попытке ввода символа. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для ввода текста на подключенном устройстве Android.
-
text
(str): Текст для ввода на устройстве.
Метод возвращает логическое значение bool
:
-
True
- если команда была успешно выполнена. -
False
- если произошла ошибка при выполнении команды.
adb = Adb()
success = adb.input_text("Hello, World!")
if success:
print("Ввод текста выполнен успешно.")
else:
print("Не удалось выполнить ввод текста.")
Метод input_text()
использует команду adb shell input text
для ввода текста на устройстве Android. Пожалуйста, убедитесь, что текст, который вы хотите ввести, не содержит специальных символов, которые могут нарушить работу команды ADB.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для совершения нажатия на экран устройства в заданных координатах.
-
x
(str, int): Координата по оси X, где требуется произвести нажатие. Может быть как числом, так и строкой. -
y
(str, int): Координата по оси Y, где требуется произвести нажатие. Может быть как числом, так и строкой.
Метод возвращает логическое значение bool
:
-
True
- если команда была успешно выполнена. -
False
- если произошла ошибка при выполнении команды.
adb = Adb()
success = adb.tap(100, 200)
if success:
print("Нажатие выполнено успешно.")
else:
print("Не удалось выполнить нажатие.")
Метод tap()
использует команду adb shell input tap
для совершения нажатия на экране устройства в указанных координатах.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для выполнения свайпа (перетаскивания) на экране устройства.
-
start_x
(str, int): Координата X начальной точки свайпа. Может быть как числом, так и строкой. -
start_y
(str, int): Координата Y начальной точки свайпа. Может быть как числом, так и строкой. -
end_x
(str, int): Координата X конечной точки свайпа. Может быть как числом, так и строкой. -
end_y
(str, int): Координата Y конечной точки свайпа. Может быть как числом, так и строкой. -
duration
(int, optional): Длительность свайпа в миллисекундах. По умолчанию равна 300.
Метод возвращает логическое значение bool
:
-
True
- если команда была успешно выполнена. -
False
- если произошла ошибка при выполнении команды.
adb = Adb()
success = adb.swipe(100, 200, 300, 400)
if success:
print("Свайп выполнен успешно.")
else:
print("Не удалось выполнить свайп.")
Метод swipe()
использует команду adb shell input swipe
для выполнения свайпа на экране устройства от начальной точки к конечной.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для получения названия пакета текущего запущенного приложения на устройстве.
Метод не требует параметров.
Метод возвращает строку, представляющую название пакета текущего запущенного приложения, или None
, если произошла ошибка.
adb = Adb()
package = adb.get_current_app_package()
if package:
print(f"Текущее приложение: {package}")
else:
print("Не удалось определить текущее приложение.")
Метод get_current_app_package()
использует команду adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' | grep -e 'mFo'
для получения информации о текущем запущенном приложении. Затем он анализирует результат этой команды, чтобы извлечь название пакета приложения.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, оно логируется и метод возвращает None
.
Этот метод класса Adb
предназначен для проверки, установлено ли VPN-соединение на устройстве.
-
ip_address
(str, по умолчанию''
): IP-адрес для проверки VPN-соединения. Если параметр не указан, используется значение из конфигурации.
Метод возвращает булевое значение: True
, если VPN-соединение активно, и False
в противном случае.
adb = Adb()
vpn_status = adb.check_vpn('192.168.1.1')
if vpn_status:
print("VPN-соединение активно.")
else:
print("VPN-соединение не активно.")
Метод check_vpn()
использует команду adb shell netstat | grep -w -e [ip_address]
для проверки активности VPN-соединения. Если в выводе команды присутствует слово "ESTABLISHED", метод возвращает True
, что означает, что VPN-соединение активно.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для остановки выполнения logcat
на устройстве.
Метод не принимает параметров.
Метод возвращает булевое значение: True
, если выполнение logcat
остановлено успешно, и False
в противном случае.
adb = Adb()
logcat_status = adb.stop_logcat()
if logcat_status:
print("logcat успешно остановлен.")
else:
print("Не удалось остановить logcat.")
Метод stop_logcat()
сначала использует команду adb shell ps | grep logcat
для получения списка процессов logcat
. Затем, для каждого найденного процесса, он отправляет сигнал SIGINT
, используя команду adb shell kill -s SIGINT [pid]
.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод класса Adb
предназначен для перезапуска adb-сервера на устройстве.
Метод не принимает параметров.
Метод возвращает булевое значение: True
, если adb-сервер успешно перезапущен, и False
в противном случае.
adb = Adb()
adb_status = adb.reload_adb()
if adb_status:
print("adb-сервер успешно перезапущен.")
else:
print("Не удалось перезапустить adb-сервер.")
Метод reload_adb()
сначала использует команду adb kill-server
для остановки adb-сервера. Затем, после паузы в три секунды, используется команда adb start-server
для перезапуска adb-сервера.
Метод обрабатывает исключение subprocess.CalledProcessError
, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, оно логируется и метод возвращает False
.
Этот метод находит Process ID (PID) процесса по его имени, используя adb shell ps
.
Метод принимает следующие параметры:
-
name
: Имя процесса, PID которого нужно найти.
Метод возвращает PID процесса, если он найден, или None
, если процесс не найден.
adb = Adb()
process_pid = adb.know_pid("my_process")
if process_pid:
print("PID процесса 'my_process' найден.")
else:
print("Процесс 'my_process' не найден.")
Метод know_pid()
выполняет команду adb shell ps
и затем проходит через вывод, пытаясь найти строку, которая содержит имя указанного процесса. Если такая строка найдена, метод извлекает PID из этой строки и возвращает его.
Метод обрабатывает исключение, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, информация об ошибке логируется и метод возвращает False
. Также, если процесс с указанным именем не найден, метод возвращает None
.
Этот метод находит Process ID (PID) процесса по его имени, используя adb shell ps
.
Метод принимает следующие параметры:
-
name
(str): Имя процесса, PID которого нужно найти.
Метод возвращает PID процесса, если он найден, или None
, если процесс не найден.
adb = Adb()
process_pid = adb.know_pid("my_process")
if process_pid:
print("PID процесса 'my_process' найден.")
else:
print("Процесс 'my_process' не найден.")
Метод know_pid()
выполняет команду adb shell ps
и затем проходит через вывод, пытаясь найти строку, которая содержит имя указанного процесса. Если такая строка найдена, метод извлекает PID из этой строки и возвращает его.
Метод обрабатывает исключение, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, информация об ошибке логируется и метод возвращает False
. Также, если процесс с указанным именем не найден, метод возвращает None
.
Проверяет, запущен ли процесс, используя adb shell ps
.
-
name
(str): Имя процесса.
Метод возвращает True
, если процесс с указанным именем существует, и False
в ином случае.
adb = Adb()
if adb.is_process_exist("my_process"):
print("Процесс 'my_process' существует.")
else:
print("Процесс 'my_process' не существует.")
Данный метод is_process_exist()
используется внутри метода know_pid()
для определения наличия процесса с заданным именем.
Запускает процесс в фоновом режиме на устройстве Android с использованием ADB.
-
command
(str): Команда для выполнения на устройстве. -
process
(str): Название процесса, который будет запущен. По умолчанию пустая строка (""
). Еслиprocess == ""
, то не будет проверяться его запуск в системе.
Метод возвращает True
, если процесс был успешно запущен, и False
в противном случае.
adb = Adb()
command = "my_script.sh"
process_name = "my_process"
if adb.run_background_process(command, process_name):
print(f"Процесс '{process_name}' был успешно запущен.")
else:
print(f"Не удалось запустить процесс '{process_name}'.")
Метод run_background_process()
запускает процесс в фоновом режиме на устройстве Android с использованием команды adb shell
и nohup
для выполнения команды без привязки к текущей сессии терминала. Вывод команды перенаправляется в /dev/null
, чтобы не создавать логов в текущей сессии.
Если указан аргумент process
, метод проверяет наличие процесса с указанным именем, используя метод is_process_exist(name)
, чтобы убедиться, что процесс был успешно запущен.
В случае возникновения исключения при выполнении команды, метод возвращает False
, а также логирует информацию об ошибке.
Этот метод отправляет сигнал SIGINT для остановки процесса по указанному идентификатору PID с помощью ADB.
Метод принимает следующий параметр:
-
pid
: Идентификатор PID процесса для остановки.
Метод возвращает True
, если процесс успешно остановлен, и False
в противном случае.
adb = Adb()
process_status = adb.kill_by_pid("1234")
if process_status:
print("Процесс с PID '1234' успешно остановлен.")
else:
print("Не удалось остановить процесс с PID '1234'.")
Метод kill_by_pid()
выполняет команду adb shell kill -s SIGINT <pid>
, чтобы отправить сигнал SIGINT указанному процессу. Этот сигнал останавливает процесс.
Метод обрабатывает исключение, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, информация об ошибке логируется и метод возвращает False
.
Этот метод останавливает все процессы с указанным именем на устройстве с помощью ADB.
Метод принимает следующий параметр:
-
name
: Имя процесса для остановки.
Метод возвращает True
, если все процессы успешно остановлены, и False
в противном случае.
adb = Adb()
process_status = adb.kill_by_name("my_process")
if process_status:
print("Все процессы с именем 'my_process' успешно остановлены.")
else:
print("Не удалось остановить процессы с именем 'my_process'.")
Метод kill_by_name()
выполняет команду adb shell pkill -l SIGINT <name>
, чтобы остановить все процессы с указанным именем.
Метод обрабатывает исключение, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, информация об ошибке логируется и метод возвращает False
.
Этот метод останавливает все процессы, соответствующие указанному имени или шаблону имени, на устройстве с помощью ADB.
Метод принимает следующий параметр:
-
name
: Имя процесса или шаблон имени для остановки.
Метод возвращает True
, если все процессы успешно остановлены, и False
в противном случае.
adb = Adb()
process_status = adb.kill_all("my_process")
if process_status:
print("Все процессы, соответствующие имени 'my_process', успешно остановлены.")
else:
print("Не удалось остановить процессы, соответствующие имени 'my_process'.")
Метод kill_all()
выполняет команду adb shell pkill -f <name>
, чтобы остановить все процессы, соответствующие указанному имени или шаблону имени.
Метод обрабатывает исключение, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, информация об ошибке логируется и метод возвращает False
.
Этот метод удаляет файлы из внутреннего хранилища устройства с помощью ADB.
Метод принимает следующий параметр:
-
path
: Путь к файлам для удаления.
Метод возвращает True
, если файлы успешно удалены, и False
в противном случае.
adb = Adb()
delete_status = adb.delete_files_from_internal_storage("/sdcard/MyFiles/")
if delete_status:
print("Файлы успешно удалены из '/sdcard/MyFiles/'.")
else:
print("Не удалось удалить файлы из '/sdcard/MyFiles/'.")
Метод delete_files_from_internal_storage()
выполняет команду adb shell rm -rf <path>*
для удаления всех файлов в указанной директории.
Метод обрабатывает исключение, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, информация об ошибке логируется и метод возвращает False
.
Этот метод копирует видеофайлы с устройства на компьютер с помощью ADB.
Метод принимает следующие параметры:
-
wherefrom
(необязательный): Путь к исходной директории на устройстве, откуда нужно скопировать видеофайлы. Если не указан, по умолчанию используется путь '/sdcard/Movies/'. -
destination
: Путь для сохранения скопированных видеофайлов на компьютере. -
delete
(необязательный): Флаг, указывающий, следует ли удалять видеофайлы после копирования с устройства. По умолчанию значениеTrue
.
Метод возвращает True
, если видеофайлы успешно скопированы, и False
в противном случае.
adb = Adb()
copy_status = adb.pull_video("/sdcard/MyVideos/", "/home/user/Videos/")
if copy_status:
print("Видеофайлы успешно скопированы в '/home/user/Videos/'.")
else:
print("Не удалось скопировать видеофайлы в '/home/user/Videos/'.")
Метод pull_video()
сначала выполняет команду adb pull <wherefrom> <destination>
для копирования видеофайлов из указанной директории на устройстве в указанную директорию на компьютере. Если флаг delete
установлен в True
, после копирования видеофайлы удаляются из исходной директории на устройстве командой adb shell rm -rf <wherefrom>*
.
Метод обрабатывает исключение, которое может возникнуть при попытке выполнить команды ADB. Если исключение возникает при выполнении любой из команд, информация об ошибке логируется и метод возвращает False
.
Этот метод останавливает запись видео на устройстве с помощью ADB.
Метод не принимает никаких параметров.
Метод возвращает True
, если запись видео успешно остановлена, и False
в противном случае.
adb = Adb()
stop_status = adb.stop_video()
if stop_status:
print("Запись видео успешно остановлена.")
else:
print("Не удалось остановить запись видео.")
Метод stop_video()
выполняет команду adb shell pkill -l SIGINT screenrecord
для остановки записи видео.
Метод обрабатывает исключение, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, информация об ошибке логируется и метод возвращает False
.
Этот метод начинает запись видео на устройстве с помощью ADB.
-
filename
(str
): Имя файла, в который будет сохранено видео на устройстве.
Метод возвращает True
, если запись видео успешно начата, и False
в противном случае.
adb = Adb()
record_status = adb.record_video("test_video.mp4")
if record_status:
print("Запись видео успешно начата.")
else:
print("Не удалось начать запись видео.")
Метод record_video()
выполняет команду adb shell screenrecord /sdcard/Movies/{filename}
, чтобы начать запись видео.
Метод обрабатывает исключение, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, информация об ошибке логируется и метод возвращает False
.
Этот метод перезагружает устройство с помощью ADB.
Метод не принимает никаких параметров.
Метод возвращает True
, если перезагрузка устройства успешно запущена, и False
в противном случае.
adb = Adb()
reboot_status = adb.reboot()
if reboot_status:
print("Перезагрузка устройства успешно запущена.")
else:
print("Не удалось запустить перезагрузку устройства.")
Метод reboot()
выполняет команду adb shell reboot
, чтобы перезагрузить устройство.
Метод обрабатывает исключение, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, информация об ошибке логируется и метод возвращает False
.
Этот метод возвращает разрешение экрана устройства с использованием ADB.
Метод не принимает никаких параметров.
Метод возвращает кортеж с двумя целыми числами, представляющими ширину и высоту экрана в пикселях. Если при выполнении возникает ошибка, метод возвращает None
.
adb = Adb()
screen_resolution = adb.get_screen_resolution()
if screen_resolution:
width, height = screen_resolution
print(f"Разрешение экрана устройства: {width}x{height}.")
else:
print("Не удалось получить разрешение экрана устройства.")
Метод get_screen_resolution()
выполняет команду adb shell wm size
, чтобы получить физическое разрешение экрана устройства.
Метод обрабатывает исключение, которое может возникнуть при попытке выполнить команду ADB. Если исключение возникает, информация об ошибке логируется и метод возвращает None
.