Изучение Selenium в Python: полное руководство (обновлено 2026)

📝 Кратко: Библиотека selenium с использованием python — это классика автоматизации, которая в 2026 году стала еще стабильнее. В этой статье мы начнем изучение Selenium в Python и разберем всё: от современной установки до глубокого поиска элементов в Shadow DOM и Iframes, чтобы ваши скрипты никогда не «теряли» нужные кнопки.
Автоматизация браузера и парсинг данных с помощью библиотеки selenium python

Всем привет! Если вы хотя бы раз задумывались об автоматизации действий в браузере, то наверняка слышали про библиотеку selenium. В Python я использую этот инструмент уже много лет, и несмотря на появление конкурентов типа Playwright, Селениум остается тем самым «швейцарским ножом», который выручает в самых нестандартных ситуациях. В 2026 году работа с ним стала на порядок проще благодаря встроенным механизмам управления драйверами. Сегодня я хочу подробно рассказать вам, как превратить этот фреймворк в вашего верного помощника, способного пробиться сквозь самые сложные интерфейсы.

Зачем использовать selenium python в 2026 году?

Многие новички задаются вопросом: стоит ли учить Селениум, когда есть асинхронный Playwright? Ответ — однозначно да. Главная сила selenium заключается в его универсальности. Если вам нужно запустить скрипт в специфической версии браузера или интегрироваться с огромной корпоративной системой тестирования, Селениум справится там, где другие просто не запустятся.

Работа с этим инструментом позволяет имитировать поведение реального человека на 100%. Вы можете не только кликать, но и двигать мышь по сложным траекториям, имитировать зажатие клавиш и работать с расширениями. Если ваша задача — обойти систему детекции ботов, то грамотно настроенный Селениум станет вашим лучшим союзником. Для сравнения подходов рекомендую также почитать статью автоматизация браузера на Python через Playwright.

Первый шаг в изучении Selenium в Python: установка окружения

В 2026 году про ручное скачивание chromedriver можно забыть. Современный selenium в python включает в себя Selenium Manager, который сам определяет версию вашего браузера и скачивает нужный драйвер в фоне. Больше никаких ошибок «версия драйвера не соответствует версии Chrome».

Я рекомендую использовать пакетный менеджер uv, который справится с установкой зависимостей в разы быстрее стандартного pip.

# Установка через uv (рекомендую)
uv pip install selenium

📚 Документация: Selenium Installation Guide «Selenium WebDriver использует протокол W3C для управления браузером. Для работы на Python требуется пакет selenium и установленный в системе браузер.»

Поиск элементов: как не запутаться в DOM-дереве

DOM (Document Object Model) — это структура страницы, где каждый элемент является узлом. Чтобы ваш скрипт на selenium в python работал безотказно, нужно выбирать стабильные «зацепки».

Основные стратегии поиска

  1. By.ID — Самый надежный вариант. ID уникален. Если он есть — используйте его.
  2. By.CSS_SELECTOR — Лаконично и быстро. Позволяет искать по классам и вложенности (например, .user-card > button.follow).
  3. By.XPATH — Самый мощный способ. Позволяет искать элементы по тексту и перемещаться вверх к родителям.

XPath против CSS: что выбрать?

CSS-селекторы работают быстрее, но XPath незаменим, когда нужно найти элемент по его содержимому. Например: //button[contains(text(), 'Купить')]. Никогда не копируйте «полный XPath» из консоли разработчика (вроде /html/body/div[1]/...) — это сделает ваш скрипт крайне хрупким. Используйте только относительные пути.

Сложные случаи: Shadow DOM и Iframes

Иногда вы видите элемент в коде, но selenium упорно пишет NoSuchElementException. Скорее всего, элемент спрятан в Shadow DOM или внутри Iframe.

Работа с Shadow DOM

Shadow DOM — это «стена», которая инкапсулирует часть кода страницы (часто встречается в кастомных веб-компонентах). Чтобы достать элемент оттуда, нужно сначала найти «хозяина» тени (Shadow Root).

# Находим элемент-хозяин
shadow_host = driver.find_element(By.CSS_SELECTOR, "#shadow_host")
# Берем его теневой корень
shadow_root = shadow_host.shadow_root
# Теперь ищем внутри корня
inner_button = shadow_root.find_element(By.CSS_SELECTOR, ".inner-btn")
inner_button.click()

Работа с Iframes

Iframe — это фактически «сайт в сайте». Селениум не видит то, что внутри фрейма, пока вы в него не «войдете». Это частая ошибка, чтобы не допускать ошибки в написании кода, читайте в статье про 10 ошибок новичков в Python.

# Находим фрейм
iframe = driver.find_element(By.ID, "payment-frame")
# Переключаем контекст внутрь фрейма
driver.switch_to.frame(iframe)
# Теперь работаем с элементами внутри
driver.find_element(By.NAME, "card_number").send_keys("1111")
# Возвращаемся обратно на основную страницу
driver.switch_to.default_content()

Ожидания (Waits): забудьте про time.sleep()

Главная причина нестабильности скриптов на selenium с использованием python — попытка кликнуть по элементу, который еще не загрузился. Никогда не используйте time.sleep(). Это делает код медленным и ненадежным.

Правильный путь — явные ожидания (Explicit Waits). Вы указываете условие: «Жди, пока кнопка станет кликабельной, но не более 10 секунд».

