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);
}