← Назад к вопросам

Назови три любых Exception в Selenium

1.2 Junior🔥 142 комментариев
#Другое

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Три исключения (Exception) в Selenium WebDriver

В Selenium WebDriver существует множество исключений, которые являются подклассами WebDriverException. Они предназначены для точной идентификации конкретных проблем, возникающих при автоматизации взаимодействия с браузером. Вот три наиболее распространенных и полезных исключения:

1. NoSuchElementException

Это, пожалуй, самое часто встречающееся исключение в автоматизации на Selenium. Оно возникает, когда драйвер пытается найти элемент на веб-странице (например, с помощью методов find_element(By.*, ...)), но не может его обнаружить по заданному локатору.

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

  • Локатор устарел или указан неверно (например, изменился id или xpath элемента).
  • Элемент еще не загрузился на страницу (проблема синхронизации).
  • Элемент находится внутри фрейма (iframe), который не был переключен.
  • Элемент не виден на текущем viewport'е.

Пример кода и обработки на Python:

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

try:
    # Попытка найти несуществующий элемент
    element = driver.find_element(By.ID, "nonExistentButton")
except NoSuchElementException:
    print("Элемент не найден на странице. Необходимо проверить актуальность локатора или состояние загрузки страницы.")
finally:
    driver.quit()

2. StaleElementReferenceException

Это исключение является классической проблемой динамических веб-приложений. Оно выбрасывается, когда ссылка на элемент становится "устаревшей" (stale). Это означает, что элемент был найден и сохранен в переменной, но с тех пор DOM страницы был обновлен или изменен (например, после обновления части страницы через AJAX, перезагрузки страницы или навигации). При последующей попытке взаимодействия с этим сохраненным объектом-элементом драйвер больше не может его корректно идентифицировать.

Типичный сценарий:

  1. Находим элемент списка и сохраняем его в переменную item.
  2. Выполняем действие, которое обновляет DOM (например, кликаем кнопку "Обновить").
  3. Пытаемся использовать сохраненную переменную item (например, получить текст). → Возникает StaleElementReferenceException.

Стратегия обработки:

from selenium import webdriver
from selenium.common.exceptions import StaleElementReferenceException
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get("https://example-dynamic-list.com")

# Начальный поиск элемента
items = driver.find_elements(By.CLASS_NAME, "list-item")

for i in range(len(items)):
    # Пытаемся взаимодействовать с элементом, учитывая возможность "устаревания"
    for attempt in range(3):  # Несколько попыток
        try:
            # Каждый раз перезапрашиваем список элементов, так как он мог измениться
            current_items = driver.find_elements(By.CLASS_NAME, "list-item")
            element = current_items[i]
            element.click()
            break  # Если клик прошел успешно, выходим из цикла попыток
        except StaleElementReferenceException:
            print(f"Элемент устарел, попытка {attempt + 1}. Ждем обновления DOM...")
            time.sleep(0.5)

3. TimeoutException

Это исключение не является исключительно "селениумовским", оно унаследовано от selenium.common.exceptions.TimeoutException и тесно связано с использованием явных ожиданий (Explicit Waits). Оно выбрасывается, когда условие, переданное в WebDriverWait, не выполнилось в течение заданного лимита времени.

Основное применение: Обработка ситуаций, когда мы ждем появления элемента, изменения его состояния (стал кликабельным, видимым) или любого другого кастомного условия.

Пример ожидания и перехвата исключения:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://example.com")

try:
    # Ждем появления модального окна не более 10 секунд
    wait = WebDriverWait(driver, 10)
    modal = wait.until(
        EC.presence_of_element_located((By.CLASS_NAME, "modal-content"))
    )
    print("Модальное окно успешно загрузилось.")
except TimeoutException:
    print("Модальное окно не появилось за отведенное время 10 секунд.")
    # Здесь можно выполнить fallback-действие, например, сделать скриншот или записать в лог
    driver.save_screenshot("timeout_modal_not_found.png")

Почему важно знать и различать эти исключения?

  • Эффективное дебаггинг: По типу исключения можно сразу предположить корень проблемы (NoSuchElementException — проблема локатора или загрузки, StaleElementReferenceException — проблема с обновлением DOM).
  • Стабильность тестов: Корректная обработка этих исключений (повторные попытки, явные ожидания, перепоиск элементов) делает тесты устойчивее к "флаттерности" (случайным падениям).
  • Четкая отчетность: В отчетах об ошибках можно указать не просто "тест упал", а "тест упал из-за TimeoutException при ожидании кнопки Submit", что ускоряет анализ.

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

Назови три любых Exception в Selenium | PrepBro