Автоматизация жестов в Appium: блиц-практикум

Кратко рассмотрим тестирование жестов, и как можно упростить автотесты жестов, используя специальный плагин в Appium.

Итак, что такое жесты? 

Жесты обрабатываются девайсом как серия нажатий. 

Тактильные экраны изменили само наше восприятие мобильных девайсов, и радикально упростили User Experience. Сейчас успешность мобильного приложения зависит от того, насколько простые, удобные, и плавные в приложении жесты. Если интересно глубже в это погрузиться, существует вполне неплохой гайд по жестам, в котором объясняется, как они обрабатываются девайсом. 

Классификация жестов

Tap 
Краткое нажатие
Double Tap
Быстрое нажатие дважды
Drag
Перемещение без потери контакта
Flick
Краткое проведение с отрывом (путь короче чем в Drag)
Pinch 
Нажатие двумя пальцами и сведение их вместе
Spread
Нажатие двумя пальцами и разведение их в стороны
Press
Долгое нажатие
Press and Tap
Нажатие одним пальцем и краткое касание другим
Press and Drag
Нажатие одним пальцем и проведение вторым без отрыва
Rotate
Нажатие двумя пальцами и одновременное проведение ими по кругу, по часовой стрелке или против

Анимация в сочетании с жестами дает очень гибкий user experience. Appium обрабатывает жесты с помощью Actions API, описанных в W3C WebDriver Specification. Удобно и то, что API написаны с учетом всех доступных интерфейсов, включая обычный тач, стилус, и мышку. Начиная с версии 1.8, Appium поддерживает Actions API в обработке жестов всех типов на мобильных девайсах.

Например приложение устанавливает некое значение слайдером:

Вот как Actions API обрабатывает это:

MobileElement slider = driver.findElementByAccessibilityId("slider");

Point source = slider.getLocation();
PointerInput finger = new PointerInput(PointerInput.Kind.TOUCH, "finger");
Sequence sequence = new Sequence(finger, 1);
sequence.addAction(finger.createPointerMove(ofMillis(0),
                PointerInput.Origin.viewport(), source.x, source.y));
        sequence.addAction(finger.createPointerDown(PointerInput.MouseButton.MIDDLE.asArg()));
sequence.addAction(new Pause(finger, ofMillis(600)));
sequence.addAction(finger.createPointerMove(ofMillis(600),
                PointerInput.Origin.viewport(), source.x + 400, source.y));
        sequence.addAction(finger.createPointerUp(PointerInput.MouseButton.MIDDLE.asArg()));

driver.perform(singletonList(sequence));

Выше у нас три действия:

1) задание локации (местоположения) элемента при помощи API локации

2) создание последовательности действий pointerMove, pointerDown, pause, pointerUp

3) выполнение этой последовательности. Здесь нам надо выстроить эти действия в правильном порядке, тогда жест сработает как надо. 

Посмотрим, как это делается. 

  1. Идентифицируем элемент “слайдер” (любым локатором).
  2. Находим локацию слайдера на экране.
  3. Создаем объект PointerInput с типом TOUCH, с уникальным ID, это касание пальцем.
  4. Создаем объект Sequence с объектом PointerInput.
  5. Добавляем действия в последовательность Sequence.
    1. Движение указателя к локации слайдера.
    1. Движение указателя вниз.
    2. Удержание указателя на некоторое время (в миллисекундах).
    3. Движение указателя со слайдером к конечной локации.
    4. “Отрыв” указателя от слайдера.
  6. Выполняем последовательность с помощью Actions API

Ниже на скриншоте показано, как вычисляется локация элемента:

Такие, достаточно сложные, действия, можно автоматизировать, пользуясь Actions API.

Работаем с плагином Appium Gestures

Итак, у нас есть соответствующий плагин для Appium 2.0, и вот как он делает все проще:

MobileElement source = (MobileElement) new WebDriverWait(driver, 30)
           .until(elementToBeClickable(MobileBy.AccessibilityId("slider")));

driver.addCommand(HttpMethod.POST, String.format("/session/%s/plugin/actions/swipe", driver.getSessionId()), "swipe");
driver.execute("swipe", ImmutableMap.of("elementId", source.getId(), "percentage", 50));

Плагин appium-gestures-plugin находит локацию нужного элемента и вычисляет конечную локацию, в процентном отношении. Также он создает последовательность действий из которых состоят жесты (аналогично все работает в Android, о чем подробнее в конце материала). 

Здесь вполне рабочий пример на Java, свайп-жест с применением плагина. 

Если при установке плагина возникают проблемы, надо почитать доки здесь.

Плагин работает с самыми применяемыми жестами: свайп, долгое нажатие, двойной тап и еще много других. Если интересуют более сложные (и редко применяемые) жесты, например если вдруг в приложении пользователь рисует личную подпись, Actions API вполне справится и с такой задачей.

Разумеется, кроме Actions API, Appium поддерживает и нативный API обработки жестов, для обеих платформ Android и iOS:

Map<String, Object> args = new HashMap<>();
args.put("direction", "up");
driver.executeScript("mobile: swipe", args);

Ссылка по API в Android, и в iOS.

На этом пока все; если интересует подобное, пишите в комментариях.

Какой была ваша первая зарплата в QA и как вы искали первую работу?

Мега обсуждение в нашем телеграм-канале о поиске первой работы. Обмен опытом и мнения.

Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Мы в Telegram

Наш официальный канал
Полезные материалы и тесты
Готовимся к собеседованию
Project- и Product-менеджмент

? Популярное

? Telegram-обсуждения

Наши подписчики обсуждают, как искали первую работу в QA. Некоторые ищут ее прямо сейчас.
Наши подписчики рассказывают о том, как не бояться задавать тупые вопросы и чувствовать себя уверенно в новой команде.
Обсуждаем, куда лучше податься - в менеджмент или по технической ветке?
Говорим о конфликтных ситуациях в команде и о том, как их избежать
$1100*
медианная зарплата в QA в июне 2023

*по результатам опроса QA-инженеров в нашем телеграм-канале

Собеседование

19%*
IT-специалистов переехало или приняло решение о переезде из России по состоянию на конец марта 2022

*по результатам опроса в нашем телеграм-канале

live

Обсуждают сейчас