✅ Решения заданий

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

⚡ Краткие ответы

  • Локатор — способ однозначно определить элемент на странице.
  • By.*: ID, NAME, CLASS_NAME, TAG_NAME, LINK_TEXT, PARTIAL_LINK_TEXT, CSS_SELECTOR, XPATH.
  • XPath — язык запросов по иерархии HTML. Умеет искать по тексту.
  • DevTools: F12 → Elements → ПКМ → Copy selector / Copy XPath.
  • NoSuchElementException — обрабатывать через try-except.
  • is_displayed() → False при: display:none, visibility:hidden, opacity:0, за экраном, родитель скрыт.
  • find_elements()[] если не найдено (нет исключения).

Вопрос 1: Что такое локатор веб-элемента?

Ответ: Локатор веб-элемента — это способ однозначно определить нужный элемент на веб-странице. Он используется в автоматизированном тестировании (Selenium, Playwright) для нахождения кнопок, полей ввода, ссылок и других HTML-элементов.

Вопрос 2: Основные способы локализации

Стратегия Когда использовать
By.IDЛучший выбор, если ID уникален
By.NAMEПоля форм с атрибутом name
By.CLASS_NAMEОдин класс без пробелов
By.CSS_SELECTORГибко и быстро, по умолчанию
By.XPATHПо тексту, сложные условия
By.LINK_TEXTСсылка с точным текстом
By.TAG_NAMEУникальные теги (h1, h2)

Вопрос 3: Что такое XPath?

Ответ: XPath — язык запросов для поиска элементов в иерархической структуре HTML. Мощнее CSS: умеет искать по тексту (text()="..."), по частичному содержимому (contains()), перемещаться вверх по DOM. Обычно медленнее CSS.

Вопрос 4: Как скопировать локатор в DevTools?

Ответ: F12 → вкладка Elements → найти нужный элемент → правый клик → Copy → «Copy selector» (CSS) или «Copy XPath». Важно: скопированный XPath из DevTools строится по абсолютному пути и хрупкий. Лучше писать XPath вручную.

Вопрос 5: CSS и XPath по HTML

<div class="container">
    <button class="btn-primary">Купить</button>
</div>
# CSS: прямой потомок button в .container
.container > button

# XPath: кнопка с текстом "Купить"
//button[text()="Купить"]

# XPath: любой потомок button в .container
//div[@class="container"]//button

Вопрос 6: Поиск элемента по ID

# test_find_by_id.py
from selenium import webdriver
from selenium.webdriver.common.by import By

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

element = driver.find_element(By.ID, "login-button")
print(element.text)

driver.quit()

Вопрос 7: Обработка NoSuchElementException

Ответ: NoSuchElementException выбрасывается, когда find_element() не находит элемент. Обрабатывается через try-except, чтобы тест не падал с необработанным исключением.
# test_exception.py
from selenium.common.exceptions import NoSuchElementException

try:
    element = driver.find_element(By.ID, "non-existent")
    print("Элемент найден")
except NoSuchElementException:
    print("Элемент не найден")

Вопрос 8: Метод is_displayed()

Ответ: is_displayed() проверяет видимость элемента. Возвращает False если: display: none, visibility: hidden, opacity: 0, элемент за пределами экрана, элемент или его родитель удалён/скрыт.

Вопрос 9: find_elements() vs find_element()

Метод Если не найден Тип результата
find_element() Выбрасывает NoSuchElementException WebElement
find_elements() Возвращает [] list[WebElement]

Вопрос 10: Полный тест авторизации

# test_login_full.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

        # Проверяем кнопку Logout
        logout = self.driver.find_element(
            By.CSS_SELECTOR, "a.button.secondary.radius"
        )
        assert logout.is_displayed()