💻 Примеры: локаторы в действии

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

⚡ Ключевые примеры

# 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"