Pull to refresh

Sikuli — program ANYTHING using GUI screenshoots

Reading time5 min
Views15K

Сказка


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

К счастью, транспортная компания (которая не удосужилась составить четкого расписание) содержит сайт, на котором в реальном времени с помощью Google Maps можно узнать, где сейчас находится тот или иной автобус. И вот в один прекрасный день Ваше терпение лопается и Вы садитесь писать скрипт, который будет отправлять ту желанную SMS-ку. Но все не так просто. Придется долго повозиться, чтобы по карте и маленькому кружочку на ней оценить скорость и время прибытия реального транспортного средства на Вашу остановку. Вы ведь не можете просто написать: «хочу получать SMS, когда вот эта точка попадет вот в этот прямоугольник на карте». Или все-таки можете?



«Глаза Бога»


Именно так переводится «sikuli» с языка мексиканского племени Хуичол.

Sikuli — технология поиска и автоматизации работы с элементами GUI на основе изображений (скриншотов). Авторами проекта являются Rob Miller (профессор Массачусетского технологического института), Tsung-Hsiang Chang (выпускник МИТа) и Tom Yeh (студент Мэрилендского университета). Их проект стал лучшей студенческой работой на конференции «User Interface Software and Technology», проводимой под эгидой ACM (Association for Computing Machinery).

Так что же такое Sikuli? Фактически это API, позволяющее писать сценарии (на языке Python), автоматизирующие работу с пользовательским интерфейсом. Большим преимуществом является то, что нет необходимости иметь доступ к исходникам приложений, с которыми Вы собираетесь работать. Для поиска конкретных элементов GUI Sikuli использует лишь их скриншоты, а для управления приложением — эмулирует такие действия пользователя, как нажатия кнопок мыши и клавиатурный ввод. Как следствие — Вы можете автоматизировать абсолютно любые приложения на любой операционной системе, на которой стоит Sikuli.

Весьма не просто все описать словами, поэтому приведу фрагмент сценария, самостоятельно настраивающего интернет-соединение:



Причем это не диаграмма и не часть какой-нибудь презентации. Это непосредственно код сценария. Не знаю как Вам, но мне не доводилось передавать в функции изображение кнопки =)

IDE


Ясно, что в обычном текстовом редакторе такие сценарии не пишутся. Поэтому разработчики создали весьма лаконичную (но требующую доработки) среду программирования — Sikuli IDE.

Вот как выглядит главное окно:
image

Тулбар предоставляет программисту всего пять действий на выбор:
  1. image — выделяем область экрана и она чудесным образом становится литералом (если можно так выразится) в нашем сценарии.
  2. image — загружаем изображения для последующего использования в сценарии.
  3. image — определяем геометрический регион (прямоугольную область экрана), чтобы сузить область поиска элементов интерфейса.
  4. image — запуск сценария.
  5. image — своего рода отладка. Запускает сценарии, отображая все его действия.


Свое творчество можно сохранить в виде исходников (пачка скриншотов, текстовый python-сценарий и визуальный вариант сценария в html), либо экспортировать в исполняемый skl-скрипт. Запустить такого рода скрипт можно либо двойным кликом мышью (Mac only now!), либо вот так:
  1. Mac: open /Applications/Sikuli-IDE.app xxx.skl
  2. Windows: PATH-TO-SIKULI/sikuli-ide.bat xxx.skl
  3. Linux: PATH-TO-SIKULI/sikuli-ide.sh xxx.skl


Установить Sikuli IDE можно на Mac OS X, Linux и Windows. В качестве интерпретатора выступает Jython, поэтому для работы необходимо иметь Java 5+.

Sikuli API


