Специально для Хабр я начинаю серию статей-туториалов по использованию RPA платформы OpenRPA. Буду рад получить от вас комментарии и замечания, если возникнут какие-либо вопросы. Надеюсь, что эта история не оставит вас равнодушными.   Ранее я писал о том, что OpenRPA — это первая open source RPA платформа, которая позволяет полностью избавить себя от платных RPA аналогов. И, как выяснилось в процессе, эта тема позволяет не просто снять компании с "лицензионной иглы", а еще и увеличить получаемые бизнес-эффекты от разработанных роботов. Ведь архитектура новых RPA оказалась гораздо "легче" и, как следствие, быстрее. Благодарю всех читателей, которые проявили интерес к моей предыдущей статье — я очень ценю мнение других, потому что именно это позволяет мне предлагать общественности наиболее актуальные решения. Еще раз спасибо вам за проявленный интерес! В рамках этой статьи будет приведена подробная инструкция по разработке робота, который будет манипулировать оконными GUI приложениями.  Под оконными приложениями понимаются все виды GUI приложений, которые не визуализируются в WEB браузерах. С момента опубликования предыдущей статьи произошли небольшие изменения в названии RPA платформы, а именно: OpenRPA переименовывается в pyOpenRPA. Дело в том, что само по себе название OpenRPA является "говорящим", и "лежит на поверхности". По этой причине его выбрал я, а через некоторое время и другие. Так как концепция pyOpenRPA заключается в абсолютно безвоздмездном использовании и открытости для всех, в этой RPA платформе нет каких-либо бюджетов. В связи с этим нет возможности и отстаивать монопольное право на использование названия (да это и не нужно). В связи с этим, было принято решение немного скорректировать название, чтобы избавить пользователей от возможной путаницы.  По поводу OpenRPA от другой команды: очень надеюсь, что им удастся реализовать свою идею, превзойти по всем параметрам платные RPA платформы, и сохранить свою открытось. В мире open source мы не конкуренты, а коллеги, которые трудятся в одном и том же направлении — в направлении создания полезного открытого продукта. Если говорить про их RPA платформу, то там поставлена цель создания аналога коммерческой RPA платформы с визуальным программированием в основе. Идея очень интересная и привлекательная, но крайне трудозатратная по исполнению (ведь не просто так лучшие RPA платформы постоянно дорабатываются огромными командами разработчиков, что ведет к комерциализации проекта). Желаю им удачи в достижении поставленных целей.  Туториал сверстан в виде серии статей, в которых будут освещаться ключевые технологии, необходимые для RPA.  Освоив эти технологии, у вас появится возможность углубиться в специфику той задачи, которая поставлена перед вами. Перечень статей-туториалов (опубликованные и планируемые):  А теперь перейдем к самому туториалу. Давайте попробуем разобраться в том, как устроены GUI приложения, и почему мы можем ими управлять. Начнем с простого. Рассмотрим на примере классического блокнота, что видим мы, и что видит робот.   Благодаря архитектуре современных операционных систем у сторонних программ имеется программная возможность по обращению к UI элементам — они же UIO сторонних GUI приложений. Эта возможность изначально разрабатывалась для того, чтобы позволить программистам проводить регрессионное тестирование свеого софта, но позже выяснилось, что эту возможность можно использовать и в бизнес-процессах компании. Как мы видим на изображении выше, для робота, блокнот — это набор различных UIO. Причем не просто UIO, а UIO c набором различных атрибутов, и набором различных действий. И что самое главное — наш робот имеет полный доступ ко всем этим атрибутам и действиям. Тут вы можете мне возразить, что это все ерунда, потому что в любой операционной системе реализованы алгоритмы, обеспечивающие разграничение информационных потоков, и одно приложение не может "залезть" в другое приложение. А я вам на это скажу, что это, действительно так, но только для программного (технического) уровня. Вся эта история с безопасностью не работает, когда речь заходит о доступе к GUI интерфейсам других приложений. UIO — это User Interface Object (терминология pyOpenRPA). В целях обеспечения максимальной совместимости, этот экземпляр наследуется от обьектной модели, разработанной в библиотеке pywinauto (нажми, чтобы получить список доступных функций класса).  Данный подход позволяет имплементировать полезную функциональность, которая уже была успешно разработана в других бибилотеках, и дополнить ее недостающей функциональностью. В нашем случае, недостающей функциональностью является возможность динамического обращения к UIO обьектам по UIO селекторам. UIO селектор — это список характеристических словарей (спецификаций UIO). Данные спецификации UIO содержат условия, с помощью которых библиотека pyOpenRPA определит UIO, удовлетворяющий условиям, заданным в спецификации UIO. Индекс спецификации UIO в списке UIO селектора харакетризует уровень вложенности целевого UIO. Говоря другим языком, UIO селектор — это перечень условий, под которые может попасть 0, 1 или n UIO. Ниже приведен перечень атрибутов — условий, которые можно использовать в спецификациях UIO: Пример UIO селектора PS. Перечень функций по работе с UIO селектором представлен в модуле UIDesktop (pyOpenRPA/Robot/UIDesktop.py). Именно эти функции будут использоваться при дальнейшей разработке робота.
Ознакомиться в полным перечнем функций модуля UIDesktop можно здесь Вот мы и добрались до самого интересного и важного раздела этого туториала — это пошаговый пример по созданию своего первого робота с использованием pyOpenRPA. В качестве экспериментального робота поставим себе следующую цель: Разработать робота, который будет контролировать вид интерфейса в приложении "Калькулятор". Если вид интерфейса будет отличаться от вида "Программист", то робот должен будет выставить данный вид в автоматическом режиме. В отличии от подавляющего большинства RPA платформ, в pyOpenRPA реализован другой подход подключения к проекту. Если в остальных RPA платформах необходимо писать робота на языке этой платформы (текстовый, или графический, или скриптовый язык), то в случае pyOpenRPA именно вы определяете где, как и когда нужно использовать эту библиотеку в проекте.  Доступно несколько вариантов загрузки pyOpenRPA: Для того, чтобы начать проект робота, необходимо создать папку проекта. В дальнейшем я затрону тему организации папок проектов для промышленных программных роботов. Но на текущий момент не буду заострять внимание на этом, чтобы сконцентрироваться непосредственно на основном — на логике работы с GUI окнами. Создадим следующую структуру проекта: .cmd файлы в этом проекте играют важную роль — именно благодаря этим файлам мы будем иметь возможность выполнять запуск интересующего нас робота простым кликом по файлу. Ниже приведу пример "RobotCalc_1_Run_x64.cmd" файла (файл "RobotCalc_2_Run_x64.cmd" аналогичен): Если вы скачали преднастроенную версию pyOpenRPA с GitLab (вариант 1, простой): Если вы скачали пакет pyOpenRPA с помощью pip install pyOpenRPA (вариант 2, посложнее): При любом из вариантов через 5 — 15 сек. должна автоматически отобразиться web студия pyOpenRPA (см. ниже)  
Внешний вид web студии pyOpenRPA  Студии pyOpenRPA подсвечивает зеленой окантовкой обнаруженный UI элемент по месту указателя мыши на калькуляторе  Студия pyOpenRPA отобразила иерархию нахождения UI элемента в калькуляторе после отправки сигнала завершения поиска UI элементов (длительное нажатие ctrl) Для того, чтобы убедиться в том, что элемент был обнаружен корректно, достаточно нажать кнопку "Highlight" по тому UI элементу, который интересует. Программа повторно нарисует эеленую окантовку поверх того UI элемента, который был обнаружен. Далее выполнить клик по UI элементу в окне иерархии в студии, после чего перейти в окно редактирования UIO селектора (UIO селектор далее будет использоваться в коде робота в Python 3)  Студия pyOpenRPA сформировала UIO селектор в автоматическом режиме к UI элементу калькулятора В нашем примере UI элемент расположен на 4-м уровне вложенности с атрибутом title = "Hex". В автоматическом режиме pyOpenRPA формирует UIO селектор по индексам расположения в вышестоящих UI элементах. Такой подход достаточно нежелательно использовать в конечных роботах, потому что индексы расположения UI элементов могут динамически изменяться во время работы программы. Произведем преобразование нашего UIO селектора: в следующий вид: Данный UIO селектор будем использовать в роботе для проверки состояния интерфейса калькулятора: если UI элемент успешно обнаруживается, то режим калькулятора установлен верный. Если UI элемент не обнаруживается, то режим калькулятора установлен неверный, и его нужно будет изменить. Для того, чтобы проверить наличие UI элемента по UIO селектору воспользуемся функцией pyOpenRPA.Robot.UIDesktop.UIOSelector_Exist_Bool Для того, чтобы установить режим программиста, воспользуемся еще одной возможностью win32 — активация события, расположенного в меню приложения (см. ниже).  Вид "Программист" в калькуляторе Активация элемента меню выполняется с помощью специальной функции menu_select у корневого UIO объекта GUI приложения. С помощью студии pyOpenRPA сформируем UIO селектор корневого объекта калькулятора Далее запросим UIO объект по UIO селектору, после чего вызовем функцию menu_select, в которую передадим строковый адрес вызываемого элемента меню Обадая всеми необходимыми UIO селекторами и функциями, перейдем к составлению целостного скрипта робота. Ниже я приведу код RobotCalc_1.py файла, готового для запуска (python.exe "RobotCalc_1.py") c детальным описанием каждой строки. Внимание! При запуске робота убедитесь в том, что калькулятор находится в активном состоянии на экране вашего компьютера. Робот начнет отслеживать состояние калькулятора. Если в калькуляторе не будет установлен режим программиста, то робот в течение 1 секунды вернет его в данный режим. Для решения поставленной задачи мы уже обладаем всеми необходимыми UIO селекторами. Необходимо только определиться с функциями, которые дополнительно будем использовать. Для запуска калькулятора будем использовать функцию os.system  PS 1. Для сравнения: Реализация аналогичного алгоритма в другой RPA платформе с помощью инструментов визуального программирования потребует в 3-4 раза больше пространства рабочей области экрана (в связи со спецификой визуального программирования). PS 2. Перечень всех функций в модуле UIDesktop (pyOpenRPA/Robot/UIDesktop.py)
Ознакомиться в полным перечнем функций модуля UIDesktop можно здесь Итак, мы успешно преодолели первые шаги по созданию бесплатных программных роботов. Безусловно, эта статья покрывает далеко не все области программной роботизации. В следующих статьях-туториалах мы остановимся на оставшихся "столпах" роботизированного управления (мышь, клавиатура, распознавание изображения с экрана и web манипуляции).  Надеюсь, что рассмотренные технологии, в первую очередь, помогут вам или вашей компании в достижении поставленных целей. А во вторую очередь, пусть получают выгоду и другие участники RPA рынка (да, я про вендоров платных RPA платформ, многие из которых базируются в США). Всегда открыт к вашим комментариям, и буду рад помочь вам в решении ваших вопросов.  До скорых публикаций! CEO in pyOpenRPA (ORPA)