-
Notifications
You must be signed in to change notification settings - Fork 34
Overview (Russian)
Aquality Selenium является надстройкой над инструментом работы с браузером посредством Selenium WebDriver. Работа с Selenium WebDriver требует определенных навыков и опыта. Aquality Selenium предлагает упрощенный, а главное более безопасный и стабильный способ работы с Selenium WebDriver.
Основные преимущества использования Aquality Selenium:
- Простая конфигурация
- Поддержка запусков в параллели
- Гибкая настройка браузера
- Стабильная и предсказуемая работа с элементами
- Явные ожидания
- Набор скриптов JavaScripts для работы в исключительных ситуациях
СОДЕРЖАНИЕ
- 1. PLATFORM SUPPORT
- 2. CONFIGURATIONS
- 3. BROWSER
- 4. ELEMENTS
- 5. FORMS
- 6. JAVASCRIPT EXECUTION
- 7. JSON FILE
- 8. CONDITIONAL WAIT
В настоящее время Aquality Selenium позволяет автоматизировать веб тесты для Chrome, Firefox, Safari, IExplorer, Edge. Также присутствуют возможности самостоятельно реализовать поддержку новых браузеров, которые поддерживаются Selenium (подробнее здесь). При этом запуск тестов может выполняться на любой операционной системе с установленным на ней JDK версии 8 и выше.
Aquality Selenium предоставляет пользователю гибкие возможности по конфигурации запусков путём предоставления к редактированию конфигурационного файла settings.json Большинство настроек понятны без дополнительных объяснений, но основные моменты обозначены ниже в данном разделе. Также существует возможность использования Aquality Selenium реализовав собственные классы конфигурации.
Работа с решением подразумевает использование 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 файл содержит в себе несколько секций, назначение которых описывается ниже.
browserName
параметр определяет на каком браузере будет выполняться запуск. Например browser=chrome - означает, что запуск осуществиться в Google Chrome.
isRemote
параметр определят будет ли запуск выполняться на той же машине, где выполняется java процесс или использовать удалённый сервер, указанный в параметре remoteConnectionUrl
.
driverSettings
секция файла settings.json предоставляет возможность устанавливать необходимые capabilities, options или start arguments для web driver.
Для получения допустимых аргументов и опций обратитесь к официальным источникам от разработчиков браузеров. Например, для chrome: run-chromium-with-flags
Мы постарались здесь описать особенности работы с IExplorer самостоятельно ввиду разрознености информации на этот счёт в интернете.
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 будет установлено принудительно, независимо от того, что находится в конфигурации. Использование двух типов ожиданий не рекомендовано, так как может приводить к некорректному поведению.
Секция retry
файла settings.json отвечает за конфигурацию количества попыток выполнения операций над элементом.
Все операции над элементами (нажатия, ввод текста и т.п.) могут быть выполнены повторно в случае неудачи.
Данная логика заложена в классе ElementActionRetrier посредством которого выполняются любые операции.
Параметр number
означает количество предпринимаемых попыток выполнить операцию прежде чем выбросить исключение.
Параметр pollingInterval
означает интервал между попытками в миллисекудах.
ElementActionRetrier автоматически отлавливает исключения StaleElementReferenceException и ElementNotInteractableException) и повторяет попытку снова.
Решение поддерживает логирование выполняемых операций (взаимодействие с браузером, элементами страницы). Пример логирования:
2019-07-18 10:14:08 INFO - Label 'First product' :: Moving mouse to element
Логирование поддерживается на языках
Значение языка логирования устанавливается в параметре logger.language.
Для того, чтобы настроить запуск на удалённом сервере Selenium Grid (Selenoid, Zalenium) или на платформах вроде BrowserStack, Saucelabs и т.д., необходимо в конфигурационном файле settings.json установить корректное значение URL для подключения к сервису в параметр remoteConnectionUrl
, а также убедиться, что параметр isRemote
равен true.
Например, для BrowserStack параметр может иметь вид https://USERNAME:[email protected]/wd/hub.
isElementHighlightEnabled
параметр отвечает за необходимость подсветки элементов веб страницы с которыми производится работа. Включение опции позволяет более явно наблюдать за действиями теста.
Доступ к данным из конфигурационного файла обеспечивается посредством обращения к методам экземпляра класса Configuration Например:
AqualityServices.getConfiguration().getBrowserProfile().getBrowserName()
вернёт значение параметра "browser" из settings файла.
Также, вы можете получить нужный вам класс конфигурации через AqualityServices напрямую:
AqualityServices.get(IRetryConfiguration.class).getNumber(); // вернёт количество попыток для действий над элементом, напр. нажатия
AqualityServices.getBrowserProfile(); // вернёт текущий набор настроек браузера.
Класс Browser, являющийся своего рода фасадом для WebDriver и содержит методы работы с окном браузера и непосредственно с WebDriver (например, navigate, maximize window и т.д.). Написание скрипта начинается с создания экземпляра Browser
- подробнее об этом ниже.
Решение предполагает наличие единственного экземпляра класса Browser
(содержит поле типа RemoteWebDriver) в рамках одного потока исполнения. Как правило тесты работают с одним экземпляром браузера и данный подход оптимален.
Если вы решаете задачу использования в рамках одного теста несколько браузеров, каждый браузер необходимо создавать в отдельном потоке. С примерами работы в многопоточном режиме можно ознакомиться здесь BrowserConcurrencyTests.java
Если вы используете стандартные средства параллелизации, предоставляемые такими инструментами как TestNG, JUnit и т.п., для каждого потока будет автоматически создан свой экземпляр Browser.
Если вы хотите использовать parallel streams доступных в Java начиная с 8ой версии, необходимо использовать AqualityServices для установки текущей версии Browser, иначе parallel stream создаст по одному новому браузеру на каждый параллельный поток. Пример использования parallel streams приводится в testShouldBePossibleToUseParallelStreams.
Класс AqualityServices предоставляет статические методы для доступа к классу Browser и другим утилитам, включённым в данную библиотеку.
Использование AqualityServices потокобезопасно. Внутри AqualityServices используют DI контейнер Guice.
Вы можете переопределить реализацию любого из сервисов в классе, отнаследованом от BrowserModule, и затем проинициализировать AqualityServices в коде, используя метод AqualityServices.initInjector(customModule)
.
Пример использования своей реализации модуля тут: BrowserFactoryTests
Существует несколько вариантов инициализации 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
и т.д.
В процессе создания Browser и в частности WebDriver используются реализации интерфейса IDriverSettings
. Реализация включает метод getCapabilities, которые впоследствии устанавливаются в WebDriver при его инициализации.
Если вы пользуетесь BrowserFactory
по умолчанию, список capabilities будет сформирован на основании информации в settings.json файле.
Пример с использованием пользовательских capabilities представлен зедсь testShouldBePossibleToSetFactory.
Не редким случаем является необходимость скачивать файлы в браузере и впоследствии производить с ними работу. Чтобы получить текущую директорию для загрузки можно воспользоваться методом getDownloadDirectory()
экземпляра Browser
.
Для поддержания этой функциональности интерфейс IDriverSettings
обязывает реализовать метод String getDownloadDir(). Если вы используете одну из уже реализованных BrowserFactory, то директорию для загрузки файлов необходимо указать в файле settings.json.
Например:
{
"download.default_directory": ".//target//downloads//"
}
Обратите внимание, что ключ download.default_directory отличается для разных браузеров. Изучить какие ключи актуальны для каких браузеров можно в соответствующих классах
В настоящее время решение поддерживает загрузку файлов только в браузерах Chrome, Firefox, Safari.
Класс Browser
предоставляет методы работы с Alerts:
AqualityServices.getBrowser().handleAlert(AlertActions.ACCEPT);
Больше примеров использования можно найти здесь AlertTests.java.
Для получения снимков экрана класс Browser предоставляет метод
AqualityServices.getBrowser().getScreenshot()
Более подробный пример использования смотрите в тесте testShouldBePossibleToMakeScreenshot
Когда Browser инициализирован и осуществлен переход на требуемую страницу можно начинать работу с элементами этой страницы.
Решение включает класс ElementFactory, который отвечает за создание элемента необходимого типа. Ниже приводится пример получения ITextBox:
IElementFactory elementFactory = AqualityServices.getElementFactory();
ITextBox txbUsername = elementFactory.getTextBox(By.id("username"), "Username");
ElementFactory
способна создавать объекты любых классов, реализующих интерфейс IElement
.
ElementFactory
содержит ряд методов, которые возвращают реализации IElement
, имеющиеся по умолчанию в решении (IButton
, ITextBox
, ICheckbox
и т.д.). Обратите внимание, что работа с элементами ведется через интерфейсы, чтобы пользователь обращал внимание только на функциональность, но не на реализацию.
Пользователь имеет возможность создать свой элемент или расширить имеющийся по умолчанию. Для этих целей ElementFactory
предоставляет метод <T extends IElement> T getCustomElement
. Достаточно или реализовать IElement
интерфейс или расширить имеющийся класс элемента. С примером расширения и последующего использования можно ознакомиться в классе CustomElementTests.
Для получения списка элементов ElementFactory
предоставляет метод findElements
, использование которого демонстрируется ниже
List<ICheckBox> checkBoxes = elementFactory.findElements(By.xpath(checkboxLocator), ElementType.CHECKBOX);
С другими примерами работы с ElementFactory
и элементами можно здесь ElementTests.java.
При работе с элементами страницы в зависимости от задачи как правило ожидается либо только нахождение элемента который виден на странице (displayed), либо который хотя бы присутствует в верстке (exists in any state).
Для получения и последующей работы с данными двумя типами элементов ElementFactory
предоставляет перегруженные методы получения элементов. Например,
elementFactory.getLink(By.id("redirect"), "Link", ElementState.DISPLAYED);
При работе с элементами частой является ситуация проверки состояния элемента или ожидание желаемого состояния.
Данная функциональность реализуется посредством класса ElementStateProvider
Доступ к экземпляру этого класса можно получить посредством вызова метода state()
у элемента:
getTxbInput().state().waitForEnabled();
getTxbInput().state().isDisplayed();
Больше примеров можно увидеть в классе ElementStateTests.
Основное назначение решения - помощь в автоматизации тестирования 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.
При необходимости выполнить какой либо JavaScript на открытой странице можно воспользоваться методом
browser.executeScript(final String script, Object... arguments).
Решение содержит достаточное количество наиболее используемых скриптов при выполнении автоматизации тестирования. Список скриптов представлен перечислением JavaScript. Сами скрипты расположены в директории ресурсов /src/main/resources/js. Примеры использования метода имеются в классе BrowserTests.
Также существует перегрузка для передачи файла с JavaScript.
Aquality Selenium использует для своей работы и предоставляет доступ к классу JsonSettingsFile. Данный класс предоставляет удобные методы для работы с JSON файлами вашего проекта. Например, если вы захотите хранить URL сайта с которым вы работаете как параметр конфигурации вы сможете считывать значения из JSON при помощи указанного класса:
ISettingsFile environment = new JsonSettingsFile("settings.json")
String url = environment.getValue("/url").toString();
В случае необходимости ожидания выполнения какого-либо условия можно воспользоваться предоставляемым в Aquality Selenium классом ConditionalWait.
File fileDownloaded = new File(downloadDirInitialized + fileName);
AqualityServices.getConditionalWait().waitForTrue(() -> fileDownloaded.exists(),
Duration.ofSeconds(120), Duration.ofMillis(300), "File should be downloaded");
Все методы класса ждут выполнения условия, но по разному возвращают значения и обрабатывают ошибки:
- waitForTrue - выкидывает ошибку в случае, если условие не выполнилось, ничего не возвращает.
- boolean waitFor - возвращает true если условие выполнилось или false если не выполнилось, ошибок не выбрасывает.
- T waitFor - использует ожидание WebDriver'a, возвращает объект T или ошибку, в случае если условие не выполнилось.