Какие exceptions может оставить Selenium? Что они значат и как их обрабатывать?qa-50

Основные исключения Selenium WebDriver

1. NoSuchElementException

Когда возникает: Когда элемент не найден в DOM страницы Причины:

  • Элемент еще не загрузился
  • Неправильный локатор
  • Элемент находится внутри iframe

Обработка:

try {
    WebElement element = driver.findElement(By.id("missing-element"));
} catch (NoSuchElementException e) {
    System.out.println("Элемент не найден: " + e.getMessage());
    // Добавить ожидание или проверить локатор
}

2. TimeoutException

Когда возникает: При истечении времени ожидания Причины:

  • Элемент не появился за указанный timeout
  • Условие Explicit Wait не выполнилось

Обработка:

try {
    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("slow-element")));
} catch (TimeoutException e) {
    System.out.println("Элемент не появился за отведенное время");
    // Увеличить таймаут или проверить условия
}

3. StaleElementReferenceException

Когда возникает: При обращении к "устаревшему" элементу Причины:

  • DOM изменился после нахождения элемента
  • Страница перезагрузилась
  • Элемент был удален/заменен

Обработка:

List<WebElement> elements = driver.findElements(By.cssSelector(".dynamic-item"));
// DOM обновился
try {
    elements.get(0).click();
} catch (StaleElementReferenceException e) {
    System.out.println("Элемент устарел, повторяем поиск");
    elements = driver.findElements(By.cssSelector(".dynamic-item"));
    elements.get(0).click();
}

4. ElementNotInteractableException

Когда возникает: Когда элемент есть в DOM, но с ним нельзя взаимодействовать Причины:

  • Элемент скрыт (display: none)
  • Перекрыт другим элементом
  • Отключен (disabled)

Обработка:

try {
    driver.findElement(By.id("disabled-button")).click();
} catch (ElementNotInteractableException e) {
    System.out.println("Элемент есть, но не кликабелен: " + e.getMessage());
    // Проверить видимость/кликабельность через ExpectedConditions
}

5. NoSuchWindowException / NoSuchFrameException

Когда возникает: При попытке переключиться на несуществующее окно/фрейм Причины:

  • Окно/фрейм закрыт
  • Неправильный идентификатор

Обработка:

try {
    driver.switchTo().window("invalid-window"));
} catch (NoSuchWindowException e) {
    System.out.println("Окно не найдено: " + e.getMessage());
    // Переключиться на существующее окно
    driver.switchTo().window(mainWindowHandle);
}

6. ElementClickInterceptedException

Когда возникает: Когда клик перехватывается другим элементом Причины:

  • Элемент перекрыт
  • Появилось всплывающее окно
  • Анимация/загрузка

Обработка:

try {
    driver.findElement(By.id("submit")).click();
} catch (ElementClickInterceptedException e) {
    System.out.println("Клик перехвачен: " + e.getMessage());
    // Ожидать исчезновения перекрывающего элемента
    wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("loader")));
    driver.findElement(By.id("submit")).click();
}

7. WebDriverException

Когда возникает: Общее исключение для различных проблем WebDriver Причины:

  • Браузер не отвечает
  • Проблемы с драйвером
  • Неправильная версия драйвера

Обработка:

try {
    driver.get("https://example.com");
} catch (WebDriverException e) {
    System.out.println("Общая ошибка WebDriver: " + e.getMessage());
    // Перезапустить драйвер или проверить соединение
}

Лучшие практики обработки исключений

  1. Используйте Explicit Waits для предотвращения большинства исключений
  2. Логируйте исключения с полезной информацией
  3. Делайте скриншоты при ошибках:
try {
    // тестовые действия
} catch (Exception e) {
    TakesScreenshot ts = (TakesScreenshot)driver;
    File src = ts.getScreenshotAs(OutputType.FILE);
    FileUtils.copyFile(src, new File("./screenshots/error.png"));
    throw e;
}
  1. Создавайте кастомные обработчики для часто повторяющихся исключений
  2. Не игнорируйте исключения без веской причины

Резюмируем

  • NoSuchElement/Timeout - проблемы с поиском элементов
  • StaleElement - работа с динамическим DOM
  • NotInteractable/ClickIntercepted - проблемы взаимодействия
  • Window/Frame - ошибки переключения контекста
  • WebDriverException - общие проблемы драйвера

Профессиональный совет: Всегда анализируйте исключения и добавляйте обработку, которая поможет:

  1. Точно диагностировать проблему
  2. Сделать тесты стабильнее
  3. Предоставить полезную информацию при падении

Для сложных сценариев реализуйте retry-механизм для обработки временных проблем (но не злоупотребляйте им).