✅ Решения заданий
⚡ Краткие ответы
- Локатор — способ однозначно определить элемент на странице.
- 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()