Skip to content

Overview (Russian)

Alaksiej Mialeška edited this page Aug 10, 2022 · 2 revisions

Aquality Selenium

Aquality Selenium является надстройкой над инструментом работы с браузером посредством Selenium WebDriver. Работа с Selenium WebDriver требует определенных навыков и опыта. Aquality Selenium предлагает упрощенный, а главное более безопасный и стабильный способ работы с Selenium WebDriver.

Основные преимущества использования Aquality Selenium:

  1. Простая конфигурация
  2. Поддержка запусков в параллели
  3. Гибкая настройка браузера
  4. Стабильная и предсказуемая работа с элементами
  5. Явные ожидания
  6. Набор скриптов JavaScripts для работы в исключительных ситуациях

СОДЕРЖАНИЕ

1. PLATFORM SUPPORT

В настоящее время Aquality Selenium позволяет автоматизировать веб тесты для Chrome, Firefox, Safari, IExplorer, Edge. Также присутствуют возможности самостоятельно реализовать поддержку новых браузеров, которые поддерживаются Selenium (подробнее здесь). При этом запуск тестов может выполняться на любой операционной системе с установленным на ней JDK версии 8 и выше.

2. CONFIGURATIONS

Aquality Selenium предоставляет пользователю гибкие возможности по конфигурации запусков путём предоставления к редактированию конфигурационного файла settings.json Большинство настроек понятны без дополнительных объяснений, но основные моменты обозначены ниже в данном разделе. Также существует возможность использования Aquality Selenium реализовав собственные классы конфигурации.

2.1. SETTINGS

Работа с решением подразумевает использование settings.json или его измененных копий для запуска тестов. Если вы работаете в директории /src/test, то для начала работы скопируйте файл settings.json в директорию /src/test/resources.

По умолчанию у вас есть возможность вносить любые желаемые изменения в settings файл. Но также можно создать несколько копий settings файла для единовременного хранения нескольких конфигураций, отличающихся какими-либо параметрами. При этом создавать данные файлы необходимо в директории 'main/resources' или 'test/resources' в зависимости от того, где вы планируете работать с библиотекой (в main или test). Как правило это удобно, когда есть необходимость выполнять запуск тестов на различных операционных системах, машинах, браузерах и т.п. Например, в настоящее время команда разработчиков Aquality Selenium использует две конфигурации settings.json и settings.local.json для выполнения запусков в локальном docker Circle CI и на персональной инфраструктуре. Для того, чтобы удобно управлять тем, какой конфигурационный файл необходимо использовать можно установить переменную окружения с именем profile и присвоить ей желаемое значение (например, local). В случае запуска при помощи Maven команда запуска может выглядеть так: clean test -Dprofile=local. По умолчанию во время запусков используется settings.json.

Любой параметр settings.json может быть также переопределен через переменную окружения. Для этого необходимо указать jsonPath к параметру в json и его значение. Например: clean test -DdriverSettings.chrome.webDriverVersion=77.0.3865.10

Settings файл содержит в себе несколько секций, назначение которых описывается ниже.

2.2. BROWSER

browserName параметр определяет на каком браузере будет выполняться запуск. Например browser=chrome - означает, что запуск осуществиться в Google Chrome.

isRemote параметр определят будет ли запуск выполняться на той же машине, где выполняется java процесс или использовать удалённый сервер, указанный в параметре remoteConnectionUrl.

2.3. DRIVER SETTINGS

driverSettings секция файла settings.json предоставляет возможность устанавливать необходимые capabilities, options или start arguments для web driver.

Для получения допустимых аргументов и опций обратитесь к официальным источникам от разработчиков браузеров. Например, для chrome: run-chromium-with-flags

Мы постарались здесь описать особенности работы с IExplorer самостоятельно ввиду разрознености информации на этот счёт в интернете.

2.4. TIMEOUTS

settings.json содержит секцию timeouts, которая включает в себя набор параметров, связанных с различного рода таймаутами, используемыми в решении.

Все параметры данной конфигурации используются для инициализации объекта класса TimeoutConfiguration, доступного впоследствии путем обращения AqualityServices.getConfiguration().getTimeoutConfiguration().

