Работа с DOM в Selenium Python: поиск элемента и ожидания

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Selenium предлагает методы, такие как find_elements_by_*, возвращающие пустой список, если элемент с указанным идентификатором не обнаружен. Это позволяет избежать возникновения исключения NoSuchElementException.

Python
Скопировать код
from selenium import webdriver
from selenium.webdriver.common.by import By

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

# Обязательно замените "element_id" на актуальный ID
if driver.find_elements(By.ID, "element_id"):
    print("Элемент обнаружен. Отмечаем 🎉")
else:
    print("Элемент не найден. Волей случая 😞")
Кинга Идем в IT: пошаговый план для смены профессии

Эффективные стратегии поиска элементов

Отдаём предпочтение CSS-селекторам

CSS-селекторы являются более предпочтительными за счёт большей эффективности поиска и лучшей читабельности кода, в сравнении с XPath.

Создание универсальной функции

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

Python
Скопировать код
# Универсальная функция, сохраняющая ваше время
def element_exists(driver, by_method, selector):
    return len(driver.find_elements(by_method, selector)) > 0

Используйте явные ожидания

Явные ожидания улучшают надёжность и всегда предпочтительнее использования time.sleep():

Python
Скопировать код
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Терпение – залог успешной работы 😉
wait = WebDriverWait(driver, 10)
try:
    element = wait.until(EC.presence_of_element_located((By.ID, "element_id")))
    print("Элемент доступен! Отмечаем 🎊")
except:
    print("Элемент не обнаружен. Пора пересмотреть стратегии 👩‍💻")

Профессиональная обработка исключений

Применяйте структуру try-except для грациозной обработки исключений:

Python
Скопировать код
from selenium.common.exceptions import NoSuchElementException

try:
    # Проверяем наличие элемента
    driver.find_element(By.ID, "nonexistent_element")
    print("Элемент присутствует. Мы на верном пути! 🥳")
except NoSuchElementException:
    print("Элемент не найден. Словно ищем иголку в стоге сена 🙃")

Дополнительные рекомендации

  • Стремитесь искать элементы по ID или name.
  • Избегайте применения LINK_TEXT из-за вероятности его локализации или изменения.
  • Воспользуйтесь возможностями XPath для работы со сложными структурами страницы.
  • Обеспечьте корректность аргументов скрипта, чтобы предотвратить ошибки.
  • Добавляйте логи для отладки, для контроля процесса поиска элементов.
  • Попросите разработчиков включить уникальные ID или name туда, где это возможно.
  • Верните значение неявного ожидания к его начальному состоянию после его изменения.

Визуализация

Предположим, вы ищете в саду цветы:

Часть сада  | Наличие цветка
---------------------------
Зона 1     | ❌ (Цветы не найдены 🌼)
Зона 2     | ❌ (По прежнему пусто 🌼)
Зона 3     | ✅ (Цветок обнаружен! 🌼)

С Selenium всё просто, он действует как надёжный детектор цветов:

Python
Скопировать код
# Ваш надёжный "детектор цветов"
flower_detector = driver.find_elements(By.XPATH, "xpath_of_flower")

Детектор либо обнаруживает наличие цветка (✅), либо не обнаруживает (❌).

Советы по повышению производительности

Написание эффективных скриптов приводит к экономии времени, ведь каждая миллисекунда имеет значение.

Рациональное использование времени ожидания

Выбирайте между неявным ожиданием, явным ожиданием или гибким ожиданием в Selenium:

  • Неявное ожидание: Определение времени ожидания перед прекращением поиска элемента.
  • Явное ожидание: Пауза исполнения до появления конкретного условия.
  • Гибкое ожидание: Определение максимального времени ожидания и частоты проверки состояния элемента.

Лучшие практики

  • Сокращайте использование ожиданий, применяйте их осознанно.
  • Отдаёте предпочтение методу find_elements, он не вызывает исключений, при отсутствии элемента.
  • Не забывайте закрывать драйвер с помощью driver.quit() после выполнения скрипта, чтобы избежать нежелательных проблем.

Преодолеваем рамки проверки наличия

Иногда недостаточно просто найти элемент. Важно также удостовериться, что он видим и доступен для взаимодействия:

Python
Скопировать код
from selenium.webdriver.common.action_chains import ActionChains

# Видимость – ключевое условие функционирования!
visible = EC.visibility_of_element_located((By.ID, 'element_id'))
ActionChains(driver).move_to_element(wait.until(visible)).perform()

Полезные материалы

  1. 4. Locating Elements — Selenium Python Bindings 2 documentation
  2. WebDriver Waits in Selenium
  3. Selenium C# WebDriver: Wait until element is present – Stack Overflow
  4. selenium.common.exceptions — Selenium 4.17.2 documentation
  5. XPath Tutorial
  6. CSS Selectors Reference
  7. Modern Web Automation With Python and Selenium – Real Python