ДжазТим — надежный технологический партнер

Agile разработка ПО на Java

Тестирование flash-приложения или java-апплета с помощью Sikuli

Введение

Иногда при тестировании возникает ситуация когда необходимо проверить работу компонента, с которым невозможно взаимодействовать с помощью Selenium. Например когда приложение использует карту (Google, Yandex maps), когда есть flash-приложение или апплет. В таких ситуациях поможет такой инструмент как Sikuli.

Что такое Sikuli? Если говорить коротко, то это симбиоз из класса Robot и библиотеки компьютерного зрения OpenCV. Если поподробнее, то это инструмент для автоматизации действий над приложением посредством скриншотов элементов этого приложения. Т.е. вы продумываете действия по совершению определённой операции в приложении, создаёте скриншоты элементов, которые будут использоваться при выполнении этих действий и пишите код, используя API Sikuli, который будет использовать подготовленные изображения и выполнять нужные действия. Например вы хотите проверить работу кнопки печать страницы , для этого вы делаете скриншот этой кнопки , затем, используя Sikuli API, находите регион, где расположена эта кнопка, наводите на этот регион мышь и нажимаете на кнопку.

Установка

Установка описывается для последней версии Sikuli 1.0.1, sikuli-api 1.0.2.

Скачать sikuli-api.jar https://code.google.com/archive/p/sikuli-api/downloads
Скачать sikuli-setup.jar https://launchpad.net/sikuli/+download

Запустить sikuli-setup, появится окно

windows-sikuli-1

Затем зайти в указанную в диалоговом окне директорию и запустить runSetup.cmd
появится следующее окно

windows-sikuli-2

нажимаем ок

windows-sikuli-3

Для программирования на Java достаточно выбрать пункт 4 и 6.
Далее нажимаем Setup Now

windows-sikuli-4

Появится окно подтверждения, соглашаемся
Затем инсталлятор должен будет скачать необходимые файлы

windows-sikuli-5

Затем добавьте два jar’ника (sikuli-api и sikuli-java) в classpath

Пример работы

Рассмотрим простой пример работы с Sikuli, например, нам нужно протестировать смену разрешения в плеере

player

Для тестирования смены разрешения с помощью Sikuli мы сделаем следующие действия:

  1. Откроем браузер с помощью Selenium и перейдём на страницу с плеером
  2. Нажмём на иконку “Settings” 
  3. Найдя надпись “quality” , определим что нужное нам меню открылось
  4. Выберем разрешение “480p” 
  5. Повторим шаги 1 и 2
  6. Проверим, что чекбокс стоит напротив надписи “480p” 
Код

Я не буду описывать как инициализировать и запустить Webdriver и перейти на нужную страницу, а сразу приступлю к описанию кода, который использует Sikuli API, так как статья посвящена только знакомству с этим инструментом.

Для начала создаём глобальные объекты, которые нам понадобятся для тестирования, это Firefox, регион рабочего стола, и мышь.

final App app = new App("Firefox");
final ScreenRegion s = new DesktopScreenRegion();
final Mouse mouse = new DesktopMouse();

Затем фокусируемся на браузере
app.focus();

Объявляем изображения, которые будут использоваться в тесте
final Target targetSettings = new ImageTarget(new File("settings.PNG")); final Target targetQuality = new ImageTarget(new File("quality.PNG")); final Target target480p = new ImageTarget(new File("480p.PNG")); final Target targetChecked480p = new ImageTarget(new File("checked_480p.PNG"));

Ищем иконку “settings” и кликаем на неё
findAndClick(s, mouse, targetSettings);

Проверяем, что надпись “quality” присутствует
Assert.assertNotNull(s.find(targetQuality));

Ищем и нажимаем на пункт меню “480p”
findAndClick(s, mouse, target480p);

Ищем и нажимаем на иконку “settings”
findAndClick(s, mouse, targetSettings);

Проверяем, что надпись “quality” присутствует
Assert.assertNotNull(s.find(targetQuality));

Проверяем, что напротив 480p стоит галочка
Assert.assertNotNull(s.find(targetChecked480p ));

Так как у нас в тесте есть повторяющая последовательность действий (найти и кликнуть), то они были вынесены в отдельный метод

private static void findAndClick(final ScreenRegion s, final Mouse 
mouse, final Target target) {
        final ScreenRegion targetRegion = s.find(target);
        Assert.assertNotNull(targetRegion);
        mouse.click(targetRegion.getCenter()); 
}

Заключение

Конечно, Sikuli может выручить в ситуациях, когда Selenium бессилен, но у него есть недостатки. Например то, что необходимо делать скриншоты нужных для тестирования элементов, и если интерфейс приложения изменится, то придётся заново снимать скриншоты. Масштаб элемента на скриншоте должен совпадать с масштабом элемента в приложении, так как если он будет отличаться, то Sikuli просто не найдёт это изображение. Можно обойти эту проблему, если постепенно менять масштаб картинки, и при каждом его изменении пробовать найти регион с этим изображением. Было несколько случаев когда поиск изображения срабатывал неверно и находился совсем другой элемент.