Ниже приводится описание параметров из секции timeouts c их назначением:

  • timeoutImplicit = 0 - значение неявного ожидания web driver Selenium Implicit Wait.
  • timeoutCondition = 15 - время ожидания событий в решении. К событиям относятся ожидание элементов или их состояния.
  • timeoutScript = 10 - данное значение служит лимитом выполнения скриптов с использованием метода WebDriver executeAsyncScript
  • timeoutPageLoad = 30 - время ожидания загрузки страницы
  • timeoutPollingInterval = 300 - интервал опроса в при явных ожиданиях

В рамках решения все ожидания элементов выполняются при помощи Excplicit Wait. Перед ожиданием элемента значение implicit wait будет установлено принудительно, независимо от того, что находится в конфигурации. Использование двух типов ожиданий не рекомендовано, так как может приводить к некорректному поведению.

2.5 RETRY POLICY

Секция retry файла settings.json отвечает за конфигурацию количества попыток выполнения операций над элементом. Все операции над элементами (нажатия, ввод текста и т.п.) могут быть выполнены повторно в случае неудачи. Данная логика заложена в классе ElementActionRetrier посредством которого выполняются любые операции. Параметр number означает количество предпринимаемых попыток выполнить операцию прежде чем выбросить исключение. Параметр pollingInterval означает интервал между попытками в миллисекудах. ElementActionRetrier автоматически отлавливает исключения StaleElementReferenceException и ElementNotInteractableException) и повторяет попытку снова.

2.6. LOGGING

Решение поддерживает логирование выполняемых операций (взаимодействие с браузером, элементами страницы). Пример логирования:

2019-07-18 10:14:08 INFO - Label 'First product' :: Moving mouse to element

Логирование поддерживается на языках

  • en - английский
  • be - беларусский
  • ru - русский

Значение языка логирования устанавливается в параметре logger.language.

2.7. CLOUD USAGE

Для того, чтобы настроить запуск на удалённом сервере Selenium Grid (Selenoid, Zalenium) или на платформах вроде BrowserStack, Saucelabs и т.д., необходимо в конфигурационном файле settings.json установить корректное значение URL для подключения к сервису в параметр remoteConnectionUrl, а также убедиться, что параметр isRemote равен true. Например, для BrowserStack параметр может иметь вид https://USERNAME:[email protected]/wd/hub.

2.8. ACTIONS HIGHLIGHTING

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

2.9. ACCESS FROM THE CODE

Доступ к данным из конфигурационного файла обеспечивается посредством обращения к методам экземпляра класса Configuration Например:

AqualityServices.getConfiguration().getBrowserProfile().getBrowserName()

вернёт значение параметра "browser" из settings файла.

Также, вы можете получить нужный вам класс конфигурации через AqualityServices напрямую:

AqualityServices.get(IRetryConfiguration.class).getNumber(); // вернёт количество попыток для действий над элементом, напр. нажатия
AqualityServices.getBrowserProfile(); // вернёт текущий набор настроек браузера.

3. BROWSER

Класс Browser, являющийся своего рода фасадом для WebDriver и содержит методы работы с окном браузера и непосредственно с WebDriver (например, navigate, maximize window и т.д.). Написание скрипта начинается с создания экземпляра Browser - подробнее об этом ниже.

3.1. PARALLEL RUNS

Решение предполагает наличие единственного экземпляра класса Browser (содержит поле типа RemoteWebDriver) в рамках одного потока исполнения. Как правило тесты работают с одним экземпляром браузера и данный подход оптимален.

Если вы решаете задачу использования в рамках одного теста несколько браузеров, каждый браузер необходимо создавать в отдельном потоке. С примерами работы в многопоточном режиме можно ознакомиться здесь BrowserConcurrencyTests.java

Если вы используете стандартные средства параллелизации, предоставляемые такими инструментами как TestNG, JUnit и т.п., для каждого потока будет автоматически создан свой экземпляр Browser.

Если вы хотите использовать parallel streams доступных в Java начиная с 8ой версии, необходимо использовать AqualityServices для установки текущей версии Browser, иначе parallel stream создаст по одному новому браузеру на каждый параллельный поток. Пример использования parallel streams приводится в testShouldBePossibleToUseParallelStreams.

3.2. AQUALITY SERVICES

Класс AqualityServices предоставляет статические методы для доступа к классу Browser и другим утилитам, включённым в данную библиотеку.

Использование AqualityServices потокобезопасно. Внутри AqualityServices используют DI контейнер Guice.

