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("Элемент отсутствует")