Библиотека gs-automation#

Описание#

Библиотека gs-automation.jar предназначена для упрощения написания автоматических тестов и/или скриптов взаимодействия с пользовательским интерфейсом (UI) прикладных приложений Global ERP.

Пользовательский интерфейс является деревом html-элементов, отображаемым веб-браузером. Библиотека содержит набор классов, соответствущих набору элементов пользовательского интерфейса и скрывающих взаимодействие с html-элементам веб-браузера. Взаимодействие классов библиотеки с html-элементам веб-браузера осуществляется средствами библиотеки Selenium, реализующей протокол удалённого управления браузерами WebDriver Api.

Note

Список поддерживаемых браузеров и их версий определяются библиотекой Selenium. Java библиотека Selenium подключена к gs-automation.jar как зависимость и загружается средой разработки из репозитория.

Attention

Во время выполнения тестов библиотека автоматизации с максимально возможной скоростью симулирует поведение пользователя. Это приводит к мельканию на экране изображений и ярких цветов. У некоторых людей могут возникать приступы под воздействием вспышек света, мелькающих изображений и ярких цветов, даже если им никогда не ставили диагноз “эпилепсия”.

Места публикации#

Библиотека#

Библиотека опубликована в репозитории https://repo.global-system.ru

Документация#

GS-AUTOMATION 1.1.0 JavaDoc

Вместе с библиотекой опубликован gs-automation-javadoc.jar,автоматически загружаемый средой разработки IDEA после подключения библиотеки gs-automation.jar к проекту.

Исходные коды#

Вместе с библиотекой опубликован gs-automation-sources.jar,автоматически загружаемый средой разработки IDEA после подключения библиотеки gs-automation.jar к проекту.

Версионирование#

Версии библиотеки имеют формат: gs-automation-{major}.{minor}.{release}.jar.

  • {release} - увеличивается при: рефакторинге; внесении исправлений ошибок; расширении существующего функционала, не требующего изменений требований к минимальным версиям AS.

  • {minor} - увеличивается при: изменении требований к минимальным версиям сервера; добавлении большого объёма нового функционала.

Требования к версиям AS#

Минимальные версии сервера приложений, с которыми может работать библиотека, указываются в атрибуте манифеста библиотеки Server-Minimal-Versions через точку с запятой.

Пример: "Server-Minimal-Versions": "1.23.0-ms8;1.22.0-rc6"

Библиотека, с приведёнными в примере требованиями, может работать с версиями:

  • AS 1.23.0-ms8 и выше.

  • AS 1.22.0-rc6 … AS 1.22.x.

Таблица совместимости версий AS#

Версия библиотеки

Версии сервера приложений

1.0.0

1.23.0-ms8, 1.22.0-rc6

1.0.1

1.23.0-ms8, 1.22.0-rc6

1.1.0

1.26.0-ms13, 1.26.0-rc1

Концепция#

Библиотека может быть использована в любых проектах, способных подключать java-библиотеки.

Создание клиента#

Работа с классами библиотеки начинается с создания экземпляра строителя ClientBuilder и построения экземпляра клиента веб-браузера Client, декорирующего экземпляр org.openqa.selenium.remote.RemoteWebDriver, запускающего и управляющего процессом веб-браузера.

При построении клиента определяются:

  • Конкретная реализация RemoteWebDriver (ChromeDriver, EdgeDriver и т.п.).

  • Адрес сервера приложений Global ERP.

  • Стратегия входа в систему и выбора приложения LoginStrategy .

  • Стратегия закрытия приложения и выхода из системы LogoutStrategy.

  • Учётные данные пользователя и администратора.

Подключение клиента#

В начале работы с клиентом необходимо вызвать метод Client#login(), который выполнит запуск веб-браузера, подключение к системе и открытие приложения. После успешного выполнения всех действий, будет возвращён объект Application.

Выполнение действий#

Тестовый скрипт, вызывая методы объекта Application, выполняет необходимые действия и проверки над UI приложения Global ERP.

