🔖 Справочник: локаторы Selenium

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

⚡ Шпаргалка по локаторам

from selenium.webdriver.common.by import By

driver.find_element(By.ID, "login")
driver.find_element(By.NAME, "username")
driver.find_element(By.CLASS_NAME, "btn-primary")
driver.find_element(By.TAG_NAME, "h1")
driver.find_element(By.LINK_TEXT, "Подробнее")
driver.find_element(By.PARTIAL_LINK_TEXT, "Подроб")
driver.find_element(By.CSS_SELECTOR, "#login .btn")
driver.find_element(By.XPATH, "//button[text()='OK']")

driver.find_elements(By.CSS_SELECTOR, ".card")  # список

element.text          # видимый текст
element.is_displayed()  # видим ли

Все стратегии By.*

Стратегия HTML-атрибут Пример Замечание
By.ID id="login" By.ID, "login" Самый надёжный, если ID уникален
By.NAME name="email" By.NAME, "email" Для форм с атрибутом name
By.CLASS_NAME class="btn-primary" By.CLASS_NAME, "btn-primary" Один класс без пробелов! Иначе ошибка
By.TAG_NAME Тег: h1, input By.TAG_NAME, "h1" Вернёт первый тег на странице
By.LINK_TEXT Точный текст ссылки By.LINK_TEXT, "Подробнее" Только для тега <a>, точное совпадение
By.PARTIAL_LINK_TEXT Часть текста ссылки By.PARTIAL_LINK_TEXT, "Подроб" Только для тега <a>, частичное совпадение
By.CSS_SELECTOR CSS-выражение By.CSS_SELECTOR, ".btn > span" Гибко, быстро — рекомендуется
By.XPATH XPath-выражение By.XPATH, "//button[text()='OK']" Мощнее CSS, медленнее

Шпаргалка: CSS-селекторы

Паттерн Смысл Пример
#id По атрибуту id #username
.class По классу .btn-primary
tag По тегу button
[attr="val"] Точное значение атрибута [name="email"]
[attr*="val"] Атрибут содержит подстроку a[href*="/view/"]
[attr^="val"] Атрибут начинается с a[href^="/products"]
[attr$="val"] Атрибут заканчивается на img[src$=".png"]
A B B — любой потомок A .nav a
A > B B — прямой потомок A .card-body > p
:nth-child(n) N-й по счёту дочерний элемент .col-sm-4:nth-child(1)
tag.class Тег с конкретным классом div.container

Шпаргалка: XPath

Паттерн Смысл Пример
//*[@id="x"] По ID //*[@id="bullet"]
//*[@name="x"] По атрибуту name //*[@name="email"]
//*[@class="x"] По классу (осторожно!) //*[@class="btn-primary"]
//tag[text()="x"] По точному тексту //button[text()="View"]
//A/B B — прямой потомок A //div[@class="nav"]/a
//A//B B — любой потомок A //div[@class="card"]//button
contains(@attr,"x") Атрибут содержит подстроку //a[contains(@href,"/view/")]
contains(text(),"x") Текст содержит подстроку //p[contains(text(),"Купить")]
//img[contains(@src,"cat")] Картинка с "cat" в src //img[contains(@src,"serious_cat")]

Методы поиска

# test_locators.py
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException

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

# find_element — первый совпадающий (или NoSuchElementException)
element = driver.find_element(By.ID, "login")

# find_elements — все совпадающие (или пустой список)
elements = driver.find_elements(By.CSS_SELECTOR, ".card")

# Свойства элемента
print(element.text)           # видимый текст
print(element.is_displayed()) # True/False — виден ли
print(element.is_enabled())   # True/False — активен ли
print(element.get_attribute("href"))  # значение атрибута

driver.quit()

Проверка наличия элемента без исключения

# test_element_check.py
# Безопасная проверка через find_elements
elements = driver.find_elements(By.ID, "my-element")
if elements:
    print("Элемент найден:", elements[0].text)
else:
    print("Элемент отсутствует")