Помнишь, какой фурор произвело появление WYSIWYG-редакторов, которые позволили верстать веб-страницы человеку, вообще не знающему правил HTML-разметки? Создатели Sikuli решили переложить подобный опыт на процесс разработки сценариев, с помощью которых можно автоматизировать все что угодно. Новый подход: «Что ты видишь, то ты и программируешь».

«What You See is What You Script» — так в оригинале звучит принцип, на котором основана Sikuli. Кстати, название программы — не случайно. Само слово «Sikuli» переводится с древнего индейского языка Wixarica из Мексики как «глаз бога», что недвусмысленно намекает на возможность видеть все на экране. Проект появился в 2008 году, став результатом совместной работы китайского студента Шона Тсунг-Хсианга Чана из Массачусетского технологического института (MIT), профессора Роба Миллера из департамента EECS в MIT и Тома Йеха, работающего над докторской в Университете штата Мэрилэнд.

Разработчики считают, что некоторые задачи (например, по автома тизации тестирования пользовательского интерфейса) проще выполнять с помощью визуальных средств. Sikuli использует алгоритмы распознавания текста и индексации изображений с помощью так называемых «визуальных слов». Встроенные функции языка принимают в качестве параметров графические данные и в зависимости от них выполняют определенные действия.

Например, передав функции hover() изображение кнопки «Пуск» в Windows, мы добьемся того, что Sikuli переведет на нее курсор. Это лишь маленький пример того, что предлагает данная визуальная технология.

Ключевая фишка разработки заключается в том, что ты в прямом смысле показываешь, что нужно сделать, а Sikuli это повторяет. Таким образом, можно автоматизировать все, что ты видишь на экране, вообще без использования каких-либо специализированных API.

К примеру, запрограммировать любые действия на веб-странице, работу с Windows/Linux/MacOS-приложением или даже с программами на iPhone/Android, используя симулятор устройства или подключение к его экрану по VNC. Для поиска конкретных элементов интерфейса Sikuli использует лишь их изображения-скриншоты и позволяет легко эмулировать нажатия кнопкой мыши в нужных местах и ввод с клавиатуры. Более того, в качестве скриптового языка в Sikuli используется Jython, то есть в сценарии при необходимости можно использовать любые конструкции Python.

 

Альтернативы?

Вообще говоря, эмуляция действий пользователя — это довольно частая задача. Во врезке я привел несколько распространенных примеров того, когда это может потребоваться. Злоумышленники, к примеру, могут использовать это в своих черных делах. В одном из номеров мы рассказывали про концепт трояна, который способен уводить деньги с кошельков электронных платежных систем. Тогда для эмуляции действий юзера использовались стандартные возможности Windows. Благодаря API-вызовам системы можно эмулировать все что угодно: любые последовательности кликов и движения мыши пользователя, работу с окнами и приложениями.

Если максимально просто описать работу того троя, то он самостоятельно открывал окно приложения платежной системы, затем переходил в интерфейс для перевода денег на другой счет и подставлял в качестве получателя левый кошелек. Но проблема такого подхода в том, что для использования API-вызовов тебе необходимо быть программистом.

Есть, конечно, решения, которые позволяют обойтись без сложного системного программирования. Это, к примеру, программа AutoIt (autoitscript.com/autoit3), предоставляющая простой скриптовый язык для автоматизации практически любых задач. Весь ряд действий создаваемого макроса задается в виде вполне понятных команд, опирающихся на название окон и элементов интерфейса. К примеру, чтобы запустить оснастку Computer Management и дождаться появления окна с одноименным названием, необходимо написать такой код:

Run ('cmd /c "compmgmt.msc"', @SystemDir, @SW_HIDE)
WinWaitActive("Computer Management")

Уже проще, чем код на C++, но все равно выглядит устрашающе. Чтобы не писать макросы вручную, можно воспользоваться дополнительными утилитами (вроде AutoItMacroGenerator), которые в реальном времени преобразуют все твои действия в системе в макрос для AutoIt. Но даже эти ухищрения не позволяют приложению дотянуть до уровня Sikuli по части простоты и доступности написания побочных сценариев. Сейчас ты в этом убедишься.

 

