Как дождаться появления элемента на странице в Selenium/Selenide?

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

Ответ

Для ожидания элементов в Selenium WebDriver используются явные ожидания (Explicit Waits) с помощью WebDriverWait и ExpectedConditions. Это предпочтительный метод, так как он эффективнее и надежнее, чем неявные ожидания или Thread.sleep().

Пример на Java (Selenium WebDriver):

import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
import java.time.Duration;

// Создаем объект ожидания с таймаутом 10 секунд
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));

// Ожидаем, пока элемент станет видимым на странице
WebElement element = wait.until(
    ExpectedConditions.visibilityOfElementLocated(By.id("submit-button"))
);
// После появления элемента можно с ним взаимодействовать
element.click();

Ключевые условия ожидания (ExpectedConditions):

  • visibilityOfElementLocated(locator) – ожидает, что элемент станет видимым.
  • presenceOfElementLocated(locator) – ожидает, что элемент появится в DOM (но может быть невидимым).
  • elementToBeClickable(locator) – ожидает, что элемент станет кликабельным.
  • textToBePresentInElement(locator, text) – ожидает появления определенного текста в элементе.

Пример на Java (Selenide): В Selenide ожидания встроены в команды по умолчанию, что делает код чище.

import static com.codeborne.selenide.Selenide.*;
import static com.codeborne.selenide.Condition.*;

// Selenide автоматически будет ждать до 4 секунд (настраивается)
$("#submit-button").shouldBe(visible).click();
// Можно указать свое время ожидания
$(".results").shouldHave(text("Успешно!"), Duration.ofSeconds(15));

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