Аннотация

Инструкция предназначена для разработчика пользовательских действий на платформе Robin с использованием языка программирования C# и содержит описание решения следующих задач:

  • создание проекта действия,
  • создание артефактов действия,
  • тестирование и логирование действия,
  • как интегрировать действие в ROBIN Studio.

Основные понятия

Понятия и определения
Понятие Описание
Действие Функция (операция), повторно выполняемая пользователем с помощью компьютерной техники для решения своих повседневных задач, и реализованная в программном коде.
Контракт действия Строковая константа заданного формата. Позволяет однозначно идентифицировать функциональный тип действия в системе.
Реализация действия Программный код, реализующий функцию действия.
Версия реализации действия Реализация действия может иметь несколько версий для каждого языка.
Платформа (тип) реализации действия Язык программирования (Java, C#, Python), на котором реализовано действие.
Версия действия Версия действия на пользовательском уровне. Скрывает от пользователя версию реализации и тип реализации действия.
Супер-действие Чисто техническая сущность - создается в файле ListActions.xml, используется для регистрации пользовательских действий, их версий и платформ реализации в системе.
Определение действия Обязательный артефакт действия, содержащий описание действия, а также его входных параметров и результата исполнения действия. Работа с описанием действия происходит только через интерфейс редактора действий. Этот файл зашифрован и хранится в пакете (архиве), его прочитать нельзя из файловой системы.
Описание реализации действия

Описание реализации действия хранится в файле .robin-impinfo. Файл хранится в корне проекта действия и является обязательным артефактом действия. Содержит следующую информацию:

  • наименование контракта действия,
  • версия реализации действия,
  • тип платформы выполнения (Java, C#, Python),
  • версия схемы ActionImpScheme_ActionImp.xsd,
  • перечень интерфейсов и исключений Robin Action SDK, используемых в реализации действия

Более детальная информация содержится в схеме ActionImpScheme_ActionImp.xsd - см. Приложение 1.

Проект робота Проект содержит функциональный план решения прикладной задачи с использованием функциональных возможностей действий. Задает последовательность выполнения действий с заданными наборами входных и выходных параметров для каждого действия из этой последовательности.
Проект действия Проект, содержащий мета-информацию о действии и его пакеты
Maven-проект Содержит код действия, реализованный на Java, а также его артефакты
.Net-проект Содержит код действия, реализованный на C#, а также его артефакты
Python-проект Содержит код действия, реализованный на Python, а также его артефакты
Артефакты действия
  • Пакет с исполняемым кодом действия
  • Пакет с исходником действия
  • Пакет с документацией действия для студии
  • XML-файл с определением действия
  • XML-файл с описанием реализации действия
  • Запись о действии в супер-действии в файле ListActions.xml
  • Запись о супер-действии в файле ListGroups.xml

Общая схема по созданию и интеграции пользовательских действия с ROBIN Studio

Необходимое ПО

Для создания .net-действий на компьютере разработчика должно быть установлено следующее ПО:

  • .net framework 4.8 sdk - https://dotnet.microsoft.com/download/visual-studio-sdks
  • Visual Studio 2019 - https://visualstudio.microsoft.com/ru/
  • Robin.SDK в составе:
    • набор стандартных библиотек и классов, необходимый для разработки действия на платформе Robin,
    • Robin.ActionEditor - редактор действия,
    • Robin.ActionLoader - утилита импорта пакетов с действиями в Робин Студию,
    • ActionImpScheme_ActionImp.xsd - XSD-схема описания реализации действия.

Общий порядок разработки пользовательского действия

При разработки .net-действия и его интеграции в Студию следует придерживаться следующего порядка:

  1. До начала разработки действия или уже в процессе его разработки разработчик должен определиться с его контрактом и его артефактами:
    • наименование контракта
    • наименование действия
    • описание действия
    • описание входных параметров
    • описание выходных параметров
    • svg-иконка
  2. Если разработчик определился с контрактом действия до его разработки, то он может сразу же приступить к созданию Проекта действия, а потом к его реализации в программном коде.
  3. Если разработчик планирует определиться с контрактом действия в процессе его разработки, то он может приступить к созданию Проекта действия уже после завершения его реализации в программном коде.
  4. С помощью Robin.ActionEditor разработчик:
    • заполняет форму для создания определения нового действия, в котором указаны:
      • наименование контракта
      • описание входных параметров
      • описание выходных параметров
    • выполняет сохранение определения действия в файл *.robin-action (в процессе сохранения создается папка с проектом действия для размещения в нем пакетов и атрибутов действия)
  5. В IDE разработчика:
    • создать новый проект на платформе .Net и реализовать в нем действие
    • создать файл с описанием реализации действия *.robin-impinfo и разместить его в проекте вместе с кодом
    • создать пакеты со скомпилированным кодом, с транзитивными зависимостями и исходным кодом (только в Enterpise)
  6. Далее разработчик должен импортировать из проекта программного кода в Проект действия следующие пакеты:
    • Пакет с реализацией действия
    • Пакеты с транзитивными зависимостями действия
    • Пакет с исходным кодом действия (только в Enterpise)
  7. Добавить действие через существующее или новое супер-действие в ListActions.xml
  8. Если было создано новое супер-действие, то его необходимо добавить в ListGroups.xml в подгруппу или группу супер-действий.
  9. С помощью редактора действий Robin.ActionEditor создать дистрибутив - файл с расширением *.robin-package.
  10. С помощью утилиты импорта Robin.ActionLoader выполнить публикацию пакетов в Робин Студию.

Контракт действия

До начала разработки действия (или уже в процессе его разработки) разработчик должен определиться с его контрактом. Для этого он должен:

  • придумать или использовать уже существующее наименование вендора
  • придумать или использовать уже существующую группу действий, которой будет принадлежать новое действие
  • придумать наименование нового действия
  • определиться с платформой, на которой разработчик предполагает создавать действие

Формат наименования контракта:

<Vendor>.<Group>.<ActionName>
  • <Vendor> - наименование компании разработчика действия
  • <Group> - наименование группы действия
  • <ActionName> - название действия

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

Создание Проекта действия

Структура проекта действия

Создание Проекта действия включает в себя создание структуры папок проекта и подготовку следующих пакетов:

  • Пакет с определением действия (+ документация в html внутри)
  • Пакет с реализацией действия
  • Пакеты с транзитивными зависимостями действия
  • Пакет с исходным кодом действия (только в Enterpise)
  • ListActions.xml - файл со списком супер-действий
  • ListGroups.xml - файл со списком групп

Создание действия начинается с его определения. Создание определения происходит с помощью Robin.ActionEditor, который, помимо создания пакета, создаёт ещё и проект с действием, имеющий особую структуру папок.

Имя папки с проектом действия задаётся в Robin.ActiorEditor при создании проекта. Местоположение по умолчанию - папка Robin Actions в документах пользователя.

Создание проекта действия

Для создания Проекта действия необходимо выполнить следующие действия:

  1. Запустить Robin.ActionEditor

  2. Меню/Создать (нажать на «+»):

  3. Заполнить форму:

  4. Нажать «Создать». В результате в папке C:\Users\%USER%\Documents\Robin\Robin Actions\OOOTest.Const.GetPass будет создан Проект действия со следующим списком артефактов:

    • OOOTest.Const.GetPass.action-project - файл с Проект действиям
    • ListActions.xml - XML-файл с описанием всех действий в проекте
    • ListGroups.xml - XML-файл с описанием всех групп действий в проекте
    • \definition\1.0.0\OOOTest.Const.GetPass-1.0.0.robin-def - шаблон XML-файла с описанием действия:

    и папки для хранения файла с реализацией, исходников и зависимостей действия:

Создание определения действия (.robin-action)

После формирования папки проекта Robin.ActiorEditor позволяет пользователю создать определение действия. Для этого пользователь указывает наименование группы действий и название действия, которые будут потом использованы при формировании контракта действия. Наименование компании указано в конфигурации Robin.ActiorEditor, а для варианта Enterprise - в LDAP. Начальная версия - 1.0.0.

Robin.ActiorEditor формирует пакет c определением действия (архив), имеющий следующее название:

[компания].[группа действий].[действие]-[версия].robin-def

Пример наименования пакета: Robin.Dialogs.ShowMessage-1.0.0.robin-def

    Описание Допустимые значения
Контракт Компания Наименование компании, разработавшей определение действия Буквы латинского алфавита, цифры, нижнее подчёркивание, тире
  Группа действий Наименование группы, к которой относится действие Буквы латинского алфавита, цифры, нижнее подчёркивание, тире
  Действие Наименование действия Буквы латинского алфавита, цифры, нижнее подчёркивание, тире
Версия Версия Версия определения действия в формате X.Y.Z Цифры, точка

Чтобы создать XML-файл с определением действия, необходимо с помощью Robin.ActiorEditor выполнить следующие действия:

  1. Нажать Меню/Открыть

  2. Выбрать файл с проектом действия - MyCompany.CustomActions.CustomAction.action-project:

    ae.5

  3. В результате откроется форма, в которой нужно последовательно заполнить следующие разделы определения действия:

    • Параметры

      ae.7

    • Результат

      ae.8

  4. Завершение работы с редактором:

    • Нажать «Файл/Сохранить» для сохранения определения действия

Файл с определением действия OOOTest.Const.GetPass-<x.y.z>.robin-def будет сохранен в папку C:\Users\<user>\Documents\Robin\Robin Actions\OOOTest.Const.GetPass\definition\<x.y.z>\,

где <x.y.z> - версия действия, начальная версия - 1.0.0, <user> - имя пользователя на компьютере разработчика.

Документация действия

Документация действия подготавливается разработчиком в виде html-документа и кладется в папку C:\Users\<user>\Documents\Robin\Robin Actions\OOOTest.Const.GetPass\definition\<x.y.z>\documentation

Создание описания реализации действия (.robin-impinfo)

Файл с описанием реализации действия имеет расширение .robin-impinfo, а его имя формируется по следующему правилу:

<Vendor>.<GroupName>.<ActionName>-<ExecType>.robin-impinfo

где:

  • <Vendor> - название вендора действия
  • <GroupName> - название группы действий, к которой принадлежит действие
  • <ActionName> - название действия
  • <ExecType>- платформа, на которой реализовано действие

Файл хранится в проекте .Net-действия.

Далее приведены рекомендованные и обязательные элементы и их атрибуты для реализаций, а также их назначения в файле описания реализации действия:

Элементы и атрибуты XML-реализаций
Имя элемента Атрибуты элемента Родитель элемента Обязательность Описание значения
ImplementationInfo     Да Корневой элемент описания реализации действия
contract   Да <vendor-name>.<action-group>.<action-name>
version   Да Версия действия
execType   Да Тип реализации
schemaVersion   Да Версия xml-схемы описания реализации действия
Author   ImplementationInfo Да Автор
RequiredInterfaces   ImplementationInfo Да Обязательный элемент. Должен быть даже, если ни одного требуемого интерфейса нет
RequiredInterface   RequiredInterfaces Нет Полное название, включая namespace (или имя пакета, в зависимости от платформы) интерфейса, который требуется действию для его работы.
RequireUiThread   ImplementationInfo Да Флаг говорящий о том, что данному действию необходим для работы графический контекст. Если реализация действия взаимодействует с UI, данное значение должно true
Exceptions   ImplementationInfo Да Список исключений, которое может генерировать данное действие
ExceptionInfo   Exceptions Нет Исключение
DeprecatedVersions   ImplementationInfo Нет Список запрещенных версий реализаций данного действия
DeprecatedVersion   DeprecatedVersions Нет Запрещенная версия реализации действия
AssemblyName   ImplementationInfo Нет Для .NET - полное имя сборки. Элемент специфичен только для платформы .NET
PackageName   ImplementationInfo Нет Имя пакета содержащего реализацию действия
CommitHash   ImplementationInfo Нет Хеш комита из которого собрано действие
ListPermittedOS   ImplementationInfo Нет Список разрешенных версий ОС
PermittedOS   ListPermittedOS Нет Разрешенная версия ОС
TypePermittedOS   PermittedOS Нет Тип, представляющий информацию о релизах ОС
OSRelease   PermittedOS Нет Номер релиза
OSType   PermittedOS Нет Разрядность ОС
OSDistributorID   PermittedOS Нет Название дистрибутива

Особенности создания файла .robin-impinfo для каждой платформы описаны в соответствующих каждой платформе разделах по созданию действий

Создать действие

Подробные инструкции создания действия на языках программирования располагаются в разделе Создание .Net-действия

Импорт действия из .Net-проекта в проект действия

Далее разработчик подготавливает пакеты:

  • Пакет с реализацией действия
  • Пакеты с транзитивными зависимостями действия
  • Пакет с исходным кодом действия (только в Enterpise)

и копирует их в структуру Проекта действия.

ListActions.xml

Для того чтобы добавить новое действие, нужно либо создать новое супер-действие в ListActions.xml, либо включить действие в уже существующее супер-действие.

Намерения пользователя Действия пользователя
Добавление действия в существующее супер-действие Сначала ListActions.xml выгружается из кэша студии с помощью утилиты импорта, выгруженный файл включает в себя только список супер-действий без конкретных реализаций. После этого пользователь добавляет туда новое действие
Добавление действия в новое супер-действие У пользователя есть пример ListActions.xml, поставляемый в качестве примера в составе SDK. После этого пользователь добавляет туда новое действие

ListActions.xml содержит корневой XML-элемент <ListSuperActions>, внутри которого располагаются один или несколько XML-элементов <SuperAction>.

Разработчик для своего нового действия должен создать новый <SuperAction> или воспользоваться имеющимся, если он есть.

<SuperAction> имеет следующую структуру:

  • заголовочную часть <Titles/>
  • описательную часть <Descriptions/>
  • список с контрактами <ActionContracts/>
  • иконку в формате SVG <IconSvg/>

<ActionContracts/> содержит список контрактов с реализациями действий - <ActionContract/>

Если разработчик создал еще одну версию созданного ранее действия, то ему необходимо в файл ListActions.xml добавить новый XML-элемент <ActionContract/> следующего содержания:

<ActionContract contract="<контракт>" impVersion="<версия контракта>" superActionVersion="<версия супер-действия>" execType="<платформа>"/>

Пример ListActions.xml

<?xml version="1.0" encoding="utf-8"?>
<ListSuperActions
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xsi:noNamespaceSchemaLocation="http://packages.itbs.it.ru:8083/repository/raw-robin-artifacts/schemes/ListActions/1.2.0/ListActions.xsd"
    schemaVersion="1.0.0"
    version="1.2.0"
>
    <SuperAction actionID="Const.GetPass">
        <Titles>
            <Title lang="ru-RU">
                <content>Получить пароль</content>
            </Title>
            <Title lang="en-US">
                <content>Get pass</content>
            </Title>
        </Titles>
        <Descriptions>
            <Description lang="ru-RU">
                <content>Получить пароль</content>
            </Description>
            <Description lang="en-US">
                <content>Get pass</content>
            </Description>
        </Descriptions>
        <ActionContracts>
            <ActionContract contract="OOOTest.Const.GetPass" impVersion="1.3.0" superActionVersion="1" execType="net" />
        </ActionContracts>
        <IconSvg>
            <svg width="54" height="29" viewBox="0 0 54 29" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path fill-rule="evenodd" clip-rule="evenodd" d="M1.42595 28.3864L1.23442 28.8482C1.47024" fill="#474F64" />
            </svg>
        </IconSvg>
    </SuperAction>
</ListSuperActions>

ListGroups.xml

Если было создано новое супер-действие, то его необходимо добавить в ListGroups.xml в подгруппу или группу супер-действий.

Намерения пользователя Действия пользователя
Добавление супер-действия в существующую подгруппу существующей группы Сначала ListGroups.xml выгружается из кэша студии с помощью утилиты импорта, выгруженный файл включает в себя только структуру групп и подгрупп без наполнения. После этого пользователь добавляет супер-действие туда, куда ему нужно
Добавление супер-действия в существующую группу  
Добавление супер-действия в новую подгруппу существующей группы  
Добавление супер-действия в новую подгруппу новой группы У пользователя есть пример ListGroups.xml, поставляемый в качестве примера составе SDK. После этого пользователь добавляет туда новое супер-действие

ListGroups.xml содержит корневой XML-элемент <ListGroups>, внутри которого располагаются один или несколько XML-элементов <Group>.

Разработчик для своего нового действия должен создать новый элемент <Group> или воспользоваться имеющимся, если он есть.

<Group> имеет следующую структуру:

  • заголовочную часть <Titles/>
  • описательную часть <Descriptions/>
  • иконку в формате SVG <IconSvg>
  • список с контрактами <Actions/>

<Actions/> содержит список супер-действий - <Action/>

Пример ListGroups.xml

<?xml version="1.0" encoding="utf-8"?>
<ListGroups
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xsi:noNamespaceSchemaLocation="http://packages.itbs.it.ru:8083/repository/raw-robin-artifacts/schemes/ListGroups/1.1.0/ListGroups.xsd"
    schemaVersion="1.1.0"
    version="1.0.0"
>
    <Group name="Const">
        <Titles>
            <Title lang="ru-RU">
                <content>Константы</content>
            </Title>
            <Title lang="en-US">
                <content>Const</content>
            </Title>
        </Titles>
        <Descriptions>
            <Description lang="ru-RU">
                <content>Группа действий "Константы"</content>
            </Description>
            <Description lang="en-US">
                <content>"Const" actions group</content>
            </Description>
        </Descriptions>
        <IconSvg>
            <svg width="17" height="21" viewBox="0 0 17 21" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path d="M8.5 0L0 3.77778V9.44444C0 14.6861 3.62667 19.5878 8.5 20.7778C13.3733 19.5878 17 14.6861 17 9.44444V3.77778L8.5 0ZM8.5 10.3794H15.1111C14.6106 14.2706 12.0133 17.7367 8.5 18.8228V10.3889H1.88889V5.00556L8.5 2.06833V10.3794Z" fill="#3B4C77"/>
            </svg>
        </IconSvg>
        <Actions>
            <Action actionID="Const.GetPass" />
        </Actions>
    </Group>
</ListGroups>

Создать дистрибутив с действием

Теперь можно создать дистрибутив с действием. Для этого необходимо запустить Robin.ActionEditor и выполнить следующие действия:

  • открыть Проект действия с пользовательским действием
  • нажать на «Файл/Сохранить как пакет»

В результате этой операции в корне Проекта действия появится пакет с дистрибутивом - OOOTest.Const.GetPass-1.0.0.robin-package

Импорт действия в ROBIN Studio

Для импорта действия в Робин Студию необходимо:

  1. Запустить утилиту импорта
  2. Выбираем подготовленный пакет для импорта - *.robin-package
  3. Нажимаем кнопку «импортировать»
  4. Нажимаем кнопку «обновить кэш»
  5. Запускаем Робин студию и находим добавленное действие
  6. Используем действие

Создание .Net-действия

Установка ПО

Для создания .net-действий на компьютере разработчика должно быть установлено следующее ПО:

Создание проекта действия

Перед созданием проекта требуется установить пакет с шаблоном действия, для этого нужно в командной строке выполнить

dotnet new -i <%AppData%\Local\Programs\Robin Platform\Robin SDK\2.0\TemplatePack\Internal.Build.ActionTemplate.1.0.1.nupkg>

После этого в списке шаблонов появится новый шаблон:

Для создания проекта нужно выполнить команду:

dotnet new action --force -o <путь, по которому будет создан проект> --company <имя компании> --group <имя группы, к которой принадлежит действие> --action <название действия>

Все параметры должны быть написаны латинскими буквами и символами (не позволительны русские буквы и пробелы) и будут использованы для создания контракта в формате company.group.action.version. Также есть опциональный параметр --actionVersion <версия действия>, значение по умолчанию: 1.3.0.

После выполнения в указанной директории должны появиться следующие файлы:

  • Action.sln - решение, содержащее проект с действием
  • Action.csproj - проект действия
  • Action.cs - исходный код действия
  • Company.Group.Action-net.robin-impinfo - информация о реализации

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

Описание проекта

Файл Company.Group.Action-net.robin-impinfo содержит информацию о реализации: название, издателя и версию. Ниже приведен пример созданного файла, сгенерированного с использованием в указанных в примере параметрах

<?xml version="1.0" encoding="UTF-8"?>
<ImplementationInfo version="$version$" contract="$company$.$group$.$action$" execType="net" schemaVersion="1.0.8">
  <Author>$company$</Author>
  <RequireUiThread>true</RequireUiThread>
    <RequiredInterfaces>
    <RequiredInterface>Robin.Engine.Services.Interfaces.IActionLogger</RequiredInterface>
  </RequiredInterfaces>
  <RequireUiThread>false</RequireUiThread>
  <AssemblyName>$company$-Imp.$group$.$action$, Version=$version$.0, Culture=neutral, PublicKeyToken=null</AssemblyName>
  <PackageName>$company$-Imp.$group$.$action$</PackageName>
</ImplementationInfo>
  • version - версия действия, ее необходимо поднять при создании новой версии.
  • execType - платформа, на которой написана реализация
  • schemaVersion - версия схемы с определением impinfo, сейчас используется 1.0.8
  • Author - издатель действия

Решение Action.sln содержит следующую структуру файлов

Перед редактированием кода необходимо восстановить пакеты Nuget, используемые в проекте. Для этого, нажмите правой кнопкой мыши по решению и выберите «Восстановить пакеты Nuget». Если пакеты были восстановлены успешно, то сборка проекта завершится без ошибок. Подробнее о пакетах указано ниже.

Состав пакетов SDK

В состав Robin SDK входят nuget-пакеты, содержащие интерфейсы и классы, необходимые для написания действий. Ниже приведено краткое описание пакетов и их содержимого:

Наименование пакета Версия пакета Описание пакета
nuget.build.tasks.pack 5.3.1 Необходим для создания nuget пакетов с реализацией пользовательского действия. Должен быть использован во всех действиях.
robin.sdk.actions 1.4.0 Основной пакет для действий, в нем предоставлены: абстрактный класс BaseRobinAction, от которого должны наследоваться реализации действий и интерфейсы сервисов.

Для групп действий, где несколько действий работают с общими объектами, используются nuget пакеты с определением контекстов для их дальнейшей передачи действиям. Такие пакеты имеют наименование robin.%group%.commonclasses. При разработке действий, работающих с контекстами издателя, необходимо добавить в проект соответствующий пакет CommonClasses. Список пакетов указан ниже:

  • robin.xml.commonclasses 1.0.0
  • robin.web.commonclasses 2.0.0
  • robin.ftp.commonclasses 2.0.5
  • robin.pdf.commonclasses 1.0.1
  • robin.word.commonclasses 2.0.2

Если тип, используемый в действии, не является нативным типом языка разработки, то необходимо включить в проект пакет с определением типа. Более подробно можно узнать в Приложении 2. Список пакетов, содержащих определение типов, указан ниже:

  • robin.type.filepath 2.0.0
  • robin.type.folderpath 2.0.0
  • robin.type.hotkeys 2.0.0
  • robin.type.image 2.0.0
  • robin.type.webelement 2.0.0
  • robin.type.winelement 2.0.0
  • robin.type.password 2.0.0

Написание реализации

Исходный код реализации расположен в файле Action.cs. Ниже приведен код, полученный после генерации проекта

using Robin.ActionSDK;
using Robin.Engine.Services.Interfaces;
using System.Collections.Generic;
using System;

namespace OOO.Test
{
    public class Test : BaseRobinAction
    {
        public Test(IActionLogger logger) : base(logger) { }
        public override IDictionary<string, object> Execute(IDictionary<string, object> parameters)
        {
            return null;
        }
    }
}

Класс BaseRobinAction - абстрактный класс для действия, от которого необходимо наследовать свое действие при разработке, находящийся в пространстве имен Robin.ActionSDK.

Интерфейс IActionLogger содержит интерфейс для работы с классами логирования, интерфейс находится в пространстве имен Robin.Engine.Services.Interfaces.

В конструкторе текущего класса необходимо указать все необходимые для работы сервисы, например, для работы с ресурсами необходимо указать в аргументах IResourcesFolderService.

При выполнении действия роботом вызывается метод Execute, на вход которому передается Dictionary с параметрами, указанными в действии, результаты действия возвращаются как результат выполнения метода Execute, при его отсутствии возвращается null, если действие должно возвращать результат, то необходимо написать следующий фрагмент кода.

IDictionary<string, object> result = new Dictionary<string, object>
{
    {"Result", resultValue}
};
return result;

Добавление логирования

В конструкторе класса действия на вход был получен IActionLogger logger. Мы можем обратиться к сервису логирования через наследуемый атрибут Logger, сервис логирования имеет несколько уровней логирования:

  • Debug
  • Info
  • Warning
  • Error

При указании в студии у действия нужного уровня логирования, мы получим при выполнении логи от соответствующего уровня. Для создания логов в исходном коде необходимо вызвать

Logger.<Level>(<message>);

Например:

Logger.Error("Возникла ошибка при работе действия");
Logger.Debug("Первый этап действия завершился успешно");

Сборка проекта и создание Nuget пакета

При помощи утилиты nuget соберите пакет действия.

Приложение 1. Схема имплементации действия ActionImpScheme_ActionImp.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.5.0">
    <xs:element name="ImplementationInfo">
        <xs:annotation>
            <xs:documentation>Корневой элемент описания реализации действия</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="RequiredInterfaces">
                    <xs:annotation>
                        <xs:documentation>Обязательный тег. Должен быть даже если ни одного требуемого интерфейса нет. (дабы отловить файлы в которые забыли это добавить)</xs:documentation>
                    </xs:annotation>
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="RequiredInterface" type="xs:string" minOccurs="0" maxOccurs="unbounded">
                                <xs:annotation>
                                    <xs:documentation>Полноге название (включая неймспейс) интерфейса, который требуется действию для его работы. (действие его запрашивает, помещая в свой конструктор)</xs:documentation>
                                </xs:annotation>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="DeprecatedVersions" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Список запрещенных версий реализаций данного действия</xs:documentation>
                    </xs:annotation>
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="DeprecatedVersion" type="xs:string" maxOccurs="unbounded">
                                <xs:annotation>
                                    <xs:documentation>Запрещенная версия реализации действия</xs:documentation>
                                </xs:annotation>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="Author" type="xs:string" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Автор последних изменений</xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="Build" type="xs:string" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Номер билда</xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="DateBuild" type="xs:dateTime" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Дата и время сборки действия</xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="RequireUiThread" type="xs:boolean" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Флаг говорящий о том, что данному действию необходим для работы графический контекст</xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="AssemblyName" type="xs:string" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Для .NET - полное имя сборки</xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="PackageName" type="xs:string" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Имя пакета содержащего реализацию действия</xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="CommitHash" type="xs:string" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Хеш комита из которого собрано действие</xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="Exceptions" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Список исключений, которое может генерировать данное действие</xs:documentation>
                    </xs:annotation>
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="ExceptionInfo" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:attribute name="typeID" type="xs:string" use="required">
                                        <xs:annotation>
                                            <xs:documentation>Идентификатор типа исключения</xs:documentation>
                                        </xs:annotation>
                                    </xs:attribute>
                                    <xs:attribute ref="version" use="required">
                                        <xs:annotation>
                                            <xs:documentation>Версия описания типа исключения</xs:documentation>
                                        </xs:annotation>
                                    </xs:attribute>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="ListPermittedOS" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="PermittedOS" type="TypePermittedOS" maxOccurs="unbounded"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute ref="version" use="required"/>
            <xs:attribute name="contract" type="xs:string" use="required"/>
            <xs:attribute name="schemaVersion" type="xs:string" use="required"/>
            <xs:attribute name="execType" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>
        <xs:attribute name="version" type="xs:string">
        <xs:annotation>
            <xs:documentation>Версия чего либо</xs:documentation>
        </xs:annotation>
    </xs:attribute>
    <xs:complexType name="TypePermittedOS">
        <xs:annotation>
            <xs:documentation>Тип представляющий информацию о релизах ОС</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="OSDistributorID" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Название дистрибутива</xs:documentation>
                    <xs:documentation>Позволительно указывать перечисление дистрибутивов ОС через запятую (для линукса справедливо) Позволительно вообще не указывать данный атрибут и это значить любой дистрибутив ОС</xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="OSRelease" type="xs:string" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>Номер релиза</xs:documentation>
                    <xs:documentation>Позволительно префиксом указывать ">=" что означает от данной версии и выше. Позволительно указывать перечисление версий ОС через запятую. Позволительно вообще не указывать данный атрибут и это значить любая версия ОС</xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="OSType" default="64" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>разрядность ОС</xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:integer">
                        <xs:enumeration value="32"/>
                        <xs:enumeration value="64"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

Приложение 2. Типы в SDK Robin

Тип Robin.Boolean

Сериализация типа: Да

Нативный тип .NET: System.Boolean

Презентационное значение объекта: Получается с помощью toString()

Пример: true

Тип Robin.Collection

Сериализация типа: Да

Нативный тип .NET: List<object>

Презентационное значение объекта: Количество записей в коллекции. Получается с помощью toString()

Пример: Записей = 5 - выдает число элементов (записей) в коллекции.

Тип Robin.DataTable

Сериализация типа: Да

Нативный тип .NET: System.Data.DataTable

Презентационное значение объекта: Получается с помощью toString()

Пример: Столбцов = 45, Строк = 74 - выдает число столбцов и строк в таблице.

Тип Robin.DateTime

Сериализация типа: Да

Нативный тип .NET: System.DateTime

Презентационное значение объекта: Получается с помощью toString()

Пример: Дата и время в формате dd-MM-yyyy HH:mm:ssXXX: 22-07-2020 10:17:34 +03:00

Тип Robin.Dictionary

Сериализация типа: Да

Нативный тип .NET: System.Collections.Generic.Dictionary<string, object>

Презентационное значение объекта: Получается с помощью toString()

Пример: Записей = 68 - выдает число элементов (записей) в словаре.

Тип Robin.Exception

Сериализация типа: Нет

DTO-тип .NET: Robin.SDK.Types.Interfaces.RobinException из Nuget-пакета Robin.SDK.Actions.1.3.0

Презентационное значение объекта: Получается с помощью toString()

Пример: Поля структуры ошибки, выведенные каждое на новой строке:

  • Тип: …
  • Сообщение: …
  • Источник: …
  • Дополнительная информация: ключ=значение, ключ=значение
  • Вложенное исключение: есть/нет

Тип Robin.FilePath

Сериализация типа: Да

DTO-тип .NET: Robin.Type.RobinFilePath из Nuget-пакета Robin.Type.FilePath.2.0.0

Презентационное значение объекта: Получается с помощью toString()

Пример: C://Temp/1.txt - строка внутри обёртки FilePath

Тип Robin.FolderPath

Сериализация типа: Да

DTO-тип .NET: Robin.Type.RobinFolderPath из Nuget-пакета Robin.Type.RobinFolderPath.2.0.0

Презентационное значение объекта: Получается с помощью toString()

Пример: C://Temp/1.txt - строка внутри обёртки FolderPath

Тип Robin.HotKeys

Сериализация типа: Да

DTO-тип .NET: Robin.Type.RobinHotKeys из Nuget-пакета Robin.Type.RobinHotKeys.2.0.0

Презентационное значение объекта: Отсутствует

Пример:

Тип Robin.Image

Сериализация типа: Да

DTO-тип .NET: Robin.Type.RobinImage из Nuget-пакета Robin.Type.RobinImage.2.0.0

Презентационное значение объекта: Получается с помощью toString()

Пример: C://Temp/1.png - строка внутри обёртки Image

Тип Robin.LocationPoint

Сериализация типа: Да

Нативный тип .NET: System.Drawing.Point

Презентационное значение объекта: Получается с помощью toString()

Пример: (24, 32) - координаты точки в формате (x, y)

Тип Robin.Numeric

Сериализация типа: Да

Нативный тип .NET: double

Презентационное значение объекта: Получается с помощью toString()

Пример: 28.5

Тип Robin.Object

Сериализация типа: Нет

Нативный тип .NET: object

Презентационное значение объекта: Отсутствует

Пример:

Тип Robin.Password

Сериализация типа: Да

DTO-тип .NET: Robin.Type.RobinPassword из Nuget-пакета Robin.Type.RobinPassword.2.0.0

Презентационное значение объекта: Отсутствует

Пример:

Тип Robin.RectangleSize

Сериализация типа: Да

Нативный тип .NET: System.Drawing.Size

Презентационное значение объекта: Получается с помощью toString()

Пример: 240 x 320 - размер прямоугольной области в формате W x H

Тип Robin.Selenium

Сериализация типа: Нет

Нативный тип .NET: object

Презентационное значение объекта: Отсутствует

Пример: Экземпляр Web-драйвера

Тип Robin.String

Сериализация типа: Да

Нативный тип .NET: string

Презентационное значение объекта: Сама строка и является презентационным значением объекта

Пример: Строка объекта

Тип Robin.WebElement

Сериализация типа: Да

DTO-тип .NET: Robin.Type.RobinWebElement из Nuget-пакета Robin.Type.RobinWebElement.2.0.0

Презентационное значение объекта: Выводится одно из полей структуры. Какое поле выводить указано в поле activeAttribute этой же структуры.

Пример:

Тип Robin.WinElement

Сериализация типа: Да

DTO-тип .NET: Robin.Type.RobinWinElement из Nuget-пакета Robin.Type.RobinWinElement.2.0.0

Презентационное значение объекта:

Пример:

Тип Robin.XmlDoc

Сериализация типа: Да

Нативный тип .NET: System.Xml.XmlDocument

Презентационное значение объекта: XML представление xml документа(при презентации пользователю в виде одной строки - обрезается (программой презентующей), но есть возможность посмотреть полный текст.

Пример:

Тип Robin.Email

Сериализация типа: Нет

Нативный тип .NET: нет соответствия

Презентационное значение объекта: Отсутствует

Пример:

Тип Robin.FTP

Сериализация типа: Нет

Нативный тип .NET: нет соответствия

Презентационное значение объекта: Отсутствует

Пример:

Тип Robin.MQ

Сериализация типа: Нет

Нативный тип .NET: нет соответствия

Презентационное значение объекта: Отсутствует

Пример:

Тип Robin.PDF

Сериализация типа: Нет

Нативный тип .NET: нет соответствия

Презентационное значение объекта: Отсутствует

Пример:

Тип Robin.SpreadSheets

Сериализация типа: Нет

Нативный тип .NET: нет соответствия

Презентационное значение объекта: Отсутствует

Пример:

Тип Robin.Word

Сериализация типа: Нет

Нативный тип .NET: нет соответствия

Презентационное значение объекта: Экземпляр Word

Пример:

Тип Robin.XML

Сериализация типа: Нет

Нативный тип .NET: нет соответствия

Презентационное значение объекта: Отсутствует

Пример: