Миграция автотестов на новые версии Appium Python Client
В версиях ОС Аврора выше 5.2.0 qtium-driver обновлен для использования более современной версии Appium (2.15.0). Для написания автотестов c новым Appium нужно использовать более современные клиентские библиотеки.
В данном руководстве рассматриваются изменения для автотестов, ранее работавших с appium-python-client
версии 0.36
.
В результате внесения изменений можно будет работать с appium-python-client
версий 4.5.0
и выше.
Предварительные условия
Для успешной работы c новым qtium-driver необходимо обновить окружение согласно инструкции.
Требуемые изменения кода
Изменения инициализации драйвера
Инициализация обьекта драйвера изменилась.
Вместо передачи capabilities
напрямую:
from appium import webdriver
appium_server_url = f'http://localhost:4723/wd/hub'
appium_server_capabilities = {
'platformName': 'Aurora',
'platformVersion': '2.2',
'newCommandTimeout': 86400,
'appPackage': 'ru.auroraos.ApplicationTemplate',
'deviceName': '192.168.2.15',
'autoLaunch': False
}
driver = webdriver.Remote(appium_server_url, appium_server_capabilities)
Теперь используется метод инициализации через обьект AppiumOptions
:
from appium import webdriver
from appium.options.common import AppiumOptions
appium_server_url = f'http://localhost:4723'
appium_server_capabilities = {
'automationName': 'Aurora', # New Mandatory Capability
'platformName': 'Aurora',
'platformVersion': '2.2',
'newCommandTimeout': 86400,
'appPackage': 'ru.auroraos.ApplicationTemplate',
'deviceName': '192.168.2.15',
'autoLaunch': False,
'appiumInspector': False, # New Optional Capability
}
appium_driver_options = AppiumOptions().load_capabilities(appium_server_capabilities)
driver = webdriver.Remote(appium_server_url, options=appium_driver_options)
Следует обратить внимание на добавленные capabilities
:
automationName
— обязательный параметр, для которого всегда устанавливается значениеAurora
.appiumInspector
— опциональный параметр, нужен для облегчения работы с интерфейсом Appium Inspector. В случае создания драйвера в Appium Inspector для него необходимо устанавливать значениеTrue
, в противном случаеFalse
.
Также следует обратить внимание на изменение URL для сервера — новый URL не содержит /wd/hub
.
Изменения запуска приложений
Метод launch_app
более не поддерживается, вместо него надо использовать метод activate_app
:
# driver.launch_app('ru.auroraos.ApplicationTemplate') # Устарело, некорректно
driver.activate_app('ru.auroraos.ApplicationTemplate') # Корректно
Методы долгое время дублировали друг друга, семантической разницы между ними нет.
Изменения методов поиска элементов
Методы поиска элементов вида:
driver.find_elements_by_class_name('Button')
driver.find_elements_by_xpath('//Button')
driver.find_element_by_id('rootWindow')
Требуется заменить на аналогичные:
from selenium.webdriver.common.by import By
driver.find_elements(By.CLASS_NAME, 'Button')
driver.find_elements(By.XPATH, '//Button')
driver.find_elements(By.ID, 'rootWindow')
Изменения Actions
События вида TouchAction
заменены на W3Actions
.
Ранее можно было реализовать функцию свайпа таким образом:
from appium.webdriver.common.touch_action import TouchAction
def swipe(driver, x_1: int, y_1: int, x_2: int, y_2: int) -> None:
"""Perform mouse swipe touch action from one point to another
Args:
x_1: x "from" coordinate
y_1: y "from" coordinate
x_2: x "to" coordinate
y_2: y "to" coordinate
"""
TouchAction(self.d).press(x=x_1, y=y_1,).move_to(x=x_2, y=y_2).release().wait(1000).perform()
Теперь же аналогичная функция выглядит так:
from selenium.webdriver import ActionChains
from selenium.webdriver.common.actions import interaction
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver.common.actions.pointer_input import PointerInput
def swipe(driver, x_1: int, y_1: int, x_2: int, y_2: int) -> None:
"""Perform mouse swipe from one point to another
Args:
x_1: x "from" coordinate
y_1: y "from" coordinate
x_2: x "to" coordinate
y_2: y "to" coordinate
"""
actions = ActionChains(self.driver, duration=300) # 300 — предпочтительная длительность свайпа
actions.w3c_actions = ActionBuilder(self.driver, mouse=PointerInput(interaction.POINTER_TOUCH, 'touch'))
actions.w3c_actions.pointer_action.move_to_location(x=x_1, y=y_1)
actions.w3c_actions.pointer_action.pointer_down()
actions.w3c_actions.pointer_action.move_to_location(x=x_2, y=y_2)
actions.w3c_actions.pointer_action.release()
actions.w3c_actions.pointer_action.pause(duration=1)
actions.perform()