Несколько слов об API, которое предоставляют разработчики. В него входят всего два класса: Key и VDict. Первый — набор констант для специальных (не символьных) клавиш, таких как Enter, Tab, Home и т.д. Второй — аналог python-словарей, использующий изображения в качестве ключей. Помимо этого в распоряжении разработчиков несколько десятков функций, большая часть которых принимает в качестве параметров изображения (скриншоты элементов интерфейса). Вот некоторые из них:
  • click(img, modifiers=0) — производит клик по области экрана, наиболее схожей с img (название файла или непосредственно скриншот); поиск осуществляется с помощью функции find(img); modifiers — маска клавиатурных модификаторов
  • closeApp(app) — закрывает приложение с именем app
  • hover(img) — находит наиболее схожую с img область экрана и наводит на нее курсор
  • popup(msg) — выводит диалоговое окно с сообщением msg
  • switchApp(app) — передает фокус приложению app; если среди запущенных приложений имя app не найдено, то автоматически вызывается openApp(app); (в Windows поиск идет не по названию приложения, а по тесту в строке заголовка)
  • type(*args) — ввод теста (тут может пригодится класс Key, например, для нажатия Enter)
  • untilNotExist(img, timeout=3000) — ждет, пока изображение img пропадет с экрана; timeout — время ождания в миллисекундах

Таким образом Ваш сценарий может сделать всё, что может сделать обычный пользователь компьютера.

Unit testing для GUI


Еще одной возможностью (и вероятно более серьезной) Sikuli является написание скриптов для тестирования интерфейсов.

Опять-таки разработчики Sikuli IDE постарались сократить размер кода, необходимый для выполнения задачи. Тестирующий код автоматически заворачивается в python-класс, производный от junit.framework.TestCase, а разработчику остается лишь реализовать стандартные методы setUp(), tearDown() и непосредственно тестовые методы.

Доступ к панели тестирования можно получить через пункт меню View/Unit Test или же с помощью комбинации Ctrl+U. В ней Вы и найдете кнопку Run, отвечающую за запуск тестирования.

Личные впечатления


Проект определенно интересен. Пока есть лишь beta-версия, которая требует еще немало улучшений как в плане производительности, так и в реализации поиска элементов управления.

Написанный мной сценарий для запуска iTunes, принудительного обновления подкастов, синхронизации подключенного iPod-a, его извлечения и закрытия iTunes задачу пока не выполнил. Вместо этого он запустил iTunes, порылся в аудиокнигах (может что-то искал?), сразу же извлек iPod и закрыл программу =)

Более простую, но менее полезную задачу, с помощью Sikuli мне все-таки удалось решить. Скрипт сумел самостоятельно отправить гуглу привет через google toolbar в firefox. Хотя и не сразу. Пришлось выдать ему информацию, в какой части экрана искать поле ввода для дальнейшего поиска. В противном случае он пытался ввести 'hello' в адресную строку и, забыв про меня, погрузиться в дебри Всемирной паутины.

Возвращаясь к автобусу, можно сказать, что в настоящее время решить данную задачу с такой легкостью и непринужденностью наверно не получиться. Но проект Sikuli — начало нового подхода к программированию, который в скором времени может открыть невиданные возможности для автоматизации такого рода действий. Возможно этот подход выглядит не слишком серьезно, но это не значит, что он бесполезен. Но если Вы все-таки предпочитаете более серьезное программирование, то флаг Вам в руки — внесите свой вклад в этот замечательный open-source проект. Ведь за такой внешней простотой скрывается очень не простая реализация Sikuli.

Демо-видео


Вот официальный ролик, демонстрирующий работу с Sikuli IDE.


«Список литературы»


Python411 Podcast Series — ссылка не самая главная, но она была первой в моем знакомстве с проектом Sikuli (именно о нем рассказывается в последнем выпуске). Интересный python-подкаст от программиста-любителя.

Sikuli Project Official Site — официальный сайт проекта. На нем можно посмотреть демо-ролики, скачать исходники Sikuli IDE и инталлер для Вашей ОС и, конечно же, почитать документацию.

Picture-driven computing — вводная статья про технологию и про основные цели проекта. Именно оттуда позаимствована «сказка» про автобус и некоторое другие фрагменты топика.

Sikuli in Launchpad — более дельная информация о проекте для программистов: исходники, релизы, багрепорты и просто возможность обратиться к разработчикам. Спасибо the_toster за ссылку.

Ну и в заключение: Sikuli on Twitter. Follow them.

P.S.
Буду рад получить конструктивные замечания по статье и багрепорты об опечатках. Только желательно в виде ЛС.
Tags:
Hubs:
Total votes 88: ↑81 and ↓7+74
Comments52

Articles