sikuli

Автоматическое тестирование GUI иногда становится невозможным по причине отсутствия инструментов для осуществления его. Давно я наткнулся на инструмент SikuliX который работает с экраном и для него не важно в какой оболочке работает тестируемый объект. Некоторые скажут, что с этим инструментом можно кликать курсором в определенную область и вводить данные, без возможности обработать полученные данные в ответ, но с недавних пор в SikuliX внедрили распознавание текста с помощью OCR Tesseract. SikuliX поддерживает программирование на Jython и использование сочетаний клавиш системы. Как скачать и установить Sikuli есть подробная инструкция на официальном сайте.

Основные функции в IDE

Функции хорошо описаны в документации. Ниже я опишу основные, которые отображаются в правой колонке.

ide

  • find(шаблон изображения) — ищет изображение соответствующее переданному шаблону и если находит первое совпадение, то возвращает объект Match с параметрами этого объекта.
  • findAll(шаблон изображения) — ищет изображения соответствующие этому шаблону и если находит то возвращает массив объектов Match.
  • wait(шаблон изображения) — ожидает появления изображения
  • waitVanish(шаблон изображения) — ожидание исчезновения изображения
  • exists(шаблон изображения) — проверяет существования изображения
  • click(шаблон изображения) — кликает левой кнопкой мыши в заданную область на шаблоне
  • doubleClick(шаблон изображения) — делает двойной клик левой кнопкой мыши в заданной области в шаблоне
  • rightClick(шаблон изображения) — делает клик правой кнопкой мыши в заданной области в шаблоне
  • hover(шаблон изображения) — наводит курсор на выбранную область в шаблоне
  • dragDrop(шаблон_1, шаблон_2) — зажимает левую кнопку мыши над областью указанной в шаблоне_1, переносит на позицию указанную в шаблоне_2 и бросает кнопку
  • type(текс) — печатает на клавиатуре выбранный текст, также можно применять нажатия клавишь, на пример Enter = Key.ENTER
  • type(Шаблон изображения, текст) — кликает в выбранную область и печатает текст
  • paste(текст) — вставляет текст из буфера обмена(ctrl+v|shift+insert)
  • paste(шаблон, текст) — аналогично с type кликает в область в шаблоне и вставляет текст

Шаблон изображения

При клике на шаблон изображения открывается дополнительное окно с перечнем свойств этого шаблона, тут можно выбрать место клика в шаблоне, минимальный уровень совпадения, по умолчанию 70% совпадения, желательно изменить до 100%, иногда встречаются похожие объекты(если ищете к примеру в меню), так-же можно посмотреть как находит данный объект на текущих открытых окнах.

Продемонстрирую возможности инструмента на тестировании подсказок в форме поиска городов для сайта Sinoptik.ua в Desctop версии. Пропишем шаги для достижения результата:

  1. Открыть браузера (FF)
  2. Открыть сайт (sinoptik.ua)
  3. Ввести запрос для поиска данных(‘Kie’)
  4. Проверить выводятся ли первым желаемый город

Вот что у меня получилось:

try:
    firefox = 'C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe'
    url = 'https://sinoptik.ua'
    openApp(firefox)
    if bool(exists("1422816842381.png",4)) != True:
        raise Exception('Can`t run browser')
    click("1422818832742.png")
    type(url + Key.ENTER)
    if bool(exists(Pattern("1422821974735.png").similar(0.95),50)) != True:
        raise Exception('Can`t load page ' + url)
    click('1422822266010.png')
    type('Kie')
    if bool(exists(Pattern("search.png").similar(0.90),50)):
        popup('WORK')
    else:
        popup('ERROR!!!')
except Exception, e:
    popup(e)

В IDE это выглядит вот так:

ide_result

Для запуска скриптов в автоматическом режиме без нажатия кнопки Run нужно прописать команды в bat/bash файле или просто в консоли Windows — PATH-TO-SIKULIX/runIDE.cmd -r <sikuli-folder/file>

Как у меня выглядит эта команда:

“C:\Program Files (x86)\SikuliX\runIDE.cmd” -r C:\server\www\SikuliX\sinoptik_test.sikuli

Скачать скрипт можно у меня на GitHub

Для более удобного использования можно поднять уровень абстракции и создать класс браузер с производными классами для тестируемых браузеров и в них описать нужные методы (открытие браузер, ввод url), так-же можно повесить распознавание текста на изображении для более точной проверки результата. Так-же я не разобрался как работать с русскоязычными символами в SikuliX, но думаю простого гугления будет достаточно.