Почему возникают исключения (Exceptions) в Selenium WebDriver?

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

Ответ

Исключения в Selenium WebDriver возникают, когда драйвер не может выполнить команду из-за состояния приложения или браузера. Основные причины:

  1. NoSuchElementException: Самый частый случай. Элемент не найден на странице по указанному локатору.
    • Причина: Неверный/устаревший локатор, элемент еще не загрузился (проблема синхронизации), элемент находится внутри фрейма/iframe.
  2. ElementNotInteractableException / ElementNotVisibleException: Элемент найден, но с ним нельзя взаимодействовать (кликнуть, ввести текст).
    • Причина: Элемент скрыт (CSS: display: none, visibility: hidden), перекрыт другим элементом, отключен (disabled="true").
  3. TimeoutException: Условие явного ожидания (WebDriverWait) не выполнилось за отведенное время.
    • Причина: Долгая загрузка страницы, AJAX-запрос не завершился, элемент не появился.
  4. StaleElementReferenceException: Ссылка на элемент "устарела".
    • Причина: DOM страницы был обновлен или изменен (например, после обновления данных через JavaScript), а тест пытается использовать ссылку на элемент из старой версии DOM.
  5. WebDriverException / SessionNotCreatedException: Общие ошибки драйвера или сессии.
    • Причина: Несовместимость версий браузера и WebDriver, браузер был закрыт вручную, проблемы с запуском драйвера.

Решение: Использовать явные ожидания (Explicit Waits) для синхронизации теста с состоянием приложения.

Пример обработки с WebDriverWait (Java):

import org.openqa.selenium.*;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public void safeClick(WebDriver driver, By locator, int timeoutInSeconds) {
    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(timeoutInSeconds));
    WebElement element = wait.until(ExpectedConditions.elementToBeClickable(locator));
    element.click();
}
// Использование: safeClick(driver, By.id("submit-button"), 10);

Этот код ждет, пока элемент станет кликабельным, прежде чем выполнить действие, что предотвращает ElementNotInteractableException и NoSuchElementException из-за задержек загрузки.