⚖️ Старый vs Новый: методы поиска элементов

← К оглавлению урока

⚡ Главное: find_element_by_* удалён в Selenium 4

# СТАРОЕ (Selenium 3, из лекции) — НЕ РАБОТАЕТ в Selenium 4
driver.find_element_by_id("login")
driver.find_element_by_xpath("//button")
driver.find_elements_by_css_selector(".card")

# НОВОЕ (Selenium 4) — только так
from selenium.webdriver.common.by import By
driver.find_element(By.ID, "login")
driver.find_element(By.XPATH, "//button")
driver.find_elements(By.CSS_SELECTOR, ".card")
Важно: методы find_element_by_* и find_elements_by_* (показанные в лекции) были помечены как устаревшие ещё в Selenium 3.12 и полностью удалены в Selenium 4.0. Запуск с ними падает с AttributeError. В курсе и в коде используйте только новый API с By.*.

Сравнение: Selenium 3 → Selenium 4

Из лекции (старое, Selenium 3) Современное (Selenium 4)
driver.find_element_by_id("x") driver.find_element(By.ID, "x")
driver.find_element_by_name("x") driver.find_element(By.NAME, "x")
driver.find_element_by_class_name("x") driver.find_element(By.CLASS_NAME, "x")
driver.find_element_by_tag_name("x") driver.find_element(By.TAG_NAME, "x")
driver.find_element_by_link_text("x") driver.find_element(By.LINK_TEXT, "x")
driver.find_element_by_partial_link_text("x") driver.find_element(By.PARTIAL_LINK_TEXT, "x")
driver.find_element_by_css_selector("x") driver.find_element(By.CSS_SELECTOR, "x")
driver.find_element_by_xpath("x") driver.find_element(By.XPATH, "x")
driver.find_elements_by_css_selector("x") driver.find_elements(By.CSS_SELECTOR, "x")
driver.find_elements_by_tag_name("x") driver.find_elements(By.TAG_NAME, "x")

Пример: полная замена старого кода на новый

# ===== СТАРОЕ (из лекции, Selenium 3) =====
# test_old_style.py  — НЕ РАБОТАЕТ в Selenium 4
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://suninjuly.github.io/cats.html")

header = driver.find_element_by_tag_name("h1")         # AttributeError!
cards = driver.find_elements_by_css_selector(".col-sm-4")  # AttributeError!
driver.quit()


# ===== НОВОЕ (Selenium 4) =====
# test_new_style.py
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://suninjuly.github.io/cats.html")

header = driver.find_element(By.TAG_NAME, "h1")           # OK
cards = driver.find_elements(By.CSS_SELECTOR, ".col-sm-4")  # OK

print(header.text)
print(f"Карточек: {len(cards)}")
driver.quit()

Почему изменили API?

  • Единообразие: теперь все стратегии поиска идут через один метод find_element() с параметром By.*.
  • Гибкость: легче переключать стратегию, передавать локатор как переменную.
  • Стандарт W3C: новый API точнее следует спецификации WebDriver Protocol.
# test_flexible_locator.py
# Можно передавать стратегию как параметр
def find(driver, by, value):
    return driver.find_element(by, value)

# Использование
el = find(driver, By.CSS_SELECTOR, ".btn-primary")
el = find(driver, By.XPATH, "//button[text()='OK']")

Ошибка при использовании старого кода

# При запуске старого кода в Selenium 4
AttributeError: 'WebDriver' object has no attribute 'find_element_by_id'

# Решение: замените на новый API
# find_element_by_id("x")  →  find_element(By.ID, "x")