Вы можете переопределить реализацию любого из сервисов в классе, отнаследованом от BrowserModule, и затем проинициализировать AqualityServices в коде, используя метод AqualityServices.initInjector(customModule). Пример использования своей реализации модуля тут: BrowserFactoryTests

3.3. BROWSER FACTORY

Существует несколько вариантов инициализации Browser. Основной способ базируется на использовании класса AqualityServices c набором статических методов для получения Browser. Ниже рассматриваются варианты работы с AqualityServices.

Если нам необходимо получить браузер с данными из конфигурационого settings файла то достаточно просто произвести вызов:

Browser browser = AqualityServices.getBrowser()

Первый вызов getBrowser() создаст необходимый экземпляр с WebDriver (откроется окно браузера, если только не задан headless режим). Все последующие обращения в рамках одного потока будут работать с созданным экземпляром.

Неявно для пользователя AqualityServices предоставляет Browser посредством обращения к фабрике браузеров. В решение существуют следующие реализации фабрик:

  • LocalBrowserFactory - для создания браузера в случае использования параметра isRemote=false
  • RemoteBrowserFactory - для создания браузера в случае использования параметра isRemote=true

Каждая реализация фабрики реализует интерфейс IBrowserFactory с единственным методом Browser getBrowser(). Это предоставляет возможность реализовать свою фабрику. Чтобы getBrowser() возвращал Browser, созданный вашей реализацией фабрики, необходимо до первого вызова getBrowser() установить в AqualityServices свою реализацию фабрики, используя метод setFactory(IBrowserFactory browserFactory). Примеры использования собственной фабрики можно рассмотреть здесь BrowserFactoryTests

Если по каким либо причинам вы решите отказаться от использования фабрик, у вас остается возможность создать экземпляр Browser самостоятельно и в дальнейшем установить его в AqualityServices.setBrowser(Browser browser). Класс Browser содержит публичный конструктор со следующей сигнатурой Browser(RemoteWebDriver remoteWebDriver). Остальные необходимые сервисы получаются из DI контейнера. К примеру, вы можете создать свою реализацию IConfiguration - но при этом вам по прежнему доступно использовать уже имеющуюся реализацию Configuration, наследоваться от неё, использовать имеющиеся реализации IDriverSettings, ITimeoutConfiguration и т.д.

3.4. DRIVER CAPABILITIES

В процессе создания Browser и в частности WebDriver используются реализации интерфейса IDriverSettings. Реализация включает метод getCapabilities, которые впоследствии устанавливаются в WebDriver при его инициализации. Если вы пользуетесь BrowserFactory по умолчанию, список capabilities будет сформирован на основании информации в settings.json файле.

Пример с использованием пользовательских capabilities представлен зедсь testShouldBePossibleToSetFactory.

3.5. DOWNLOAD DIRECTORY

Не редким случаем является необходимость скачивать файлы в браузере и впоследствии производить с ними работу. Чтобы получить текущую директорию для загрузки можно воспользоваться методом getDownloadDirectory() экземпляра Browser.

Для поддержания этой функциональности интерфейс IDriverSettings обязывает реализовать метод String getDownloadDir(). Если вы используете одну из уже реализованных BrowserFactory, то директорию для загрузки файлов необходимо указать в файле settings.json. Например:

{
 "download.default_directory": ".//target//downloads//"
}

Обратите внимание, что ключ download.default_directory отличается для разных браузеров. Изучить какие ключи актуальны для каких браузеров можно в соответствующих классах

ChromeSettings.java

FirefoxSettings.java

В настоящее время решение поддерживает загрузку файлов только в браузерах Chrome, Firefox, Safari.

3.6. ALERTS

Класс Browser предоставляет методы работы с Alerts:

AqualityServices.getBrowser().handleAlert(AlertActions.ACCEPT);

Больше примеров использования можно найти здесь AlertTests.java.

3.7. SCREENSHOTS

Для получения снимков экрана класс Browser предоставляет метод

AqualityServices.getBrowser().getScreenshot()

Более подробный пример использования смотрите в тесте testShouldBePossibleToMakeScreenshot

4. ELEMENTS

Когда Browser инициализирован и осуществлен переход на требуемую страницу можно начинать работу с элементами этой страницы.

4.1. ELEMENT FACTORY

Решение включает класс ElementFactory, который отвечает за создание элемента необходимого типа. Ниже приводится пример получения ITextBox:

