Всем привет! В этой статье пойдет речь о том, как написать простые UI-тесты на языке Java. Это будет интересно тем, кто давно хотел попробовать себя в автоматизации или добавить новенького в свой текущий проект.
В этой статье не будет большой остановки на теории, а также на том, как настроить рабочую среду. Эти темы я упомяну кратко и дам ссылки, которые помогут разобраться в них самостоятельно.
Основная часть статьи будет посвящена практическому разбору теста и нюансам их написания.
Собирайте с собой друзей, хорошее настроение и поехали!
Что такое UI-тесты? Плюсы и минусы.
UI-тестирование – это тестирование пользовательского интерфейса программы/сайта/приложения и др.
Звучит легко, а чем такие автотесты полезны?
1) Такие тесты используются, чтобы автоматизировать рутинные задачи и однотипные действия, например, проверку товаров в каталогах.
2) Чтобы ускорить или упростить проверку сложных пользовательских путей. Например, в кейсе, где есть очень много тестовых данных и переходов или для прохождения которого нужна сильная концентрация.
3) Чтобы снять часть работы с сотрудников, если их мало на проекте, часть проверок можно перенести на автотесты.
![](https://habrastorage.org/getpro/habr/upload_files/aa8/0b1/3b1/aa80b13b1b55c998a49a18587845421d.jpg)
Какие инструменты нужны?
Для написания таких тестов нужны специальные программы и инструменты. Некоторые из них требуют установки и настройки, некоторые нет. Сейчас все будет расписано по порядку.
DevTools - это инструмент разработчика, он встроен практически во все современные браузеры и включается по кнопке F12. Здесь потребуется вкладка Elements (Элементы). DevTools - это инструмент разработчика, он встроен практически во все современные браузеры и включается по кнопке F12. Здесь потребуется вкладка Elements (Элементы).
ChroPath – это плагин для браузера, позволяющий быстро сформировать локатор для элемента страницы. Подробнее об это будет написано дальше. Скачать можно по ссылке: ChroPath.
IntelliJ IDEA by JetBrains - интегрированная среда разработки программного обеспечения. С помощью нее будут написаны тесты. Бесплатную версию этой программы можно скачать с официального сайта: Community Edition.
JDK Java Development Kit — «комплект для разработки на Java». Это, простыми словами, сам язык Java, без которого мы не сможем написать никакой код. Скачать его можно здесь: Сайт с Amazon Corretto. А как установить быстро и понятно можно посмотреть здесь: Как скачать и установить Amazon Corretto. Также кроме Amazon Corretto можно установить другие JDK, вот например: Инструкция.
Maven - инструмент для управления и сборки проектов на Java. Он очень облегчает работу с проектами, так что этот пункт не стоит пропускать. Установка Maven.
Создаем проект и добавляем туда нужные плюшки.
1. Открываем IntelliJ IDEA.
2. Нажимаем File – New – Project.
3. Выбираем тип проекта Maven (на этом моменте убедитесь, что в Project SDK стоит как раз Amazon Corretto).
4. Нажимаем Next.
5. В блокe Name задаем название проекта, а в Location папку, где он будет лежать.
6. Нажимаем Finish. Проект создан.
Настройка зависимостей
Теперь, чтобы использовать инструменты для автоматизации (Selenium, Selenide), а также пользоваться другими фреймворками и библиотеками, нужно будет импортировать зависимости. Для этого:
1. Развернуть папку с названием проекта в левом баре.
![](https://habrastorage.org/getpro/habr/upload_files/5cd/c50/8dc/5cdc508dc5b4f34c17532d0eb7e861da.jpg)
Открыть файл pom.xml (когда проект только-только создан файл открыт по умолчанию).
pom.xml - это XML-файл, который содержит информацию о деталях проекта, и конфигурации используемых для создания проекта на Maven.-
Добавить в project новые зависимости из списка:
<dependencies>
<dependency>
<groupId>com.codeborne</groupId>
<artifactId>selenide</artifactId>
<version>5.23.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>4.4.0</version>
</dependency>
</dependencies> Затем обязательно нужно нажать кнопку Load Maven Changes, чтобы изменения сохранились.
![](https://habrastorage.org/getpro/habr/upload_files/f51/000/9e3/f510009e31bbfd06794800380024f2d0.jpg)
Другие зависимости можно найти и самостоятельно добавить в проект на сайте: https://mvnrepository.com.
Как работать в IntelliJ IDEA
Прежде, чем переходить к самой интересной части и начинать писать тест, я предлагаю (настоятельно ! ????) ознакомиться с этим блоком, особенно, если вы еще не работали в IntelliJ IDEA. Иначе дальше будет сложновато сходу разобраться в интерфейсе программы.
Как создавать классы
1. В папке main-java создаем package и называем его POM (page object model).
![](https://habrastorage.org/getpro/habr/upload_files/365/7ba/cfa/3657bacfacdd2061dbfbcf47c06cd73f.jpg)
Далее таким же образом создаем класс, только выбираем не package, а Java Class. Назовем класс MainPage.
![Лучше все слова в названиях классов начинать с заглавной буквы. Лучше все слова в названиях классов начинать с заглавной буквы.](https://habrastorage.org/getpro/habr/upload_files/436/bd9/1ad/436bd91ad423e7ec8b8449685e1c85ab.jpg)
3. Таким же образом создаются классы, где будут лежать тесты, только из другой папки.
![](https://habrastorage.org/getpro/habr/upload_files/2ea/6df/470/2ea6df4703214465b17acc07490cd0f7.jpg)
Как запускать тесты
Далее, когда вы уже напишите свои первые тесты их нужно будет запустить, чтобы получить результат. Это можно сделать двумя способами.
1. Запуск теста из интерфейса. Для этого в тестовом классе нажмите кнопку play. Тест запуститься самостоятельно.
![](https://habrastorage.org/getpro/habr/upload_files/332/8d9/8dd/3328d98dd5716f374267087eca6e3c82.jpg)
Запуск теста с помощью Maven. Для этого в правом блоке меню выберите команду verify и тесты запустятся точно также.
![](https://habrastorage.org/getpro/habr/upload_files/24e/78e/0f6/24e78e0f6381dbe3cc571a1262582882.jpg)
А еще это можно сделать через командную строку прямо в программе. В нижнем меню откройте вкладку Terminal и введите команду «mvn verify».
![](https://habrastorage.org/getpro/habr/upload_files/ebe/602/c84/ebe602c845fc5064455e6dfde20654d0.jpg)
Как отладить тесты.
1. Внутри теста поставьте брекпоинты (для этого нажмите на строку рядом с нужным фрагментом кода) на моменты теста, которые хотите тщательнее проверить (это может быть нажатие на кнопки, открытие разных страниц, проверки).
![](https://habrastorage.org/getpro/habr/upload_files/b0f/787/dfb/b0f787dfb76d31a3c37781319c1a544e.jpg)
2. Далее нажмите кнопку Debug.
![](https://habrastorage.org/getpro/habr/upload_files/4dd/3bf/175/4dd3bf175a4eef7d9ffd7446467f566c.jpg)
3. Управляйте шагами теста с помощью меню.
![](https://habrastorage.org/getpro/habr/upload_files/8eb/a35/a18/8eba35a1863296718b1c916a1046d613.jpg)
Структура проекта
Описание POM и методов
Обычно проект состоит из нескольких классов package, в котором находятся классы POM (page object model) «объектная модель страницы». Эти классы содержат в себе описание элементов со страниц и методы для взаимодействия с ними.
//ссылка на package, в котором находится класс package POM;
//взаимосвязь с нужными библиотеками и фреймворками
import com.codeborne.selenide.SelenideElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
//взаимосвязь с нужными библиотеками и фреймворками название класса
public class TestClassPage {
//описание SelenideElement (элемент со страницы)
@FindBy(how = How.XPATH (CLASS_NAME, NAME, ID и др) using = "локатор xpath или название класса (другого атрибута) элемента")
private SelenideElement elementName;
//метод для взаимодействия с вышеописанным элементом
public TestClass testMethodName() {
elementName.click();
return this;
}
}
В классах добавляются конструкции для описания SelenideElement. Таким образом элемент описывается как переменная. Благодаря этому с ним удобнее будет взаимодействовать и поменять локатор, если понадобится.
В How прописываем атрибут элемента, в этом случает это имя класса, а в using значение класса, которые находим в elements. Атрибутом может быть Xpath, Class_NAME, NAME и много других.
![](https://habrastorage.org/getpro/habr/upload_files/fc0/6c7/96f/fc06c796f4222daff26b537f94d0af74.jpg)
Теперь напишем метод для взаимодействия с элементом. Почему нельзя просто взять элемент и с ним делать всякие вещи в тесте? Можно, но так возможно получить различные ошибки как при написании кода, так при воспроизведении теста, так как не будет соблюдаться принцип инкапсуляции (об этом можно прочитать на досуге ????).
![](https://habrastorage.org/getpro/habr/upload_files/52e/3a2/58d/52e3a258d51400dacfe0244ce577dc8a.jpg)
Чтобы написать метод добавляем в код такую конструкцию.
public MainPage goToTheEnterAccountButton() {
enterToAccountButton.click();
return this;
}
Когда написали внутри метода имя переменной с кнопкой «Войти», поставьте рядом с ним точку. Вы увидите все доступные взаимодействия для этого элемента.
![](https://habrastorage.org/getpro/habr/upload_files/d35/513/552/d35513552ee336be83ea2d49b07ad983.jpg)
Так как нужно нажать на кнопку, чтобы перейти на страницу авторизации, выберем функцию click.
Метод готов, теперь его можно будет вызвать в тесте.
Как еще можно взаимодействовать с элементом.
Также можно обратиться к элементу на странице без описания его как отдельной переменной. Для этого можно не описывать переменную, а искать элемент с помощью локатора сразу в методе.
Подбор атрибута и локатора аналогичен тому, как это делается в SelenideElement.
$(byText("Тест элемент")).shouldBe(Condition.visible).click();
$(byClassName("test_element_class")).shouldBe(Condition.visible).click();
$(byId("test_element_id")).shouldBe(Condition.visible).click();
$(byName("element_name")).shouldBe(Condition.visible).click();
Описание тестового класса.
Из чего состоит тестовый класс показано ниже. Эту структуру можно использовать в своих проектах.
import POM.TestClassPage;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static com.codeborne.selenide.Selenide.*;
import static com.codeborne.selenide.Selenide.closeWebDriver;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
//название тестового класса
public class TestClass {
//обращение к классу из POM, чтобы взаимодействовать с его элементами
private TestClassPage testClassPage;
//переменные, которые могут быть нужны в тесте
private final String number = "12121212";
//аннотация Before - внутри прописывается то, что нужно сделать ДО теста
@Before
public void setUp() {
//открытие страницы веб-сайта с привязкой его к классу из POM; делается с
//помощью инструментов Selenide (WebDriver)
testClassPage = open("https://testSite.ru/", TestClassPage.class);
}
//аннотация After, содержит то, что нужно сделать ПОСЛЕ теста
@After
public void tearDown() {
//эти методы очищают куки и закрывают браузер
clearBrowserCookies();
clearBrowserLocalStorage();
closeWebDriver();
}
//аннотация Test, здесь содержится сам тест и проверки
@Test
//название теста
public void testName() {
//вызов класса из POM, а затем вызов меетода, относящегося к этому классу
testClassPage.clickToEnterButton();
//проверка с помощью Assert (бывают разные типы проверок) - здесь проверяется условие
//на истинность - в скобках указывается условие, которое нужно проверить.
assertTrue(testClassPage.openAuthPage());
}
}
Начнем писать автотесты
Первый тест
Работа в POM
Чтобы написать первый тест разберем небольшой тест-кейс.
1. Открываем сайт https://rostov.rt.ru/
2. Нажимаем на кнопку «Войти».
3. На странице авторизации проверяем заголовок. Нужно убедиться, что открылась именно страница авторизации.
Что мы видим из этого тест-кейса? За один маленький тест открывается 2 страницы, а также идет взаимодействие с двумя элементами. Это нужно будет описать в коде. Начнем с описания кнопки и заголовка.
Для этого пойдем по следующему алгоритму:
1. Создайте package и назовите его POM.
2. В package создайте класс и назовите его MainPage.
3. Так как нужно описать кнопку «Войти» идем в DevTools, открываем вкладку Elements. Выберите инструмент для просмотра элементов.
![](https://habrastorage.org/getpro/habr/upload_files/1bf/e93/187/1bfe931873b6d8fa149c427f6553cda2.jpg)
4. В коде страницы видим следующую конструкцию, которая подсвечивается при наведении на кнопку «Войти»:
![](https://habrastorage.org/getpro/habr/upload_files/f7d/da8/5f3/f7dda85f3b1cf3975a84b8474f3494be.png)
5. Создаем Selenide Element с этим классом.
@FindBy(how = How.XPATH, using = "sp-l-0-2")
private SelenideElement enterToAccountButton;
6. Создаем метод для взаимодействия с кнопкой «Войти». В реальности мы бы кликнули на нее левой кнопкой мыши. Здесь за такое же действие отвечает функция click().
public MainPage goToTheEnterAccountButton() {
enterToAccountButton.click();
return this;
}
Дальше нужно описать вторую страницу, используемую в тесте.
1. В POM создаем класс AuthPage. Дальше описываем заголовок страницы как SelenideElement.
2. Написать локатор к титулу можно и с по CLASS_NAME, и по Xpath. На этом этапе советую использовать ChroPath.
![](https://habrastorage.org/getpro/habr/upload_files/eaf/d41/1c3/eafd411c3d21a7472bf780d6a7ff770b.jpg)
3. Если использовать Xpath, то локатор можно просто скопировать из расширения и вставить в код.
@FindBy(how = How.XPATH, using = "//h1[contains(text(),'Авторизация по коду')]")
private SelenideElement authPageTittle;
4. Теперь напишем метод для проверки текста заголовка.
Используем ту же конструкцию, что дана в части «Структура проекта». Только тип возвращаемых данных меняем на Boolean. Это нужно потому, что мы будем проверять истинность условия (действительно ли заголовок содержит текст «Авторизация по коду»).
public boolean openAuthPage() {
//вызываем переменную с заголовком
//дальше пишем условие - переменая должна содержать текст и в скобках пишем необходимый текст
authPageTittle.shouldHave(Condition.exactText("Авторизация по коду"));
//если условие указанное выше выполняется, то метод должен вернуть true - правда
return true;
}
Дальше этот метод тоже можно будет использовать в тесте.
Написание теста
Тестом считается именно часть кода, написанная внутри метода под аннотацией @Test. Но нужно учитывать и то, что нужно будет сделать до и после теста.
На подготовительном этапе можно открыть страницу, перейти к нужному разделу сайта.
А после теста нужно провести «уборку», например, удалить пользователей или другие данные, которые были созданы в процессе.
1. Создадим тестовый класс EnterTest.
2. И сразу обращаемся к классам, с которыми будем взаимодействовать.
private MainPage mainPage;
private AuthPage authPage;
3. В этом случае перед тестом нужно открыть главную страницу сайта. Этот этап пойдет в аннотацию Before.
@Before
public void setUp() {
mainPage = open("https://voronezh.rt.ru/", MainPage.class);
}
4. Дальше (уже внутри теста) происходит нажатие на кнопку «Войти». Тест нужно будет назвать. Название должно передавать смысл проверки и содержать слово Test.
@Test
public void openAuthorizationTest() {
mainPage.goToTheEnterAccountButton();
}
5. Затем открывается уже другая страница, связанная с классом AuthPage. Ее нужно открыть точно также, как MainPage в начале теста, иначе программа не поймет с какой страницы она должна брать данные.
@Test
public void openAuthorizationTest() {
mainPage.goToTheEnterAccountButton();
authPage = open("https://b2c.passport.rt.ru/auth/realms/b2c/protocol/openid-connect/" +
"auth?client_id=lk_decosystems&redirect_uri=https://rostov.rt.ru/&response_type=" +
"code&scope=openid&_gl=1*1chzy0a*_ga*Mjk0OTYxOTY2LjE2NjQyNzU1MTY.*" +
"_ga_9G5GWSHJG0*MTY3MTcyODk1NS4xOS4xLjE2NzE3MjkwMzcuNTEuMC4w", AuthPage.class);
6. А затем по тесту мы должны провести проверку – правильный ли на странице заголовок. Последний шаг теста можно добавить сразу же в Assert.
@Test
public void openAuthorizationTest() {
mainPage.goToTheEnterAccountButton();
authPage = open("https://b2c.passport.rt.ru/auth/realms/b2c/protocol/openid-connect/" +
"auth?client_id=lk_decosystems&redirect_uri=https://rostov.rt.ru/&response_type=" +
"code&scope=openid&_gl=1*1chzy0a*_ga*Mjk0OTYxOTY2LjE2NjQyNzU1MTY.*" +
"_ga_9G5GWSHJG0*MTY3MTcyODk1NS4xOS4xLjE2NzE3MjkwMzcuNTEuMC4w", AuthPage.class);
assertTrue(authPage.openAuthPage());
}
Первый тест готов. Теперь его можно запускать. При запуске программа сама запустит тест в браузере Google Chrome.
После успешно пройденного теста вы увидите внизу экрана такое изображение:
![](https://habrastorage.org/getpro/habr/upload_files/da9/030/04e/da903004e794c5fbd52bb51b9b949a47.jpg)
В случае, если тест завершился неудачно или с ошибками нужно провести дебаг и выяснить, на каком этапе теста падает ошибка.
Второй тест
Теперь возьмем за основу первый тест и немного усложним его. Будем вводить в поле на странице авторизации несуществующий номер телефона и нажимать на кнопку «Получить код». А потом проверим, что на экране появилось сообщение об ошибке.
POM
Для этого нужно будет дописать элементы и методы в классе AuthPage.
1. Бокс для номера телефона или email опишем через Xpath. Но также можно это сделать через How.ID.
![](https://habrastorage.org/getpro/habr/upload_files/b3a/9ad/84f/b3a9ad84f987d4a2d100a2f941bbd57e.jpg)
Получается такая переменная:
@FindBy(how = How.XPATH, using = "//input[@id='address']")
private SelenideElement setNumberOrEmail;
2. Сразу напишем метод с этим боксом. В нем будет возвращаться содержимое страницы, так что тип данных напишем AuthPage. Еще в методе нужно будет передать переменную, в которой будет содержаться номер телефона или email.
Для этого в скобках у названия пишем String (тип передаваемых данных, в этому случае – строка) и название переменной.
public AuthPage setNumberOrEmail(String number) {
return this;
}
Дальше нужно описать действие, имитирующее заполнение бокса. Вызываем переменную setNumberOrEmail и функцию setValue. В скобках функции передаем переменную (их может быть несколько).
public AuthPage setNumberOrEmail(String number) {
setNumberOrEmail.setValue(number);
return this;
}
3. Опишем кнопку «Получить код». Описать локатор также можно через Xpath, попробуйте найти его самостоятельно на сайте.
@FindBy(how = How.XPATH, using = "//button[@id='otp_get_code']")
private SelenideElement getCodeButton;
4. Дальше пишем метод, который нажимает на кнопку «Получить код». Он не будет возвращать true или false, не будет содержать переменных. Поэтому этот метод можно сделать по аналогии с тем, что был дан в первом тесте.
public AuthPage getCode() {
getCodeButton.click();
return this;
}
5. Опишем переменную с текстом ошибки. Это можно сделать как с помощью CLASS_NAME, так и с Xpath.
@FindBy(how = How.CLASS_NAME, using = "rt-input-container")
private SelenideElement errorText;
6. Напишем метод с проверкой текста сообщения об ошибке. Он будет аналогичен методу из первого теста.
public boolean getErrorText() {
errorText.shouldHave(Condition.exactText("<div class=\"rt-input-container rt-input-container--error email-or-phone otp-form__address\">E-mail или мобильный телефон\n" +
"Введите телефон в формате +7ХХХХХХХХХХ или +375XXXXXXXXX, или email в формате example@email.ru</div>"));
return true;
}
Тест
Этот тест можно будет написать в том же тестовом классе, так как происходит проверка функциональности из одного блока.
1. В тестовом классе описываем переменную. В ней будет содержаться условный номер телефона.
private final String number = "12121212";
2. Создаем новый тест и называем его по-другому. Нажатие на кнопку «Войти» и открытие страницы авторизации остается также, как и в прошлом тесте.
3. Чтобы написать номер телефона на странице вызовем 2 метода с authPage. Это можно сделать так:
authPage.setNumberOrEmail(number);
authPage.getCode();
А можно таким образом. Этот способ предпочтительнее, так как тест выглядит лаконичнее.
authPage.setNumberOrEmail(number)
.getCode();
4. Делаем проверку, которая тоже аналогична проверке из первого теста.
assertTrue(authPage.getErrorText());
Третий тест
В третьем тесте нужно будет открыть вкладку «Интернет» на главной странице. Затем из выпадающего меню выберем вкладку «Домашний интернет». После этого совершится переход на новую страницу и там нужно будет выбрать тариф «Облачный». После выбора тарифа будет открыта страница с подробностями о нем и нужно будет убедиться, что открыта правильная страница.
POM
1. В классе MainPage описываем кнопку «Интернет» и метод для взаимодействия с ней.
@FindBy(how = How.XPATH, using = ".//span[contains(text(),'Интернет')]")
private SelenideElement internetButton;
Метод строится также по стандартному типу.
public MainPage clickToInternetButton() {
internetButton.click();
return this;
}
2. Чтобы описать кнопку «Домашний интернет» будем использовать команду Find. Здесь проще всего искать ее по тексту.
public MainPage clickToHomeInternetButton() {
$(byText("Домашний интернет")).shouldBe(Condition.visible).click();
return this;
}
3. Дальше откроется страница с выбором тарифов. Для нее создадим новый класс. Назовем его HomeInternetPage.
На странице нужно будет нажать на стрелку, чтобы прокрутить бары с выбором тарифов, а затем нажать на карточку с тарифом «Облачный».
![](https://habrastorage.org/getpro/habr/upload_files/b6d/ccb/4c9/b6dccb4c95fb0eca030ba0312591dfe6.jpg)
4. Описать кнопку-стрелку можно с помощью CLASS_NAME.
![](https://habrastorage.org/getpro/habr/upload_files/066/5b1/14a/0665b114a28223905758c387c05b488c.jpg)
Получается так:
@FindBy(how = How.CLASS_NAME, using = "rt-carousel-v3-arrow")
private SelenideElement arrowButton;
5. Чтобы описать нажатие на карточку тарифа будем нажимать на заголовок. Описать его лучше всего через Xpath, так как class name не уникальный в данном случае для разных тарифов.
@FindBy(how = How.XPATH, using = "//div[contains(text(),'Облачный')]")
private SelenideElement oblachInternetButton;
6. В этот раз можно объединить действия в общем методе под названием chooseTariff.
public HomeInternetPage chooseTariff() {
arrowButton.shouldBe(Condition.visible).click();
oblachInternetButton.click();
return this;
}
7. Теперь опишем класс для страницы с подробным описанием тарифа. Я заранее называю его CreateOrderPage, так как дальше он будет использоваться еще и в другом тесте.
Для этого теста достаточно описать заголовок страницы и метод с ним.
@FindBy(how = How.XPATH, using = "//h2[contains(text(),'Облачный')]")
private SelenideElement tariffTitle;
public boolean textFromTitleOrder() {
tariffTitle.shouldHave(Condition.text("Облачный"));
return true;
}
Дополнения к тесту
А еще на этом этапе усложним часть, описанную в @Before.
Каждый раз, когда в браузере открывается домашняя страница сайта в самом начале теста мы видим всплывающее окно – с выбором города. Добавим сюда метод с нажатием на кнопку «Продолжить».
Для этого в MainPage добавим кнопку:
@FindBy(how = How.CLASS_NAME, using = "rt-button-small")
;
private SelenideElement continueButton
И метод:
public MainPage clickToContinueButton() {
continueButton.click();
return this;
}
Теперь этот метод можно вызывать перед тестом.
Тест
1. Создадим тестовый класс InternetTariffTest. В нем сразу нужно будет обратиться к трем страницам.
private MainPage mainPage;
private HomeInternetPage homeInternetPage;
private CreateOrderPage createOrderPage;
2. В @Before теперь добавляем еще один метод с подтверждением региона.
@Before
public void setUp() {
mainPage = open("https://voronezh.rt.ru/", MainPage.class);
mainPage.clickToContinueButton();
}
3. В самом тесте сначала вызываем методы с открытием страницы «Домашний интернет».
@Test
public void chooseInternetTariffTest() {
mainPage.clickToInternetButton()
.clickToHomeInternetButton();
4. Затем открываем страницу с выбором тарифов и вызываем метод.
@Test
public void chooseInternetTariffTest() {
mainPage.clickToInternetButton()
.clickToHomeInternetButton();
homeInternetPage = open("https://voronezh.rt.ru/homeinternet", HomeInternetPage.class);
homeInternetPage.chooseTariff();
5. После этого переходим на страницу с подробной информацией о тарифе и делаем проверку.
@Test
public void chooseInternetTariffTest() {
mainPage.clickToInternetButton()
.clickToHomeInternetButton();
homeInternetPage = open("https://voronezh.rt.ru/homeinternet", HomeInternetPage.class);
homeInternetPage.chooseTariff();
createOrderPage = open("https://voronezh.rt.ru/about_offer?offer=418923262504&cardId" +
"=3ee2ecc6&lcs=active&pr7=" +
"POSTPAIDUNLIM&ref=%2Fhomeinternet&tech=" +
"2&speed=100&tech=2&speed=100&tech=2&speed=100&cardPos=5",
CreateOrderPage.class);
assertTrue(createOrderPage.textFromTitleOrder());
}
Четвертый тест
В этом тесте нужно будет оформить заявку на подключение тарифа, выбранного на прошлом этапе. Но при этом заявку нужно оформить с некорректными данными. А потом проверить, что на странице появились сообщения об ошибке.
POM
Для оформления заявки нужно заполнить поля с адресом, именем и номером телефона. Потом нажать кнопку отправить. Но если адрес и номер некорректные, то на странице появятся 2 сообщения. Все эти элементы и нужно описать.
![](https://habrastorage.org/getpro/habr/upload_files/446/1c2/90d/4461c290d50bac80f355e3e67b3cb832.jpg)
1. В данном случае все боксы для данных удобно описать с помощью атрибута Name.
@FindBy(how = How.NAME, using = "address")
private SelenideElement addressBox;
@FindBy(how = How.NAME, using = "fullName")
private SelenideElement nameBox;
@FindBy(how = How.NAME, using = "phoneNumber")
private SelenideElement numberBox;
2. Сообщения об ошибке можно описать по Xpath, а можно найти в методе с помощью find.
@FindBy(how = How.XPATH, using = "//span[contains(text(),'Выберите дом из справочника')]")
private SelenideElement errorAddress;
@FindBy(how = How.XPATH, using = "//span[contains(text(),'Введите существующий номер телефона')]")
private SelenideElement errorPhone;
3. Чтобы заполнить заявку можно сделать метод, который будет получать 3 переменные String и заполнять соответствующие поля.
public CreateOrderPage fillOrder(String address, String name, String phoneNumber) {
addressBox.setValue(address);
nameBox.setValue(name);
numberBox.setValue(phoneNumber);
return this;
}
4. А далее нужно написать метод, который будет проверять, что сообщения об ошибках отображаются на странице. В предыдущих методах мы проверяли, содержит ли элемент текст. Теперь будет проверяться то, существует ли элемент на странице.
public boolean errorMessagesIsVisible() {
errorAddress.shouldBe(Condition.visible);
errorPhone.shouldBe(Condition.visible);
return true;
}
Тест
В этом тесте нужно будет заполнить заказ и проверить, отобразились ли ошибки. В @Before будет практически полностью содержаться предыдущий тест.
1. Создадим тестовый класс CreateInternetOrderTest. Обратимся к страницам, которые будут использоваться в тесте.
private MainPage mainPage;
private HomeInternetPage homeInternetPage;
private CreateOrderPage createOrderPage;
2. Дальше нужно создать переменные.
private final String address = "г Воронеж, ул Минская, д 100000";
;
private final String name = "Иванов Иван Иваныч";
private final String phone = "7900000000"
3. В @Before прописывается полный путь вплоть до открытия страницы с подробностями о тарифе.
@Before
public void setUp() {
mainPage = open("https://voronezh.rt.ru/", MainPage.class);
mainPage.clickToInternetButton()
.clickToHomeInternetButton();
homeInternetPage = open("https://voronezh.rt.ru/homeinternet", HomeInternetPage.class);
homeInternetPage.chooseTariff();
createOrderPage = open("https://voronezh.rt.ru/about_offer?offer=418923262504&cardId=3ee2ecc6&lcs=active&pr7=" +
"POSTPAIDUNLIM&ref=%2Fhomeinternet&tech=" +
"2&speed=100&tech=2&speed=100&tech=2&speed=100&cardPos=5", CreateOrderPage.class);
}
4. А сам тест выглядит очень лаконично. Вызывается страница с созданием заявки, а потом идет проверка.
@Test
public void creatingInternetOrderWithoutFieldsTest() {
createOrderPage.fillOrder(address, name, phone);
assertTrue(createOrderPage.errorMessagesIsVisible());
}
Подведем итоги
Теперь вы умеете писать самые простые UI-тесты на Java с помощью фреймворка Selenide. Возможности автоматизированного тестирования только начинаются на этом этапе. Существуют юнит-тесты, API-тесты, которые могут выполнять другие задачи тестирования.
Но даже эти простые тесты можно улучшить. Например, с помощью фреймворка Allure или за счет комбинации UI-тестирования с другими типами тестов.
Файл с тестами, которые разобраны здесь будет приложен к статье. Можно попробовать на их основе сделать своей проект. А также внутри содержится еще один бонусный тест, его тоже можно разобрать самостоятельно в качестве маленького челленджа.
Всем удачи и спасибо за внимание!
Проект можно найти здесь: https://github.com/nadezdabokareva/RTK-demo-selenide
Комментарии (12)
kozikoff
26.12.2022 23:03Стесняюсь спросить, но всё-таки, а почему selenide 5, unit 4 в 2022, зачем эти аннотации FindBy? Неужели старые версии библиотек уж так нужны? Плюс аннотации, которые засоряют код?
nbokareva Автор
28.12.2022 00:06Тоже думала, что можно что-то современнее, но, как оказалось, иногда лучшее — это хорошо забытое старое)
А что бы в этом случае использовали вы?)
tzlom
27.12.2022 01:29+1Я ожидал увидеть здесь экспорт Puppeteer тестов из хрома, а тут селениум :
Во первых селениум это явно не "не умея программировать" , а во вторых он же древний!Уже существуют инструменты которые по всем параметрам лучше него, зачем новичков учить технологии которой без малого 20 лет?
nbokareva Автор
28.12.2022 00:08В статье нету ничего про Selenium, тут про Selenide, это немного разное, я думаю, вы знаете)
А статья рассказывает детально и пошагово для новичков как, не умея программировать ранее, все-таки написать код)nbokareva Автор
28.12.2022 00:10Насчет Puppeteer спасибо, возьмем на заметку и, может, еще что-нибудь напишем)
funca
Научиться программировать и написать. Каша_из_топора.pdf