Sikuli – документация, Sikuli – личный опыт.
SikuliX – для визуального тестирования
В тестировании программ применяются средства, позволяющие проверить, соответствуют ли ожидаемым результаты, выдаваемые приложением, управляемым посредством последовательности действий пользователя. В случае приложения, управляемого посредством достаточно сложного графического интерфейса (GUI), тестировщики пожелают проверить соответствие визуального контента своим ожиданиям. Это может быть представление элементов GUI на экране в целом или на части экрана.
SikuliX может быть интегрирован с подобными тестовыми средами несколькими способамм – или посредством скриптов или посредством программного интерфейса (API), основанного на языке Java (в котором реализованы средства поддержки SikuliX). Характерные примеры второго подхода – RobotFramework и Cucumber.
Комбинация GUI-ориентированных средств и SikuliX (нпр. с Selenium для веб-приложений) также стала реальностью .
Некоторый вызов в этом деле состоит в том, что свойства SikuliX картинок привязаны к пикселам в том смысле, что картинка на экране должна со значительной степенью точности быть такой, как ожидается, иначе SikuliX её не распознает. Это обычно ведёт к тому, что разные картинки должны быть использованы в разных средах. Версия 2 будет обладать свойствами, помогающими бороться с подобными ситуациясмп.
Отметим ещё некоторые аспекты, важные для тестировщиков:
- SikuliX требует, чтобы тестируемое приложение работало с реальным экраном (или с некоторым эквивалентом его виртуального воплощения)
- SikuliX доступно только на компьютерах, работающих под управлением Windows, Mac или Linux с Java версии 6+.
SikuliX – как на экране распознаются картинки?
SikuliX применяет пакет OpenCV для нахождения картинок на экране.
SikuliX опирается на метод OpenCV/matchTemplate(), подробнее описанный на этой странице (по-английски). Если Вы не знакомы с этим методом, стоит взглянуть туда, а затем продолжить чтение здесь.
Основное занятие SikuliX – ждать появления картинки в заданном месте:
# верхней левой части экранав конкретной области aRegion = Region(0, 0, 500, 500)# картинка в формате png в файловой системе – та самая картинка, которую мы хотим видеть в заданной области экрана aImage = “someImage.png”# искать заданный результатaMatch = aRegion.find(aImage)
Для простоты пока ничего не было сказано о том, как получить эту картинку aImage. Предполагается, что она есть и достижима.
Метод matchTemplate() требует наличия базовой картинки (базы), внутри которой должна быть найдена искомая картинка (цель). Чтобы подготовить такую ситуацию, мы делаем снимок (screenshot) экрана (посредством Java Robot class), в соответствии с параметрами, заданными aRegion. Полученная базовая картинка сохраняется в памяти. Целевая картинка также помещается в память из соответствующего файла. Обе картинки конвертируются в объекты CVMat, требуемые пакетом OpenCV.
Теперь мы исполняем функцию matchTemplate() и получаем матрицу размером с базовую картинку, где каждому пикселу приписывается оценка похожести с целевой картинкой, полученная сопоставлением каждого пиксела этих картинок, начиная с левого верхнего угла целевой картинки, помещённого в оцениваемом пикселе базовой картинки. Если это пока не полностью понятно, вернитесь к примеру выше и постарайтесь понять. Эти оценки похожести изменяются от 0.0 and 1.0: чем меньше это значение, тем меньше вероятность, что область с левым верхним углом в этом пикселе содержит целевую картинку. Оценки выше 0.7 – 0.8 сигнализируют о высокой вероятности, что цель найдена.
На следующем шаге мы применяем другой OpenCV метод, чтобы получить из матрицы оценок общую релевантную максимальную оценку, выделяющую пиксель, который с наибольшей вероятностью служит левым верхним краем искомой цели в базовай картинке.
По умолчанию только оценки > 0.7 считаются удачными (цель найдена). Другие оценки – сигнал исключительной ситуации FindFailed (поиск неудачен). В зависимости от различных аспектов целевой картинки (в основном, поличества точных совпадений), можно получить оценки > 0.8 или даже 0.9. Если следовать SikuliX рекомендациям по созданию целевых картинок, можно получить в большинстве случаев >0.95 или даже >0.99 (считая 1.0 знаком точного совпадения).
Если оценка считается приемлемой, чтобы считать поиск успешным, то на следующем шаге создаётся результирующий объект (a match object), который описывает область на экране, где с большой вероятностью находится искомая картинка (т.е. объект, упомянутый выше как aMatch).
Если цель считается не найденной (оценка неприемлема), операция поиска или завершается, или начинается поиск с другим скриншот-ом в заданной базе. Это повторяется до успеха или исчерпания неявно заданного допустимого времени ожидания результата (обычно 3 секунды) с сигналом FindFailed. Можно регулировать частоту повторений поисковых попыток, чтобы оптимизировать загрузку процессора SikuliX.
Несколько слов о времени поиска: Чем больше базовая картинка, тем дольше поиск. Чем меньше отличаются картинки, тем быстрее. На современных системах с большими мониторами поиск небольших или средних размеров картинок (до 10.000 пикселей) может занять порядка 0.5 до 1 сек. и даже больше. Чтобы уменьшить время поиска, следует ограничивать область поиска насколько возможно. Картинки порядка 10 пикселей в поисковой области размером порядка 1000 пикселей находятся за время порядка 10 мс и даже быстрее.
В действующей версии SikuliX 1.1.0 реализовано свойство “старое место” : прежде чем искать во всей заданной области, прежде всего проверяется, нет ли искомого на том самом месте, где (и если) он был найден в последний раз. В случае успеха, это требует всего нескольких миллисекунд, резко сокращая время поиска для случая повторяющихся запросов с теми же картинками.
Не зная особенностей поиска в SikuliX функции matchTemplate(), люди всегда удивляются, почему картинки, повторенные на экране многократно, не находятся в некотором регулярном порядке (нпр. слева направо сверху вниз). Это связано с особенностями реализации функции matchTemplate() посредством матричных статистических методов. Так что никогда не ожидайте. что SikuliX покажет самую левую верхнюю картинку больше одного раза. В этом смысле результат поиска непредсказуем.
Если нужно найти конкретный экземпляр многократно показанной картинки, нужно соответственно ограничить область поиска.
Для случаев, когда это неудобно или требуется цикл по всем экземплярам картинки, имеется метод findAll(), выдающий полный список всех найденных экземпляров, упорядоченный по убыванию результирующей оценки. При необходимости можно работать с этим списком, учитывая координаты (x,y) верхнего левого угла конкретного экземпляра картинки.
SikuliX – что можно делать с картинками
Чтобы использовать картинку в SikuliX, скажем, чтобы щёлкнуть на ней (посредством функции click(картинка)), нужно прежде всего сохранить её, предпочтительно в формате PNG (someImage.png), в файловой системе или в Сети.
Картинка в этом смысле – это просто прямоугольник пикселов, скачанный с экране (в Sikuli используется глагол скачать (capture) для описания всего процесса копирования картинки и сохранения её в файле под специфическим именем – процесса создания артефакта “визуальный объект – картинка”).
Скачивание встроено в IDE, а также может быть запрограммировано соответствующими функциями SikuliX. Можно пользоваться также любым иным подходящим инструментом для скачивания картинок вручную.
Чтобы загружать картинки в SikuliX, следует руководствоваться двумя следующими правилами:
- связанный путь: картинки хранятся вместе со скрипт-файлом (.py для Python, .rb для Ruby, .js для JavaScript) в папке someScript.sikuli, причём конкретный скрипт-файл назван тем же именем, что и папка в целом (нпр. someScript.py). Это обеспечено автоматически при работе SikuliX IDE.
- доступ к картинкам: в дополнение SikuliX использует перечень допустимых мест для размещения картинок. Это папки в файловой системе, папки в jar-файле и папки в Сети. Предоставляются также функции для доступа к собственным картинкам пользователя. Когда некоторая картинка должна быть загружена, этот перечень последовательно проверяется на предмет нахождения картинки в очередном указанном месте – картинка загружается с первого найденного таким образом подходящего места.
Настоятельно рекомендуется пользоваться содержательными именами для файлов-картинок, а не пользоваться автоматической системой первоначального именования в SikuliX IDE, опирающейся на время создания файлов.
- В версии 2 будет отдельное средство скачивания картинок , поддерживающее следующие основные аспекты работы с картинками:
-
- скачивать и пере-скачивать по ходу визуального управления – нечто вроде самописца (recorder)
- управлять доступом к картинкам
- управлять группами “одинаковых” картинок, для переключения в зависимости от параметров среды
- управлять группами картинок. связанных друг с другом для совместной обработки
- управлять состоянием картинки (нпр. выбрана/не выбрана)
- оптимизировать скриншоты для улучшения оценок при поиске
- кое-что из поддержки “прозрачности” (нпр. игнорирование внутренней части кнопки)