Как обрабатываются асинхронные операции в Selenide?

«Как обрабатываются асинхронные операции в Selenide?» — вопрос из категории Selenium и Selenide, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Selenide из коробки предоставляет мощные и лаконичные механизмы для работы с асинхронностью (AJAX, динамическая загрузка, анимации) через неявные ожидания (smart waits).

Основные принципы:

  1. Автоматическое ожидание: Все команды поиска ($, $$) и действия (click, setValue) по умолчанию ждут до 4 секунд (настраивается через Configuration.timeout), пока элемент станет видимым, появится в DOM и станет кликабельным.

    // Selenide автоматически подождет появления и кликабельности кнопки
    $("button.submit").click();
  2. Явные проверки с ожиданием (Should-методы): Для проверки состояний после асинхронных действий.

    // Ждем, пока элемент не станет видимым
    $("#loading").should(disappear);
    
    // Ждем появления определенного текста после AJAX-запроса
    $(".results").shouldHave(text("Data loaded successfully"));
    
    // Ждем изменения атрибута
    $("#status").shouldHave(attribute("data-state", "completed"));
  3. Работа с коллекциями: Ожидание появления/изменения нескольких элементов.

    // Ждем, пока в таблице не появится хотя бы 5 строк
    $$("table tr").shouldHave(sizeGreaterThan(4));
  4. Кастомные условия: Можно создавать свои условия ожидания с помощью Condition.

    $("#progress-bar").shouldHave(cssClass("full"));
  5. Ожидание с таймаутом: Если для конкретного действия нужен другой таймаут.

    $("#slow-element").click(10); // Ждать до 10 секунд
    $("#slow-element").shouldBe(visible, Duration.ofSeconds(15));

Почему это удобно: Не нужно писать явные Thread.sleep() или сложные конструкции с WebDriverWait. Selenide делает код чище и устойчивее к "flaky tests".