Визуальный скриптинг

Предыстория


Каждый из нас когда либо приходил к мысли о необходимости автоматизации тех или иных действий в системе. Лично меня эта мысль посетила когда я пытался объяснить брату, как переставлять модем в режим роутера и обратно (в подробности, зачем было нужно постоянно менять режимы, вдаваться не буду). Т.к. последовательность действий была довольно неочевидна, да ещё и требовала запоминания некоторых данных (например ip-адреса роутера), решил процесс автоматизировать, затратив на это как можно меньше усилий. Немного погуглив нашёл довольно интересный проект SIKULI. Он позволяет автоматизировать управление GUI под основными ОСями, и при этом вам даже не придётся учить новый язык! Тех, кому интересен визуальный скриптинг, прошу под кат.


Что за зверь такой


Сразу встаёт вопрос, почему именно в этот блог я поместил этот топик. Всё просто: Sikuli — это визуальный Python! Т.е. Вы всегда можете использовать синтаксис Питона.
Но лучше всего этот проект опишут сами разработчики: «Sikuli — это визуальная технология автоматизации и тестирования графического интерфейса используя изображения (скриншоты). Sikuli включает: Sikuli Script, API визуального скриптинга для Jython, и Sikuli IDE: среда разработки для лёгкого написания визуальных скриптов скриншотов. Sikuli Script автоматизирует всё, что вы видите на экране, без использования внутренних API системы. Вы можете программно контролировать web-страницы, приложения Windows/Linux/Mac OS X, или даже приложения на iPhone или Android, запущенные в эмуляторе, либо через VNC». Вот такой мощный и, как станет видно ниже, простой скриптовый язык получается.

Ближе к делу


Саму IDE я рассматривать не буду, т.к. это уже сделал за меня товарищ KL7 в своём топике Sikuli — program ANYTHING using GUI screenshoots. Я же приведу конкретный пример, как я автоматизировал смену режимов роутера. Все дальнейшие манипуляции производятся в Sikuli IDE. Итак, приступим.

Первое, что нужно сделать — это запустить браузер, через который будем редактировать настройки модема. Т.к. Crome у меня установлен в папке пользователя и путь к нему содержит кириллицу, а Sikuli такие пути, как я понял, поддерживает плохо, то в качестве браузера я использовал Opera. Для управления приложениями в нашем распоряжении есть три функции: openApp(), switchApp(), closeApp(). Я буду использовать switchApp(), т.к. браузером кто то уже может пользоваться, в таком случае создавать новый не имеет смысла.

Далее создадим новую вкладку. Для этого нужно щёлкнуть в браузере по соответствующей кнопке. Чтобы сделать это программно, нужно вызвать функцию click(). выбираем её в списке функций справа, среда свернётся, предоставляя нам возможность выбрать ту область, по которой необходимо выполнить щелчёк. Обводим кнопку создания новой вкладки. в итоге наша функция в окне редактора будет выглядеть следующим образом:
image

Сразу обратите внимание, как задаётся куда и что печатать. В этом помагает функция type(), которой можно передать как просто текст, так и текст с изображением строки, куда его писать.

Далее иногда выскакивает, а иногда нет (в зависимости от того, закрывали вы браузер или нет с момента прошлого входа в настройки роутера), окно запроса логина и пароля. Отличный случай продемонстрировать, что кроме визуального скриптинга Sikuli поддерживает ещё и Python! Итак, проверку, выскочило ли окно, я организовал следующим образом:
image

Далее следует череда функций Click(), только в одном месте прерывающаяся функцией wait(10), из-за того, что браузеру необходимо перезагрузить страницу.

Напоследок я закрываю вкладку со свойствами роутера, вызывая функцию низкоуровневого упарвления клавиатурой: keyDown(Key.CTRL + «w»)

Послесловие


В итоге мы имеем довольно мощный инструмент автоматизации рутинных действий. Подробнее о нём вы можете почитать на официальном сайте проекта. Удачных вам скриптов!
Поделиться публикацией

