Документация
ОС Аврора 5.2.0

Миграция автотестов на новые версии 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:

  1. automationName — обязательный параметр, для которого всегда устанавливается значение Aurora.
  2. 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()

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования cookies.