Работа с Sikuli

Чтобы не быть голословным, приведу пример довольно простого скрипта, который автоматически устанавливает IP-адрес сетевого адаптера в Mac OS X.

Да-да, именно в такой, максимально понятной и наглядной форме, составляются скрипты в Sikuli. Ничего не стоит составить аналогичный скрипт для Linux и Windows. Приложение Sikuli написано на Java, и потому поддерживает все популярные платформы. Если посмотреть на пример более внимательно, то увидишь набор понятных команд (click(), wait(), type() и так далее), с которыми можно работать, даже не заглядывая в документацию. Но самое интересное заключается в том, что в качестве параметров этим функциям часто передаются не текстовые переменные, а изображения. Например, функции для клика по нужному элементу — click() — передается изображение-скриншот этого элемента. Что может быть проще?

Правда, для написания сценариев тут уже не отделаешься обычным текстовым редактором — необходима специальная IDE, которая по умолчанию входит в состав Sikuli. Интерфейс этой среды довольно аскетичен и состоит из двух частей: непосредственно редактора кода и панели, на которой собраны основные функции для быстрого использования. Скажем, если нужно реализовать нажатие какой-то кнопки интерфейса, то мы выбираем функцию click(), после чего среда разработки предложит тебе выбрать область экрана для создания паттерна. Понятно, что обвести здесь нужно элемент, на котором необходимо осуществить клик. Пара секунд — и очередной шаг нашего скрипта готов!

 

Необходимые функции

Всего в распоряжении пользователя несколько десятков функций, большая часть которых в качестве параметров принимает именно изображения. Вот лишь некоторые из них:

  • click(img) — производит клик мыши по паттерну, переданному в качестве параметра;
  • doubleClick(scr) — двойной клик мышью;
  • rightClick(scr) — правый клик;
  • hover(scr) — наводит курсор на наиболее схожую с img область экрана;
  • exists(scr) — возвращает значение true, если находит изображение на экране;
  • openApp(app) — запуск приложения app;
  • switchApp(app) — передает фокус приложению app (если окно не найдено, то выполняется команда openApp);
  • type(text) — ввод текста text;
  • type(scr, text) — ввод текста text в элемент с графическим паттерном scr;
  • popup(msg) — выводит пользователю диалоговое окно с сообщением msg.

После недолгой практики становится ясно, что даже минимального набора функций более чем достаточно, чтобы автоматизировать любые действия. Кроме того, на помощь всегда приходит емкий мануал проекта. Если же нужно решить более сложную задачу, чем создание простого макроса, который будет выпол нять за тебя некоторые рутинные действия — например, написать бот для какой-то игры, то к твоим услугам весь функционал Python’а, который можно полноценно использовать в своих скриптах.

На сайте решения есть несколько наглядных демок (sikuli.org/demo.shtml), которые помогут тебе быстро понять, для чего нужны те или иные функции. С помощью небольших сценариев разными людьми реализованы следующие задачи:

  1. Проверка новых сообщений на Facebook от определенного пользователя и автоматическая отметка их кнопкой Like.
  2. Система фильтрации входящих звонков в Skype.
  3. Видеонаблюдение с помощью веб-камеры, которая отслеживает появление и исчезновение разных объектов.
  4. Бот для игры в пазл-игру Bejeweled.
  5. Тестировщик интерфейса приложения на Android.

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

 

