Найти в Дзене

Java Selenide. Configuration. 2 Часть. Взаимодействие с элементам

Итак, продолжая тему о конфигурации Selenide, поговорим о некоторых настройках, которые касаются работы с элементами. AssertionMode - настройка, которая контролирует в какой момент выбросить исключение. Существует два ваSOFT - Дожидается завершения всех промежуточных функций(выражений) 1. AssertionMode.STRICT - выбрасывает незамедлительно(по умолчанию) 2. AssertionMode.SOFT - Дожидается завершение всех промежуточных функций(выражений) Со STRICT все понятно, что-то идет не так - ошибка. Напрашивается определенный мем про простого человека) Больший интерес вызывает SOFT. Тут я, пожалуй, отвечу на вопрос другим вопросом: "Если я исправлю элемент, чтобы он соответствовал конкретному выражению, будет ли он соответствовать другим?". Иными словами метод SOFT проверит все выражения и выведет несоответствия. Удобно - конечно, не нужно перезапускать тест по сто раз. Но я бы все-таки его включал только в режиме отладки Примеры AssertionMode: /// Тест STRICT режима AssertionMode
@Test
public void
Оглавление

Итак, продолжая тему о конфигурации Selenide, поговорим о некоторых настройках, которые касаются работы с элементами.

AssertionMode

AssertionMode - настройка, которая контролирует в какой момент выбросить исключение.

Существует два ваSOFT - Дожидается завершения всех промежуточных функций(выражений)

1. AssertionMode.STRICT - выбрасывает незамедлительно(по умолчанию)

2. AssertionMode.SOFT - Дожидается завершение всех промежуточных функций(выражений)

Со STRICT все понятно, что-то идет не так - ошибка. Напрашивается определенный мем про простого человека)

-2

Больший интерес вызывает SOFT. Тут я, пожалуй, отвечу на вопрос другим вопросом: "Если я исправлю элемент, чтобы он соответствовал конкретному выражению, будет ли он соответствовать другим?". Иными словами метод SOFT проверит все выражения и выведет несоответствия. Удобно - конечно, не нужно перезапускать тест по сто раз. Но я бы все-таки его включал только в режиме отладки

Примеры AssertionMode:

/// Тест STRICT режима AssertionMode
@Test
public void testAssertionModeStrict() {
Selenide.open("https://ya.ru");
// Выпадет на 'shouldBe'
Selenide.$x(".//input[@area-label='test']").shouldBe(Condition.exist).click();
}

/// Тест SOFT режима AssertionMode
@Test
public void testAssertionModeSoft() {
Configuration.assertionMode = AssertionMode.SOFT;
Selenide.open("https://ya.ru");

// Выведет 2 ошибки:
// 'shouldBe' (Element not found)
// 'click' (Element not intercepted)
Selenide.$x(".//input[@area-label='test']")
.shouldBe(Condition.exist)
.click();
}

ClickViaJs

Если перевести дословно "Кликать через JavaScript". Я не буду подробно писать и делать примеры, но сделаю одно предупреждение НЕ ВКЛЮЧАЙ БЕЗ НЕОБХОДИМОСТИ, так как встроенные механизмы ожидания Selenide не работают с этой настройкой, следовательно, РЕШАЙТЕ ПРОБЛЕМУ ОЖИДАНИЯ САМИ (Когда писал этот фрагмент закрался прикол о C++ и освобождения памяти, так что ж оставлю его в качестве примера)

// В коде
void cleanUp() {
// TODO: "Подними мусор!"
std::cout << "Подними мусор за собой, а то еще забуду, где ты оставил объекты." << std::endl;
}

кто в теме, тот поймет)

FastSetValue

По аналогии с предыдущем методом, параметр дает нам возможность использовать JS вместо SendKeys(По умолчанию) при вводе значений в поля. С помощью JS ввод осуществляется намного быстрее, но есть разные нюансы в компонентах, в которых невозможно задать данным методам. Я даже нашел информацию:

В 2020 году пользователи отмечали, что режим FastSetValue не работал корректно с компонентами Material UI

sendKeys работает медленнее из-за того что он последовательно имитирует нажатие кнопок, однако он надежен как швейцарские часы.

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

Без FastSetValue(3017 мс)
Без FastSetValue(3017 мс)
C FastSetValue(68 мс)
C FastSetValue(68 мс)

Как видим разница очевидна.

PollingInterval

Настройка, которая отвечает за интервал проверки того, что элемент появился. По умолчанию - 200 мс. Так же эту настройку можно задать с помощью переменной среды "selenide.pollingInterval". По моему мнению, подходит для тех, кому важно время выполнения, т.е. чем меньше интервал опроса, тем меньше время простоя.

Идеально выверенное время
Идеально выверенное время

SelectorMode

Эта настройка переключает режимы Css-селекторов. Существует два режима:

1. Классический CSS (SelectorMode.CSS) (по умолчанию)

2. Sizzle (SelectorMode.Sizzle) - позволяет использовать модернизированные псевдоселекторы Css3(":input", ":not", ":nth", ":first", ":last", ":contains('text'), ...")

Я сторонник XPath и редко пользуюсь CSS селекторами, но как бы то не было важная информация для сторонников CSS.

TextCheck

Настройка, которая позволяет при использовании метода $.shouldHave(*Текст*) проверять текст полностью или частично.

Для проверки текста полностью используем:

* Configuration.textCheck = TextCheck.FULL_TEXT,

а для частичного:

* Configuration.textCheck = TextCheck.PARTIAL_TEXT

Для демонстрации немного модернизируем тесты из блока FastSetValue

/// Тест PARTIAL_TEXT
@Test
@DisplayName("Тест PARTIAL_TEXT")
public void testFastSetValue() {
Configuration.textCheck = TextCheck.PARTIAL_TEXT;
Selenide.open("https://ya.ru");
long start = System.currentTimeMillis();
SelenideElement search = Selenide.$x(".//input[@aria-label='Запрос']").shouldBe(Condition.exist);
search.setValue(randString);
long end = System.currentTimeMillis();
System.out.println("Duration: " + (end - start));
String partialValue = randString.split("-")[0];
System.out.println("Partial value: " + partialValue);
search.shouldHave(Condition.value(partialValue));
}

/// Тест FULL_TEXT
@Test
@DisplayName("Тест FULL_TEXT")
public void testNonFastSetValue() {
Configuration.textCheck = TextCheck.FULL_TEXT;
Selenide.open("https://ya.ru");
long start = System.currentTimeMillis();
SelenideElement search = Selenide.$x(".//input[@aria-label='Запрос']").shouldBe(Condition.exist);
search.setValue(randString);
long end = System.currentTimeMillis();
System.out.println("Duration: " + (end - start));
String partialValue = randString.split("-")[0];
System.out.println("Partial value: " + partialValue);
search.shouldHave(Condition.value(partialValue));
}

Логика тестов следующая:

Мы берем 1 блок из случайной строки(UUID принимает формат "***-***-***..." в виде строки, так чтож я просто разбил ее в массив) и выполняем проверку на shouldBe

В итоге получим следующие результат, в котором как и ожидалось тест с настройкой FULL_TEXT провалится:

Результаты
Результаты
Как же без "Во все тяжкие"
Как же без "Во все тяжкие"

ps

Спасибо, что прочитали. Надеюсь, я не зря писал статью и кому-то это было полезно. И если не сложно поставьте лайк и подпишитесь, так как написать эту статью меня побудил всего один оставленный комментарий, так что ж это важно)

И по традиции:

Ссылка на 1 часть

Ссылка на 3 часть

Ссылка на репозиторий