Комментарии 31

    +1
    Использую обычно AutoHotkey и/или AutoIt, если подобная надобность возникает.
    Всем устраивает, поглядим, как себя проявит эта вещь.
      0
      AutoIt не получилось с наскоку взять. А этот вошёл довольно легко и сразу.
        0
        Просмотрел несколько примеров. Кросс-платформенность — это, конечно, хорошо. Но вот отсутствие доступа по контролам — это огромный минус. Немного ошибся, когда приписал в одну категорию к первым двум. Безусловно, вещь полезная, но слишком… малофункциональная что ли.
        В общем, понравилось, но использовать никогда не буду.

        >AutoIt не получилось с наскоку взять.
        Странно, там вроде бы довольно просто всё. Немудренный basic-like синтакс. Хотя AutoHotkey мне все же больше нравится.
          0
          Что такое «доступ по контролам»?
            0
            Проще говоря, у каждого элемента в окне приложения есть свой уникальный идентификационный признак. И как бы мы не изменяли интерфейс: поменять, к примеру, язык приложения или стиль оформления(актуально для различных кросс-платформенных приложений, которые используют нативный юзер интерфейс и выглядят по-разному на разных системах), мы всё равно можем обратиться напрямую к этому контролу, а не просто тыкнуть в место, где он должен быть. Это касается не только кнопок и текст боксов, но и различных лейблов и прочих элементов интерфейса.
              0
              Обращаться напрямую к контролу можно только на уровне фреймворка, ибо он ведает что такое контролы и как к ним собственно обращаться. Сделать подобный инструмнет для пары фреймворков (gtk, qt, wx) может быть и можно, но:
              * фрэймворки не стоят на месте, и придется постоянно дорабатывать сабж
              * потеряется поддержка софта, написанного на других фрэймворках, а все их покрыть нереально
                0
                В винде, например, так или иначе создаются окна с хендлами, не?
                  0
                  Не факт, к примеру можно лейбу просто на окне нарисовать, так-же как и любой другой элемент управления, вплоть до кнопок. Все зависит от реализации.
                  Есть программа Spy++, можете ею посмотреть окошки на винде ради интереса.
                    0
                    Можно, конечно, но зачем? Лучше, на мой взгляд, позволить ОСи самой заботиться о фокусе и прочих вещах, а на себя взять отрисовку и какую-то логику на более высоком уровне абстракции.
                    Реальный случай тотального рисования я видел только в покерном клиенте, и то так был реализован только лог, а кнопочки всё равно оставались «настоящими».
                  0
                  Так и есть, поэтому я и пересмотрел своё заявление, что эти приложения «взаимозаменяемы». У них, в итоге, разная направленность получается.
        +1
        ай ай ай, пароль на скриншоте в открытом виде ) пусть он доступен только из локалки, но не по пацански это ;)
          +1
          Если бы только из локалки…
            +1
            Знал же, что то забыл
          0
          Как будет себя вести эта штука, когда окна вдруг изменят своё расположение? Будет искать их на новом месте, используя картинки в скриншотах? Или продолжит кликать и вставлять текст в прежние места на экране?
            0
            Будет искать картинки заново.
              0
              Это, стало быть, она распознавалку использует? Интересно.
            0
            Проект очень перспективный. Большое спасибо за обзор. Мне, как автоматизатору, будет очень интересно попробовать его в действии. Уверен, что этот проект можно сделать намного мощнее используя его, допустим, в связке с WatiN. В рабоче нередко попадалось автоматизация веб-приложений с использованием Flash. Это как раз то, чего не хватало. Спасибо.
              0
              Всегда пожалуйста
              0
              Большое спасибо за обзор программы, она мне пригодиться, но есть одно существенное но (!) — она отказывается производить действия через функцию click(). Я её скачал, установил (вначале помучавшись с нехотением запускать скрипты), потом вошёл в кураж и написал скрипт длинной в 100 строк… и ни один click в нём не работает. Выдаёт ошибку: org.sikuli.script.FindFailed: FindFailed: can not find Pattern(«ManageCookie-1.png»). Хотя видно, что этот элемент есть на экране. Пробовал даже просто сделать скриншот и потом с пэинта вырезать картинку для клика, т.к. когда программно навожу курсор на кнопку, чтобы снять её для функции, то она подсвечивается другим цветом — думал в этом проблема, но нет.

              Может сталкивались с чем-то подобным и знайте решение? А то не хочется такую замечательную программку выкидывать из-за каких-то странных багов.
                0
                А перед тем, как вызывается функция click(), окно уже существует или появляется как раз перед вызовом? Я с такой ошибкой сталкивался когда окно не успевало появится. Попробуйте добавить функцию wait() перед кликами.
                  0
                  Окно существует, попробовал вставить wait — не помогает… Видно, что курсор чутка подрыгает, а потом вываливается ошибка :(
                  Вначале даже подумал, что это из-за того, что у меня Opera на русском, но смена локализации не помогла. Уже и процент схожести поставил меньше — всё равно тоже самое… Даже не знаю что и делать теперь…
                    0
                    хм… Может у sikuli есть зависимость от установленного Python? Возможности проверить у меня нет, т.к. везде Питон стоит
                      0
                      Вот насчёт этого я не думал, спасибо за наводку! Сейчас погуглю по этому поводу) У меня старенький стоять должен. Надо бы найти какой ему нужен.
                        0
                        На сколько я понял вот отсюда — этой штуковине требуется Jython, у меня стоит Python 3.1. Сейчас попробую поставить и надеюсь, что всё заработает.
                          0
                          не работает… уже и так, и сяк попробовал… по лаунчпаду кучу багрепортов оббегал, всё равно не робит :(

                          lexa107, подскажите, пожалуйста, как у вас всё установлено. может быть мне это поможет…
                          Особенно интересует: какая винда; куда поставлена Sikuli; есть ли Питон, где он стоит и его версия; есть ли Джитон, где он стоит и его версия; что написано в переменных среды (PATH для пользователя и для системы, CLASSPATH системы, SIKULI_HOME и если есть JYTHONPATH).
                            0
                            Windows 7 x86. Jython нету, Python расположен по адресу C:\Program files (брал отсюда. В CLASSPATH путь к jre, который брал оттуда же, в SILUKI_HOME — путь к Sikuli, а в переменных Path ничего особенного нету
                              0
                              У меня сначала не хотел работать, видимо из-за jdk.
                              Помогло bugs.launchpad.net/sikuli/+bug/514939/comments/12
                                0
                                lexa107, Saturn812, спасибо за советы! К сожалению, тот скрипт, который я написал всё таки отказался работать, не знаю почему, но возможно это всё таки из-за оперы… Сейчас написал простой скрипт, который делает click() и type() с виндовым пуском и всё заработало. Пойду перепишу свой скрипт для IE)
                                  0
                                  Хорошо то, что хорошо кончается)
                    +1
                    дада, читал в последнем журнале Хакер. Интересная тема.
                      0
                      Спасибо за статью.
                      В копилку: под windows рутину можно также поручать програмке «MouseRobot».

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое