Библиотека 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-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 могут не соблюдать нижеперечисленные соглашения.
Методы поиска c именами, начинающиеся с ‘find’
Выполняют поиск объекта (обычно dom-элемента) на текущем состоянии интерфейса.
Результат выполнения метода: объект типа Optional
HotkeyDropDown.KeySelector keySelector = dropDown.findKeySelector().orElseThrow();
Методы поиска массивов или коллекций, начинающиеся с ‘find’
Выполняют поиск нескольких объектов (обычно dom-элементов) на текущем состоянии интерфейса.
Результат выполнения метода: массив или коллекция найденных объектов.
DialogButton[] buttons = DialogButton.findAll(someDialog);
Assertions.assertTrue(buttons.length > 0);
Методы поиска c именами, начинающимися с ‘get’
Выполняют поиск (обычно dom-элемента). Если поиск ничего не нашёл, метод выбрасывает исключение времени выполнения.
Результат выполнения метода: объект конкретного типа
try {
int recordsNum = grid.getRows().size();
// ...
} catch (RuntimeException exception) {
Assertions.fail(exception.getMessage(), exception);
}
Методы поиска/ожидания 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);
}
Методы поиска с именами, не начинающимися с ‘find’, ‘wait’ или ‘get’
Имеют поведение, идентичное поведению методов поиска с именами, начинающимися с ‘get’.
Требования#
Сервер приложений с версией, равной версии библиотеки или более поздней. C учётом описания в разделе версионирование.
В конфигурации сервера должны быть включены опции автоматизации
Configuration.Client.Automation
:global3.config.xml#<client> <automation metaDataAttributes="true" jexlExecution="true" operExecution="true"/> </client>
При необходимости выполнения тестов, связанных с управлением пользовательскими сеансами, в конфигурации сервера должны быть указаны соответствующие роли для пользователя, от имени которого выполняются тесты:
global3.config.xml#<security> <users> <user name="admin" password="admin" roles="system,http-monitor"/> </users> </security>
Тестовый проект должен использовать 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 репозиторий и зависимость от библиотеки.
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'
}
Пример юнит-теста, использующего библиотеку#
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