Автоматическое тестирование GUI иногда становится невозможным по причине отсутствия инструментов для осуществления его. Давно я наткнулся на инструмент SikuliX который работает с экраном и для него не важно в какой оболочке работает тестируемый объект. Некоторые скажут, что с этим инструментом можно кликать курсором в определенную область и вводить данные, без возможности обработать полученные данные в ответ, но с недавних пор в SikuliX внедрили распознавание текста с помощью OCR Tesseract. SikuliX поддерживает программирование на Jython и использование сочетаний клавиш системы. Как скачать и установить Sikuli есть подробная инструкция на официальном сайте.
Основные функции в 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 версии. Пропишем шаги для достижения результата:
- Открыть браузера (FF)
- Открыть сайт (sinoptik.ua)
- Ввести запрос для поиска данных(‘Kie’)
- Проверить выводятся ли первым желаемый город
Вот что у меня получилось:
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 это выглядит вот так:
Для запуска скриптов в автоматическом режиме без нажатия кнопки 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, но думаю простого гугления будет достаточно.