Визуальные скрипты. Sikuli: простая автоматизация через скриншоты и PythonПомнишь, какой фурор произвело появление 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 и дождаться появления окна с одноименным названием, необходимо написать такой код: Уже проще, чем код на C++, но все равно выглядит устрашающе. Чтобы не писать макросы вручную, можно воспользоваться дополнительными утилитами (вроде AutoItMacroGenerator), которые в реальном времени преобразуют все твои действия в системе в макрос для AutoIt. Но даже эти ухищрения не позволяют приложению дотянуть до уровня Sikuli по части простоты и доступности написания побочных сценариев. Сейчас ты в этом убедишься. Работа с SikuliЧтобы не быть голословным, приведу пример довольно простого скрипта, который автоматически устанавливает IP-адрес сетевого адаптера в Mac OS X. Да-да, именно в такой, максимально понятной и наглядной форме, составляются скрипты в Sikuli. Ничего не стоит составить аналогичный скрипт для Linux и Windows. Приложение Sikuli написано на Java, и потому поддерживает все популярные платформы. Если посмотреть на пример более внимательно, то увидишь набор понятных команд (click(), wait(), type() и так далее), с которыми можно работать, даже не заглядывая в документацию. Но самое интересное заключается в том, что в качестве параметров этим функциям часто передаются не текстовые переменные, а изображения. Например, функции для клика по нужному элементу — click() — передается изображение-скриншот этого элемента. Что может быть проще? Правда, для написания сценариев тут уже не отделаешься обычным текстовым редактором — необходима специальная IDE, которая по умолчанию входит в состав Sikuli. Интерфейс этой среды довольно аскетичен и состоит из двух частей: непосредственно редактора кода и панели, на которой собраны основные функции для быстрого использования. Скажем, если нужно реализовать нажатие какой-то кнопки интерфейса, то мы выбираем функцию click(), после чего среда разработки предложит тебе выбрать область экрана для создания паттерна. Понятно, что обвести здесь нужно элемент, на котором необходимо осуществить клик. Пара секунд — и очередной шаг нашего скрипта готов! Необходимые функцииВсего в распоряжении пользователя несколько десятков функций, большая часть которых в качестве параметров принимает именно изображения. Вот лишь некоторые из них:
После недолгой практики становится ясно, что даже минимального набора функций более чем достаточно, чтобы автоматизировать любые действия. Кроме того, на помощь всегда приходит емкий мануал проекта. Если же нужно решить более сложную задачу, чем создание простого макроса, который будет выпол нять за тебя некоторые рутинные действия — например, написать бот для какой-то игры, то к твоим услугам весь функционал Python’а, который можно полноценно использовать в своих скриптах. На сайте решения есть несколько наглядных демок (sikuli.org/demo.shtml), которые помогут тебе быстро понять, для чего нужны те или иные функции. С помощью небольших сценариев разными людьми реализованы следующие задачи:
Работа с Sikuli настолько проста, что не вижу смысла подробно останавливаться на работе со средой. Просто посмотри на скриншоты с примерами сценариев, и тебе все сразу станет ясно. 3 кейса использования Sikuli
Как работает 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. |