Добрый день.
Sikuli представляет собой технологию для автоматизации действий в графическом интерфейсе. Пользователь создает скриншоты элементов интерфейса и определяет операции, которые с этими элементами нужно выполнить. Соответственно, Sikuli находит эти элементы и выполняет указанные операции. Sikuli работает в Windows/Mac/Linux. Работа Sikuli в Linux, на наш взгляд, изложена недостаточно подробно, поэтому в данной статье сделан акцент на установку Sikuli в Linux и первые шаги в этом окружении. В качестве платформы выбрана система Linux Mint 12, построенная на базе Ubuntu 11.10, ядра Linux 3.0 и графической среды Gnome 3.2.
Прежде всего, нужно отметить, что среда Sikuli, установленная из репозитория, неработоспособна. При запуске скрипта мы получаем такую ошибку:
[error] Stopped [error] Error message: Traceback (innermost last): (no code object) at line 0 SyntaxError: ('future feature with_statement is not defined', (' ', 1, 6, ''))
О том как справиться с этой ошибкой речь пойдет ниже, а сейчас пакет Sikuli стоит все-таки установить, поскольку он тянет за собой другие пакеты, которые нам пригодятся:
$ sudo apt-get install sikuli-ide Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: ca-certificates-java default-jdk default-jre default-jre-headless icedtea-6-jre-cacao icedtea-6-jre-jamvm icedtea-netx junit jython libaccess-bridge-java libaccess-bridge-java-jni libcommons-cli-java libcommons-lang-java libcv2.1 libhighgui2.1 libjgoodies-forms-java libjson-simple-java libjxgrabkey-java libjxgrabkey-jni libmac-widgets-java libreadline-java libsikuli-script-java libsikuli-script-jni libswingx-java libxt-dev openjdk-6-jdk openjdk-6-jre openjdk-6-jre-headless openjdk-6-jre-lib tzdata tzdata-java Suggested packages: junit-doc jython-doc libmysql-java libpg-java libjgoodies-forms-java-doc libjson-simple-doc libjxgrabkey-doc libreadline-java-doc libsikuli-script-doc libswingx-java-doc openjdk-6-demo openjdk-6-source visualvm icedtea-plugin sun-java6-fonts ttf-sazanami-gothic ttf-kochi-gothic ttf-sazanami-mincho ttf-kochi-mincho ttf-telugu-fonts ttf-oriya-fonts ttf-kannada-fonts ttf-bengali-fonts The following NEW packages will be installed: ca-certificates-java default-jdk default-jre default-jre-headless icedtea-6-jre-cacao icedtea-6-jre-jamvm icedtea-netx junit jython libaccess-bridge-java libaccess-bridge-java-jni libcommons-cli-java libcommons-lang-java libcv2.1 libhighgui2.1 libjgoodies-forms-java libjson-simple-java libjxgrabkey-java libjxgrabkey-jni libmac-widgets-java libreadline-java libsikuli-script-java libsikuli-script-jni libswingx-java libxt-dev openjdk-6-jdk openjdk-6-jre openjdk-6-jre-headless openjdk-6-jre-lib sikuli-ide tzdata-java The following packages will be upgraded: tzdata 1 upgraded, 31 newly installed, 0 to remove and 345 not upgraded. Need to get 56.5 MB of archives. After this operation, 154 MB of additional disk space will be used. Do you want to continue [Y/n]?
Отвечаем Y на заданный вопрос и получаем Sikuli X-1.0-rc2. При запуске скрипта в Sikuli IDE мы получаем указанную выше ошибку. Причина такой ошибки кроется в старой версии Jython 2.2.1, идущей в составе Linux Mint 12, и сравнительно старой версии Sikili X-1.0-rc2, недостаточно отлаженной для данной платформы. Все это можно преодолеть (автор решения – Mike Williamson).
Скачиваем новую версию Jython (2.5.2):
$ wget -O jython_installer-2.5.2.jar http://downloads.sourceforge.net/project/jython/jython/2.5.2/jython_installer-2.5.2.jar?r=http%3A%2F%2Fwiki.python.org%2Fjython%2FDownloadInstructions&ts=1331868765&use_mirror=voxel
Устанавливаем Jython:
$ java -jar jython_installer-2.5.2.jar
В графическом визарде установки будет возможность указать каталог, в который установить jython. Создадим для jython 2.5.2 отдельный каталог /opt/jython2.5.2, сохранив возможность при необходимости вернуться к jython 2.2.1. Делаем симлинк на новый jython:
sudo mv /usr/bin/jython /usr/bin/jython2.2.1 sudo ln -s /opt/jython2.5.2/jython /usr/bin/jython
Проверяем, есть ли у нас необходимые библиотеки:
$ sudo apt-get install libcv2.1 libcvaux2.1 libhighgui2.1 Reading package lists... Done Building dependency tree Reading state information... Done libcv2.1 is already the newest version. libcv2.1 set to manually installed. libhighgui2.1 is already the newest version. libhighgui2.1 set to manually installed. The following NEW packages will be installed: libcvaux2.1 0 upgraded, 1 newly installed, 0 to remove and 345 not upgraded. Need to get 503 kB of archives. After this operation, 1,245 kB of additional disk space will be used. Do you want to continue [Y/n]?
Отвечаем Y. Наконец, скачиваем последнюю версию Sikuli для Linux (http://sikuli.org/download.shtml#linux). На текущий момент это версия Sikuli-X-1.0rc3 (r905).
Запускаем Sikuli IDE:
cd Sikuli-X-1.0rc3 (r905)-linux-i686/Sikuli-IDE/ ./sikuli-ide.sh &
Ошибок при запуске простейших скриптов уже нет, поэтому рассмотрим практический сеанс работы с Sikuli. В качестве примера выбрано приложение mate-volume-control для настройки звука в Alsa. Нижеприведенный скрипт меняет значение опции Auto-Mute Моde: с Enabled на Disabled, или c Disabled на Enabled. Вот как выглядит скрипт:
Замечание: при создании изображений для скрипта использовалось отложенное снятие скриншотов. Почему это понадобилось? Обнаружилось, что если в Linux-приложении вызвать выпадающее меню, то при переключении на другое приложение (например, Sikuli IDE) это меню закрывается. Вот два примера: выбор значения Enabled/Disabled в mate-volume-control и меню в редакторе gedit:
Таким образом, не удается сделать скриншот с помощью операции Take Screenshot. Более того, при активном выпадающем меню скриншот при нажании на кнопку PrtScr тоже не создается. Поэтому в таких случаях мы создаем скриншот с помощью отложенного запуска одной из множества утилит, например встроенной gnome-panel-screenshot. Запускаем команду:
gnome-panel-screenshot --delay 5
Переключаемся на наше приложение, открываем выпадающее меню (в данном случае меню с выбором Enabled/Disabled) и через 5 секунд получаем скриншот. Открываем его в графическом редакторе GIMP и выкусываем нужный кусок.
Вот ролик запуска скрипта. Запись производилась с помощью xvidcap. Есть небольшие графические помехи, но работу скрипта можно увидеть:
Sikuli-скрипт можно вызывать из командной строки, что дает возможность интегрировать sikuli-скрипты в инфраструктуру автотестов:
./sikuli-ide.sh -r /add/Work/sikuli/first.sikuli/
До появления Sikili в Linux не было универсальных средств для работы с графическим интерфейсом. Да, есть TCL/TK, библиотеки Java и Python, но не было инструментов наподобие AutoIt (1, 2, 3, 4)) и PowerShell (1), позволяющих легко и просто работать с широким кругом графических приложений. С приходом Sikuli положение дел меняется. Во-первых, появилась возможность автоматизировать операций в UI вне зависимости от того с каким приложением мы работаем: делаем скриншоты, Sikuli их распознает и выполняет все что нужно. И во-вторых, сглаживаются требования к исходному коду. Да, он по-прежнему должен быть testable, чтобы к его функциональности можно было обращаться снаружи и изнутри. Но теперь, даже если это не так, у нас есть возможность частично обойти эти трудности с помощью Sikuli.
На древнем индейском языке “Sikuli” означает “Глаз Бога”. Думаю, не за горами времена, когда появится “Голос Бога”, позволяющий выполнять операции в UI c помощью команд на человеческом языке.
Что такое качество программного обеспечения и как его улучшить: теория и практика, задачи и решения, подводные камни и обходные пути.
Автор комментария : flat | March 27, 2012
голос бога страдает рандомной глухотой - все-таки image recognition не всегда срабатывает так, как было задумано. Интересно какой движок он использует для распознания, openCV скорее всего.
[Ответить]
Автор комментария : Капитан | March 28, 2012
Flat, спасибо за комментарий.
Да, openCV. А в каких случаях проявляется рандомная глухота? Regions не помогают?
[Ответить]
Автор комментария : flat | April 10, 2012
помогают но не всегда, иногда бывает что распознание области происходит медленнее чем само событие. И текст очень неаккуратно распознаётся
[Ответить]
Капитан отвечает:
April 10th, 2012 в 6:39 pm
Flat,
Да, про распознавание текста верно подмечено.
С низкой скоростью распознавания области не сталкивался (пока что не было актуально). А MinTargetSize не помогает? http://sikuli.org/docx/faq/050-tuning-sikuli.html
[Ответить]
Pingback : OpenQuality.ru | Качество программного обеспечения | July 1, 2013
[…] • Martijn de Vrieze делится своими впечатлениями о Sikuli – инструменте для автоматизации действий в графическом интерфейсе. […]
Pingback : OpenQuality.ru | Качество программного обеспечения | July 24, 2014
[…] для автоматизации действий в графическом интерфейсе) поднималась в блоге два года назад (запуск в среде Linux). Рассмотрим […]