💻 Примеры: локаторы в действии
⚡ Ключевые примеры
# conftest.py
import pytest
from selenium import webdriver
@pytest.fixture
def driver():
driver = webdriver.Chrome()
driver.maximize_window()
yield driver
driver.quit()
# test_locators_demo.py
from selenium.webdriver.common.by import By
def test_find_by_id(driver):
driver.get("https://the-internet.herokuapp.com/login")
field = driver.find_element(By.ID, "username")
assert field.is_displayed()
def test_find_elements(driver):
driver.get("https://suninjuly.github.io/cats.html")
cards = driver.find_elements(By.CSS_SELECTOR, ".col-sm-4")
assert len(cards) > 0
Пример 1: поиск элементов разными стратегиями
Демонстрируем основные стратегии By.* на тестовой странице.
# test_by_strategies.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
@pytest.fixture
def driver():
driver = webdriver.Chrome()
driver.maximize_window()
yield driver
driver.quit()
def test_locator_strategies(driver):
driver.get("https://the-internet.herokuapp.com/login")
# По ID
username = driver.find_element(By.ID, "username")
assert username.is_displayed()
# По NAME
password = driver.find_element(By.NAME, "password")
assert password.is_displayed()
# По CSS-селектору
button = driver.find_element(By.CSS_SELECTOR, "button[type='submit']")
assert button.is_displayed()
# По XPATH с текстом
login_text = driver.find_element(By.XPATH, "//button[contains(text(),'Login')]")
assert login_text.is_displayed()
# По TAG_NAME
header = driver.find_element(By.TAG_NAME, "h2")
assert header.text == "Login Page"
Пример 2: авторизация и проверка результата
Полный тест авторизации из задания Summary session 3 (the-internet.herokuapp.com).
# test_login.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class TestLogin:
@pytest.fixture(autouse=True)
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get("http://the-internet.herokuapp.com/login")
yield
self.driver.quit()
def test_valid_login(self):
# Вводим данные
WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located((By.ID, "username"))
).send_keys("tomsmith")
self.driver.find_element(By.ID, "password").send_keys("SuperSecretPassword!")
# Нажимаем Login
self.driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click()
# Проверяем успешное сообщение
success = WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.flash.success"))
)
assert "You logged into a secure area!" in success.text
# Проверяем заголовок Secure Area
header = self.driver.find_element(By.TAG_NAME, "h2")
assert header.text == "Secure Area"
# Проверяем кнопку Logout
logout = self.driver.find_element(By.CSS_SELECTOR, "a.button.secondary.radius")
assert logout.is_displayed()
Обратите внимание:
WebDriverWait используется для явного ожидания появления элемента. Это хорошая практика — страница должна загрузиться до поиска элемента.
⚠️ Проверить по документации: явные ожидания рассматриваются подробно в уроке 07.
Пример 3: find_elements — получение списка
# test_find_elements.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
@pytest.fixture
def driver():
driver = webdriver.Chrome()
yield driver
driver.quit()
def test_cards_displayed(driver):
driver.get("https://suninjuly.github.io/cats.html")
# Найдём все карточки на странице
cards = driver.find_elements(By.CSS_SELECTOR, ".col-sm-4")
assert len(cards) > 0, "Карточки не найдены"
# Проверим, что каждая карточка видима
for card in cards:
assert card.is_displayed(), f"Карточка скрыта: {card.text[:30]}"
def test_find_by_xpath_text(driver):
driver.get("https://suninjuly.github.io/cats.html")
# Поиск кнопки по тексту через XPath
view_buttons = driver.find_elements(By.XPATH, "//button[text()='View']")
assert len(view_buttons) > 0, "Кнопки View не найдены"
Пример 4: обработка NoSuchElementException
# test_exception_handling.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
@pytest.fixture
def driver():
driver = webdriver.Chrome()
yield driver
driver.quit()
def test_element_not_found(driver):
driver.get("https://the-internet.herokuapp.com/login")
# Несуществующий элемент
try:
driver.find_element(By.ID, "non-existent-id")
assert False, "Должно было быть выброшено исключение"
except NoSuchElementException:
pass # Ожидаемое поведение
def test_safe_find_with_find_elements(driver):
driver.get("https://the-internet.herokuapp.com/login")
# find_elements не выбрасывает исключение — возвращает []
elements = driver.find_elements(By.ID, "non-existent-id")
assert elements == [], f"Ожидался пустой список, получено: {elements}"
Пример 5: is_displayed() — скрытый элемент
# test_is_displayed.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
@pytest.fixture
def driver():
driver = webdriver.Chrome()
yield driver
driver.quit()
def test_is_displayed_on_login_page(driver):
driver.get("https://the-internet.herokuapp.com/login")
# Поле имени видно
username = driver.find_element(By.ID, "username")
assert username.is_displayed(), "Поле username должно быть видимым"
# Заголовок видно
header = driver.find_element(By.TAG_NAME, "h2")
assert header.is_displayed(), "Заголовок должен быть видимым"
assert header.text == "Login Page"