Закрытие клиента#

В завершении работы с клиентом необходимо вызвать метод Client#logout(), который выполнит закрытие приложения, завершит пользовательскую сеанс на сервере и закроет веб-браузер.

Соглашения по именам методов для поиска#

Соглашения применяются к методам, имеющим область видимости public. Методы с областями видимости protected или private могут не соблюдать нижеперечисленные соглашения.

  1. Методы поиска c именами, начинающиеся с ‘find’

Выполняют поиск объекта (обычно dom-элемента) на текущем состоянии интерфейса.

Результат выполнения метода: объект типа Optional

Пример поиска#
HotkeyDropDown.KeySelector keySelector = dropDown.findKeySelector().orElseThrow();
  1. Методы поиска массивов или коллекций, начинающиеся с ‘find’

Выполняют поиск нескольких объектов (обычно dom-элементов) на текущем состоянии интерфейса.

Результат выполнения метода: массив или коллекция найденных объектов.

Пример множественного поиска#
DialogButton[] buttons = DialogButton.findAll(someDialog);
Assertions.assertTrue(buttons.length > 0);
  1. Методы поиска c именами, начинающимися с ‘get’

Выполняют поиск (обычно dom-элемента). Если поиск ничего не нашёл, метод выбрасывает исключение времени выполнения.

Результат выполнения метода: объект конкретного типа

Пример получения#
try {
   int recordsNum = grid.getRows().size();
   // ...
} catch (RuntimeException exception) {
   Assertions.fail(exception.getMessage(), exception);
}
  1. Методы поиска/ожидания c именами, начинающимися с ‘wait’

Выполняют ожидание выполнения условия (например: появление dom-элемента). Если за установленное время искомое не появилось на интерфейсе, метод выбрасывает исключение времени выполнения из семейства таймаутов или AutomationException.

Результат выполнения метода: объект конкретного типа

Пример ожидания#
try {
   form = application.waitMdiForm("gtk-ru.bitec.app.gs3.qa.composer.Gs3_QAReferenceWithCollections#List");
   // ...
} catch (AutomationException | TimeoutException exception) {
   Assertions.fail(exception.getMessage(), exception);
}
  1. Методы поиска с именами, не начинающимися с ‘find’, ‘wait’ или ‘get’

Имеют поведение, идентичное поведению методов поиска с именами, начинающимися с ‘get’.

Требования#

  1. Сервер приложений с версией, равной версии библиотеки или более поздней. C учётом описания в разделе версионирование.

  2. В конфигурации сервера должны быть включены опции автоматизации Configuration.Client.Automation:

    global3.config.xml#
    <client>
        <automation metaDataAttributes="true"
                    jexlExecution="true"
                    operExecution="true"/>
    </client>
    
  3. При необходимости выполнения тестов, связанных с управлением пользовательскими сеансами, в конфигурации сервера должны быть указаны соответствующие роли для пользователя, от имени которого выполняются тесты:

    global3.config.xml#
    <security>
      <users>
          <user name="admin" password="admin" roles="system,http-monitor"/>
      </users>
    </security>
    
  4. Тестовый проект должен использовать JDK 11 и выше.

    Note

    Java 11 является минимальной версией, необходимой для работы библиотеки Selenium 4.x.

