Урок 8. Работа с динамическим контентом и ожиданиями WebDriverWait

На современных сайтах контент часто загружается динамически через JavaScript или AJAX. Если сразу пытаться найти элемент на странице, Selenium может вернуть NoSuchElementException, поскольку элемент ещё не появился в DOM. Чтобы избежать ошибок, используют явные ожидания через WebDriverWait.

Почему обычный sleep недостаточен?

Можно использовать time.sleep(5), чтобы подождать 5 секунд, но это неэффективно:

  • Если элемент появится быстрее — скрипт зря ждёт
  • Если элемент загрузится медленнее — ошибка всё равно возможна
WebDriverWait ждёт до заданного времени появления элемента и продолжает сразу после того, как элемент доступен.

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

Пример использования WebDriverWait

Допустим, на странице загружаются карточки книг, и первая карточка появляется не сразу. С помощью WebDriverWait можно дождаться её видимости и безопасно начать обработку всех книг на странице.

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

driver = webdriver.Chrome()
driver.get("https://books.toscrape.com/catalogue/category/books_1/index.html")

wait = WebDriverWait(driver, 10)

# Ждём появления хотя бы одной карточки книги
first_book = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "article.product_pod")))

# Теперь можно безопасно собирать все книги на странице
books = driver.find_elements(By.CSS_SELECTOR, "article.product_pod")
for book in books:
    title = book.find_element(By.TAG_NAME, "h3").text
    price = book.find_element(By.CSS_SELECTOR, "p.price_color").text
    print(f"{title} — {price}")

driver.quit()

Основные типы условий в expected_conditions

  • presence_of_element_located — элемент появился в DOM (не обязательно видим)
  • visibility_of_element_located — элемент видим и доступен для взаимодействия
  • element_to_be_clickable — элемент видим и кликабелен
  • text_to_be_present_in_element — текст появился в элементе
  • staleness_of — элемент исчез из DOM (полезно для обновляющихся списков)

Советы по работе с динамическим контентом

  • Используйте явные ожидания вместо time.sleep() для большей надежности
  • Для сложных динамических страниц комбинируйте ожидания по видимости, кликабельности и тексту
  • WebDriverWait можно использовать с лямбда-функциями для нестандартных условий

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

Больше уроков по парсингу на parsertools.ru/lessons.