📚 Документация: Selenium Waits «Явные ожидания позволяют WebDriver ждать определенное условие перед продолжением выполнения кода. Это лучший способ борьбы с динамическим контентом.»

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Ждем максимум 10 секунд, пока элемент появится в DOM и станет видимым
element = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.ID, "submit-btn"))
)
element.click()

Продвинутые техники: Маскировка и Headless

Чтобы сайт не заблокировал ваш скрипт на selenium, нужно уметь маскироваться. В 2026 году простым изменением User-Agent уже не обойтись, но это необходимый минимум. Также полезно использовать прокси. Если вы планируете серьезный парсинг, обязательно изучите, как обойти защиту Cloudflare.

options = webdriver.ChromeOptions()
# Запуск без окна (для серверов)
options.add_argument("--headless=new") 
# Подмена User-Agent
options.add_argument("user-agent=Mozilla/5.0...")
# Отключение флага автоматизации
options.add_argument("--disable-blink-features=AutomationControlled")

driver = webdriver.Chrome(options=options)

Практический пример: Парсинг динамического сайта

Давайте напишем полноценный скрипт на python с использованием selenium, который соберет цитаты с сайта quotes.toscrape.com/js/. Особенность этого сайта в том, что контент на нем генерируется с помощью JavaScript, и обычный requests его просто не увидит.

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

def create_driver():
    # Настраиваем параметры браузера
    options = Options()
    options.add_argument("--start-maximized") # Открываем на весь экран
    # Маскировка: убираем флаг, что браузером управляет автоматика
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    
    return webdriver.Chrome(options=options)

def main():
    driver = create_driver()
    # Создаем объект ожидания (максимум 20 секунд)
    wait = WebDriverWait(driver, 20)

    try:
        # Переходим на демонстрационный сайт
        driver.get("https://quotes.toscrape.com/js/")
        print(f"Зашли на сайт: {driver.title}")

        # Цикл для прохода по страницам (пагинация)
        while True:
            try:
                # 1. Ждем, пока загрузятся карточки с цитатами
                # Метод presence_of_all_elements_located вернет список всех найденных элементов
                quotes = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "quote")))
                
                print(f"--- Найдено цитат на странице: {len(quotes)} ---")
                
                for quote in quotes:
                    # Внутри каждой карточки ищем текст и автора
                    text = quote.find_element(By.CLASS_NAME, "text").text
                    author = quote.find_element(By.CLASS_NAME, "author").text
                    print(f"Цитата: {text[:50]}... | Автор: {author}")

                # 2. Ищем кнопку 'Next' для перехода на следующую страницу
                try:
                    next_button = driver.find_element(By.CSS_SELECTOR, "li.next a")
                    next_button.click()
                    print("Переходим на следующую страницу...")
                    time.sleep(1) # Небольшая пауза для корректной подгрузки JS
                except:
                    print("Это была последняя страница. Выходим.")
                    break

            except TimeoutException:
                print("Ошибка: Элементы не загрузились вовремя.")
                break

    finally:
        # Обязательно закрываем браузер, чтобы не оставлять процессы в памяти
        driver.quit()

if __name__ == "__main__":
    main()

Подробное объяснение кода:

  • Options(): Здесь мы настраиваем «лицо» нашего браузера. Опция excludeSwitches критически важна — она удаляет из свойств браузера метку, по которой сайты понимают, что их парсит selenium python.
  • WebDriverWait(driver, 20): Мы не просто ждем, а создаем «умный» таймер. Он будет проверять наличие элементов в DOM-дереве каждые 500 миллисекунд. Как только элементы появились — код пойдет дальше, не дожидаясь конца 20 секунд.
  • EC.presence_of_all_elements_located: Это условие ожидания. Оно говорит скрипту: «Не начинай цикл, пока на странице не появится хотя бы один элемент с классом quote». Это лучший способ борьбы с динамической загрузкой.
  • find_element внутри цикла: Обратите внимание, что мы ищем текст и автора не во всем документе (driver.find), а внутри конкретного объекта quote. Это локальный поиск, который позволяет не перепутать данные разных товаров или цитат.
  • try...finally: Это стандарт надежного кода. Даже если в середине парсинга упадет интернет или вылезет ошибка, блок finally выполнит driver.quit(), и ваш компьютер не будет забит открытыми окнами Chrome.

Заключение

Библиотека selenium и python — это мощный инструмент, который в 2026 году стал доступнее для новичков благодаря автоматизации драйверов. Помните, что залог успеха в автоматизации — это не скорость написания кода, а использование правильных ожиданий и стабильных селекторов. Чтобы ваши скрипты были не только рабочими, но и профессиональными, рекомендую изучить наш материал про чистый и читаемый код на Python.

🔁 Больше полезных материалов по автоматизации браузера:
Playwright на Python — современная и быстрая альтернатива Selenium
Как писать чистый код на Python — советы по архитектуре ваших парсеров
Автоматизация форм — практические примеры кликов и ввода данных
💬 Остались вопросы? Пишите в комментариях — с радостью уточню, дополню или помогу с вашим кодом.
📢 Подписывайтесь на Telegram-канал PythonAuto, чтобы не пропустить новые гайды по автоматизации, парсингу и разные трюки на Python.
👉 Ваш интерес — лучшая мотивация для новых статей!

Оставьте комментарий