Функциональные возможности#

  • Аутентификация

    Аутентификация в системе, выход из системы.

    Warning

    Реализована только передача учётных данных (логин+пароль) через URL.

  • Выбор приложения

    Запуск требуемого приложения

    Warning

    Реализован только выбор приложения через сегмент URL-адреса.

  • Нажатие кнопок

    Нажатие(эмуляция клика левой кнопкой мыши) на пункт гл.меню, кнопку панели инструментов.

    Warning

    Известна проблема не срабатывания клика кнопки панели инструментов с первого раза после ввода в карточку.

  • Клики мышкой по вкладкам выборки и вкладкам MDI-форм

    Переключение между вкладками выборки с помощью мышки. Переключение между открытыми MDI-формами с помощью мышки. Закрытие открытых MDI-форм с помощью мышки.

  • Ожидания форм

    Ожидание открытия Главной/MDI/Modal/Lookup-формы и диалогов.

  • Поиск выборок

    Поиск/ожидание появления выборки/выборок в интерфейсе по имени и отображению.

  • Пользовательский ввод.

    Ввод значений в поля карточки и поля редактируемых таблиц.

  • Клики мышкой по кнопкам редакторов

    Открытие выпадающих диалогов и Lookup-форм нажатием мышкой в кнопки редакторов.

  • Взаимодействие с выпадающими диалогами кнопок редакторов

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

  • Выбор строк табличных представлений посредством кликов мышкой

    Позиционирование клика мышки в табличное представление с точностью до требуемой ячейки. Выбор строки таблицы по порядковому индексу. Выбор ячейки таблицы по порядковому индексу строки и порядковому индексу или названию атрибута столбца.

  • Нажатия на клавиатуру

    Симуляция нажатий клавиш клавиатуры (включая комбинации быстрых клавиш).

  • Выполнение Jexl

    Выполнение Jexl-скрипта в контексте серверной выборки с возможностью вернуть строковый результат. Для выборки возможно вызвать те же методы, что в scala-коде операций.

  • Выполнение операции

    Выполнение операции выборки по имени с возможностью вернуть строковый результат.

  • Управление пользовательским сеансами.

    Принудительное закрытие пользовательской сессии или сессий при нештатном выполнении скрипта автоматизации.

Использование#

Подключение к проекту#

Откройте или создайте в IDEA java-проект, использующий JDK 11 или выше.

Добавьте в build.gradle репозиторий и зависимость от библиотеки.

build.gradle#
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(11)
        vendor = JvmVendorSpec.BELLSOFT
    }
}

repositories {
    maven { url = "https://repo.global-system.ru/artifactory/common" }
    maven { url = "https://repo.global-system.ru/artifactory/libs-release" }
}

dependencies {
    implementation 'ru.bitec:gs-automation:1.23.0-ms8'
    testImplementation platform('org.junit:junit-bom:5.9.1')
    testImplementation 'org.junit.jupiter:junit-jupiter'
    testImplementation 'org.junit.jupiter:junit-jupiter-api'
    testImplementation 'org.junit.platform:junit-platform-suite'
}

Пример юнит-теста, использующего библиотеку#

ClientTest.java#
import org.junit.jupiter.api.Test;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import ru.bitec.gs.automation.client.Client;
import ru.bitec.gs.automation.client.ClientBuilder;
import ru.bitec.gs.automation.client.login.*;
import ru.bitec.gs.automation.client.ui.Application;
import ru.bitec.gs.automation.security.CredentialsFactory;
import ru.bitec.gs.automation.security.UserPassword;
import ru.bitec.gs.automation.security.UserPasswordSolution;

public class ClientTest {
    @Test
    public void loginAndOpenCloseApplication_noExceptions() throws Exception {
        UserPasswordSolution userCredential = CredentialsFactory.userPasswordSolution("admin", "admin", "PGTEST");
        UserPassword adminCredential = CredentialsFactory.userPassword("admin", "admin");
        LoginStrategy loginStrategy = LoginStrategyFactory.urlCredentials(
                userCredential,
                "gtk-Gs3_QAApplication",
                "gtk-ru.bitec.app.btk.Btk_Notification#Head");

        RemoteWebDriver remoteWebDriver = new ChromeDriver();
        try (Client client = ClientBuilder.forWebDriver(remoteWebDriver)
                .setUrl("http://localhost:8080")
                .setLoginStrategy(loginStrategy)
                .setAdminCredentials(adminCredential)
                .build()) {
            Application application = client.login();
            try {
                application.mainForm().mainMenu().itemByCaption("Use cases", "Справочник с MDI-карточкой").click();
            } finally {
                client.logout();
            }
        }
    }
}

Пример проекта, использующего библиотеку#

Архив проекта опубликован в git.global-system.ru