Урок 8. Работа с динамическим контентом и ожиданиями WebDriverWait
На современных сайтах контент часто загружается динамически через JavaScript или AJAX.
Если сразу пытаться найти элемент на странице, Selenium может вернуть NoSuchElementException,
поскольку элемент ещё не появился в DOM. Чтобы избежать ошибок, используют явные ожидания через WebDriverWait.
Почему обычный sleep недостаточен?
Можно использовать time.sleep(5), чтобы подождать 5 секунд, но это неэффективно:
- Если элемент появится быстрее — скрипт зря ждёт
- Если элемент загрузится медленнее — ошибка всё равно возможна
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.
