Кратко рассмотрим тестирование жестов, и как можно упростить автотесты жестов, используя специальный плагин в Appium.
Итак, что такое жесты?
Жесты обрабатываются девайсом как серия нажатий.
Тактильные экраны изменили само наше восприятие мобильных девайсов, и радикально упростили User Experience. Сейчас успешность мобильного приложения зависит от того, насколько простые, удобные, и плавные в приложении жесты. Если интересно глубже в это погрузиться, существует вполне неплохой гайд по жестам, в котором объясняется, как они обрабатываются девайсом.
Классификация жестов
Анимация в сочетании с жестами дает очень гибкий 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) выполнение этой последовательности. Здесь нам надо выстроить эти действия в правильном порядке, тогда жест сработает как надо.
Посмотрим, как это делается.
- Идентифицируем элемент “слайдер” (любым локатором).
- Находим локацию слайдера на экране.
- Создаем объект
PointerInput
с типомTOUCH
, с уникальным ID, это касание пальцем. - Создаем объект
Sequence
с объектомPointerInput
. - Добавляем действия в последовательность
Sequence
.- Движение указателя к локации слайдера.
- Движение указателя вниз.
- Удержание указателя на некоторое время (в миллисекундах).
- Движение указателя со слайдером к конечной локации.
- “Отрыв” указателя от слайдера.
- Выполняем последовательность с помощью 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.
На этом пока все; если интересует подобное, пишите в комментариях.