5. Продолжаем разрабатывать автотесты. PageObjects - qa-guru/knowledge-base GitHub Wiki
Выносим данные в переменные
Если тестовые данные могут со временем меняться, то мы можем упростить себе жизнь и вынести данные в переменную. В таком случае, в теле теста мы сможем просто указывать имя переменной. Делается это следующим образом:
String firstName = "Ivan", lastName = "Ivanov", city = "Moscow";
$("#firstName").setValue(firstName);
$("#lastName").setValue(secondName);
$("#city").setValue(city);
Помимо этого, в Java предусмотрен форматированный вывод строк, позволяющий, в том числе, выводить одну строку с использованием различных типов данных. Общий синтаксис форматированной строки выглядит следующим образом:
String firstName = "Ivan", lastName = "Ivanov", city = "Moscow";
String formatString = format("%s %s lives in %s", firstName, lastName, city);
После выполнения кода мы получим строку Ivan Ivanov lives in Moscow
.
Каждый спецификатор формата обозначается значком процента, а буква указывает на тип переменной. Через запятую указываются имена переменных, которые последовательно будут подставлены на места спецификаторов (первый спецификатор = первое имя переменной, второй спецификатор = второе имя переменной и т.д.).
Спецификаторы формата могу указывать не только на строчный тип данных.
Спецификаторы формата в Java:
Спецификатор | Тип форматируемого значения |
---|---|
%s | Любой тип, который будет приведен к строке |
%b | Любой тип, который будет приведен к boolean : true — если значение не null, false — если null |
%h | Можно передавать любой объект, который будет приведен к шестнадцатеричной строке значения из метода hashCode() |
%c | Используется для задания символа Unicode (char ) |
%d | Задается целое число (int , byte , short , long , BigInteger ) |
%f | Используется для задания числа с плавающей запятой |
%e | Числа с плавающей запятой в экспоненциальном представлении |
%a | Числа с плавающей запятой будут представлены в шестнадцатеричном виде |
%x | Передается целое число (byte , short , int , long , BigInteger ), результатом форматирования будет символ под данным номером в таблице ASCII |
%o | Принимается целое число (byte , short , int , long , BigInteger ), которое будет представлено в виде восьмеричного числа |
%t | Префикс для преобразований даты и времени. Для форматирования требуются дополнительные флаги |
%n | Разделитель строк для конкретной платформы. Аналог \n |
Random Utils
Java позволяет нам генерировать случайную строку. Это позволит при каждом новом запуске теста получать случайные данные, а не предварительно заготовленные. Для этого необходимо создать новый метод со следующим кодом:
import java.util.Random;
public class RandomUtils {
public static String getRandomString(int length) {
String SALTCHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
StringBuilder result = new StringBuilder();
Random rnd = new Random();
while (result.length() < length) {
int index = (int) (rnd.nextFloat() * SALTCHARS.length());
result.append(SALTCHARS.charAt(index));
}
return result.toString();
}
Потом надо вызвать этот метод и дать ему на вход число, обозначающие количество символов в сгенерированной строке:
System.out.println(getRandomString(10));
>>> FGTL12YR7J
Для генерации случайных целых чисел можно использовать следующий метод. При вызове надо указать минимальное и максимальное значение промежутка, из которого рандомайзер выберет число:
public static int getRandomInt(int min, int max) {
Random r = new Random();
return r.nextInt((max - min) + 1) + min;
}
System.out.println(getRandomInt(1111, 9999));
>>> 5623
Метод для генерации случайных адресов электронной почты можно описать на Java так. Но важно учесть, что он зависит от первого метода, который генерирует случайную строка. Поэтому в нашем коде этот метода обязательно должен присутствовать:
public static String getRandomEmail() {
String emailDomain = "@qa.guru";
return getRandomString(10) + emailDomain;
}
>>> [email protected]
Вместе с выносом в переменные все это будет выглядеть так:
String firstName = getRandomString(10),
lastName = getRandomString(10),
email = getRandomEmail();
Java Faker
Java Faker — библиотека с открытым исходным кодом, которая позволяет заполнять поля не случайным набором символов, а красивыми и осмысленными строками. Библиотека поддерживает различные поля вводы и языки, в том числе и русский.
Как подключить
Необходимо перейти в файл сборки Gradle и указать в блоке dependencies зависимость:
dependencies {
testImplementation {
"com.github.javafaker:javafaker:1.0.2"
}
}
Далее в теле класса с тестами надо создать объект класса, к которому мы будем обращаться:
Faker faker = new Faker();
На примере прошлого заполнения переменных использование Java Faker будет выглядеть так:
String firstName = faker.name().firstName(),
lastName = faker.name().LastName(),
email = faker.internet().emailAddress();
Также можно задать локацию и тогда Java Faker будет учитывать ее для создания строк. Делается это следующим образом, полный список:
// Общий вид
Faker faker = new Faker(new Locale("YOUR_LOCALE"));
// Русская локация
Faker fakerRu = new Faker(new Locale("ru"));
Пример вызова:
System.out.println((fakerRu.address().fullAddress());
Page Object
Page Object — один из самых популярных паттернов проектирования кодовых баз веб-UI. Часто этот паттерн называют Page Object Model (POM). Такая модель проектирования подразумевает за собой объединение элементов страницы в свойства класса, а способы взаимодействия с этими элементами в методы.
Основные правила:
- Для каждой страницы создается ровно один класс. Если мы тестируем страницу авторизации, то следует создать класс
LoginPage
; - Класс должен содержать в себе элементы страницы в виде свойств класса. Каждое из этих свойств должно указывать на реальные локаторы. Пример:
private By usernameField = By.id("username");
private By passwordField = By.id("password");
private By signInButton = By.id("log-in");
- Вместе со свойством должны быть и методы класса, которые позволяют взаимодействовать со свойствами (заполнять поля, кликать на кнопки, выбирать элементы из выпадающих списков). Пример:
public void setFirstName(String value) {
$("#firstName").setValue(value);
}
- Также можно использовать более простой способ организации элементов страницы. Локаторы можно вынести следующим образом (предпочтительнее использовать именно этот метод):
SelenideElement firstNameInput = $("#firstName");
Тогда в методах можно использовать его так:
public void setFirstName(String value) {
firstNameInput.setValue(value);
}