3 кейса использования Sikuli

  1. Автоматизация работы с любыми сервисами и приложениями. В том числе с теми, которые не предоставляют API. Попробуй посчитать, сколько времени ты мог бы сэкономить, если бы перестал выполнять одни и те же однотипные действия? Максимально быстрое и упрощенное создание макросов — конек Sikuli. Создание примитивного скрипта, который выполняет запуск определенного приложения, осуществляет некоторые действия с интерфейсом и эмуляцию ввода данных — дело на пятнадцать минут.
  2. Создание инструментов для автоматизированного тестирования приложений. Каждый, кто занимается разработкой GUI-программ, знает, насколько утомительным может оказаться кропотливое выполнение проверок по части интерфейса. Один добрый человек разобрался, как скрестить Sikula и фреймворк для тестировщиков ПО Robot Framework, и выложил об этом подробную инструкцию: bit.ly/kUYNwn. В основе решения лежат встроенные возможности Sikuli по созданию юнит-тестов.
  3. Разработка ботов для самых разных игр. Если покопаться, то на Youtube можно найти не один ролик с демонстрацией того, как энтузиасты на коленке ваяют ботов для различных игр в социальных сетях. Автоматически собрать урожай на ферме — это далеко не предел мечтаний. Используя механизмы распознавания изображений и мощь Python, вполне реально собрать бота для того же покера (правда, это чаще всего противоречит правилам подобных сервисов, и они, вполне вероятно, уже добавили Sikuli в список запрещенных приложений).
 

Аналогичные решения

 

RoutineBot (routinebot.com)

Известная в кругах тестировщиков интерфейсов утилита, которая быстро развивается. Это неудивительно, поскольку решение изначально рассчитано на то, чтобы быстро создавать текстовые скрипты для проверки работы интерфейса. В качестве синтаксиса можно использовать Pascal, JScrpt и Basic. Приложение при этом так же, как и Sikuli, имеет набор функций, которым в качестве параметра передаются графические сэмплы.

 

Ranorex (ranorex.com)

Очень дорогой профессиональный инструмент для автоматизации, обладающий большим количеством модулей на все случае жизни. В качестве скриптового языка используется C#, VB.NET и Python. Решение интегрируется с Visual Studio и обладает мощным компонентом для распознавания изображений Ranorex Recorder.

 

T-Plan Robot (t-plan.com)

Этот проект раньше назывался VNCRobot и, как несложно понять, использует VNC-подключение к системе, на которой необходимо выполнить скрипт. Решение изначально разработано для автоматизации процессов с использованием в том числе анализа изображений.

 

EggPlant (testplant.com)

Так же, как и T-Plan Robot, это решение основывается на VNCподключении и предоставляет схожий функционал. На данный момент доступны версии для Linux, Windows, Mac.

 

Как работает Sikuli?

Главной частью системы является Sikuli Script. По сути — это библиотека, которая автоматизирует взаимодействие с GUI при помощи графических паттернов. Скрипт состоит из нескольких слоев на Java и Jython, но основное тут заключается в следующем. Модуль java.awt.Robot эмулирует нажатия клавиатуры и действия мышью. Распознаванием паттернов на экране занимается движок на C++, написанный с использованием известного проекта OpenCV. Любой скрипт на Sikuli (.sikuli) — это директория, которая состоит из исходника на Python (.py) и всех графических файлов (.png). Проект Sikuli можно также сохранить в виде исполняемого файла. В этом случае директория .sikuli сжимается zip’ом в единственный .skl-файл.

Sikuli IDE — это среда разработки, которая позволяет редактировать и выполнять скрипты. Несмотря на то, что библиотеки Sikuli Script есть и для других IDE (например, Eclipse’а), только оригинальная среда предоставляет удобные возможности для создания изображений-паттернов.

 

Links

Если в процессе создания скриптов у тебя возникнут проблемы, рекомендую официальный раздел Q&A, где максимально быстро появляются ответы на поставленные вопросы и сообщения об исправленных багах: answers.launchpad.net/sikuli.

Теги:

1 комментарий

  1. 02.10.2014 at 16:39

Оставить мнение

Check Also

Господин Самоуничтожение. Как в домашних условиях смастерить Rubber Ducky со встроенной пиротехникой

Представь: ты втыкаешь в USB какую-то флешку, и вдруг в браузере открывается окно, где гру…