Вышла Selenide 6.13.0

Вышла Selenide 6.13.0

Навстречу баннерам
01.04.23

Всем привет!

Ура, сегодня у нас новый релиз Selenide 6.13.0

Поддержка баннеров

Проблема

Очень часто люди спрашивают: “А что делать, если посреди теста на экране может выскочить баннер или какой-то ещё неожиданный элемент?”

Ведь он может перекрыть другие элементы, закрыть важную кнопку и т.п. - и таким образом сломать тест.

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

Алексей Виноградов сделал выступление на эту тему: Spinner-driven-development.


Стадия принятия

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

Мы решили пойти людям навстречу и создать решение для проблемы баннеров. Теперь в начале теста вы можете вызвать метод Selenide.onBanner():

onBanner("#pizzaAds", CLOSE, ".btn-close");


Как это работает

По умолчанию, этот метод добавит вебдрайверу листенер, который будет перед каждым кликом или проверкой проверять, не появился ли элемент с данным селектором "#pizzaAds". Если появился, селенид попытается закрыть его, нажав на кнопку закрытия ".btn-close".

Этот метод называется POLL. Он самый простой и надёжный, но и самый медленный. Ведь селенид должен будет кучу раз спрашивать у браузера, не появился ли баннер. Каждый такой запрос занимает некоторое время.


Альтернативные методы

Поэтому мы добавили ещё два альтернативных метода, которыми селенид может проверять, а не появился ли баннер. Их можно включить либо глобально настройкой:

Configuration.bannerCloseMode = POLL; // по умолчанию

// Слушает события по изменению DOM через CDP:
Configuration.bannerCloseMode = CDP; // Работает только в Chromium-браузерах

// Скармливает html текущей страницы ChatGPT и спрашивает, нет ли там баннера:
Configuration.bannerCloseMode = CHATGPT; 

Либо вы можете задать его параметром с помощью using:

onBanner(using(CDP)
  .withBannerSelector("#pizzaAds")
  .withCloseButtonSelector(".btn-close")
  .withAction(CLOSE)
);

Кастомный обработчик

Есть также более общий вариант, в котором вы сможете залямбдашить свою специфическую логику обработки баннера. Вы же не всегда хотите сразу закрыть баннер - иногда сначала нужно из него прочитать какую-то информацию.

onBanner(using(CHATGPT)
  .withBannerSelector("#pizzaAds")
  .withCloseButtonSelector(".btn-close")
  .withAction((banner, closeButton) -> {
     banner.find(".title").shouldHave(text("Ваш пароль изменён."));
     String newPassword = banner.find(".new-password").text();
     closeButton.doubleClick();
   })
);


Пробуйте, пишите, заводите тикеты на гитхабе. Предлагайте свои алгоритмы для обнаружения баннеров.

Хватит примерять на себя белые пальто и ссориться из-за дурацких принципов.

Давайте объединимся против баннеров!

News

Сегодня у нас три видоса про Селенид


Андрей Солнцев

ru.selenide.org

01.04.23