⚖️ Старый 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")