Всем привет!
Ура, сегодня у нас новый релиз 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
Сегодня у нас три видоса про Селенид
- на русском: ChatGPT: Как скачать файл в Selenide
- на английском: ChatGPT: How to download file in Selenide
- Ускоряем UI Автотесты с помощью подстановки Cookies by Oleh Pendrak
ru.selenide.org
01.04.23