IElementFactory elementFactory = AqualityServices.getElementFactory();
ITextBox txbUsername = elementFactory.getTextBox(By.id("username"), "Username");

ElementFactory способна создавать объекты любых классов, реализующих интерфейс IElement. ElementFactory содержит ряд методов, которые возвращают реализации IElement, имеющиеся по умолчанию в решении (IButton, ITextBox, ICheckbox и т.д.). Обратите внимание, что работа с элементами ведется через интерфейсы, чтобы пользователь обращал внимание только на функциональность, но не на реализацию.

4.2. CUSTOM ELEMENTS

Пользователь имеет возможность создать свой элемент или расширить имеющийся по умолчанию. Для этих целей ElementFactory предоставляет метод <T extends IElement> T getCustomElement. Достаточно или реализовать IElement интерфейс или расширить имеющийся класс элемента. С примером расширения и последующего использования можно ознакомиться в классе CustomElementTests.

4.3. LIST OF ELEMENTS

Для получения списка элементов ElementFactory предоставляет метод findElements, использование которого демонстрируется ниже

List<ICheckBox> checkBoxes = elementFactory.findElements(By.xpath(checkboxLocator), ElementType.CHECKBOX);

С другими примерами работы с ElementFactory и элементами можно здесь ElementTests.java.

4.4. STATES OF ELEMENTS

При работе с элементами страницы в зависимости от задачи как правило ожидается либо только нахождение элемента который виден на странице (displayed), либо который хотя бы присутствует в верстке (exists in any state).

Для получения и последующей работы с данными двумя типами элементов ElementFactory предоставляет перегруженные методы получения элементов. Например,

elementFactory.getLink(By.id("redirect"), "Link", ElementState.DISPLAYED);

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

getTxbInput().state().waitForEnabled();
getTxbInput().state().isDisplayed();

Больше примеров можно увидеть в классе ElementStateTests.

5. FORMS

Основное назначение решения - помощь в автоматизации тестирования Web приложений. Существует практика автоматизации с использованием подхода Page Objects. Для поддержания и расширения данного подхода решение предлагает к использованию класс Form, который может служить родительским классом для всех описываемых страниц и форм приложения. Пример использования:

public class SliderForm extends Form {
    public SliderForm() {
        super(By.id("slider_row"), "Slider");
    }
}

Здесь id = "slider_row" устанавливает локатор, который будет использован при проверке открытия страницы/формы, используя метод isFormDisplayed() класса Form.

Пример теста с использованием Page Objects здесь ShoppingCartTest.java.

6. JAVASCRIPT EXECUTION

При необходимости выполнить какой либо JavaScript на открытой странице можно воспользоваться методом

browser.executeScript(final String script, Object... arguments).

Решение содержит достаточное количество наиболее используемых скриптов при выполнении автоматизации тестирования. Список скриптов представлен перечислением JavaScript. Сами скрипты расположены в директории ресурсов /src/main/resources/js. Примеры использования метода имеются в классе BrowserTests.

Также существует перегрузка для передачи файла с JavaScript.

7. JSON FILE

Aquality Selenium использует для своей работы и предоставляет доступ к классу JsonSettingsFile. Данный класс предоставляет удобные методы для работы с JSON файлами вашего проекта. Например, если вы захотите хранить URL сайта с которым вы работаете как параметр конфигурации вы сможете считывать значения из JSON при помощи указанного класса:

ISettingsFile  environment = new JsonSettingsFile("settings.json")
String url = environment.getValue("/url").toString();

8. CONDITIONAL WAIT

В случае необходимости ожидания выполнения какого-либо условия можно воспользоваться предоставляемым в Aquality Selenium классом ConditionalWait.

File fileDownloaded = new File(downloadDirInitialized + fileName);
AqualityServices.getConditionalWait().waitForTrue(() -> fileDownloaded.exists(),
                Duration.ofSeconds(120), Duration.ofMillis(300), "File should be downloaded");

Все методы класса ждут выполнения условия, но по разному возвращают значения и обрабатывают ошибки:

  1. waitForTrue - выкидывает ошибку в случае, если условие не выполнилось, ничего не возвращает.
  2. boolean waitFor - возвращает true если условие выполнилось или false если не выполнилось, ошибок не выбрасывает.
  3. T waitFor - использует ожидание WebDriver'a, возвращает объект T или ошибку, в случае если условие не выполнилось.