⚡ Шпаргалка POM
pages/__init__.py — пустой, делает папку пакетом
BasePage.__init__(driver) → self.driver, self.wait = WebDriverWait(driver, 10)
- Локатор как атрибут:
LOCATOR = (By.ID, "value")
@pytest.fixture(scope="class") — один driver на класс тестов
@pytest.fixture(scope="class", autouse=True) — автоматическая инициализация в BaseTest
- Импорт:
from pages.login_page import LoginPage
class TestFoo(BaseTest): → доступны self.driver, self.login_page, …
Структура проекта
saucedemo_tests/
├── conftest.py # глобальные фикстуры
├── pages/
│ ├── __init__.py # пустой
│ ├── base_page.py # BasePage
│ ├── login_page.py # LoginPage(BasePage)
│ ├── inventory_page.py # InventoryPage(BasePage)
│ ├── cart_page.py # CartPage(BasePage)
│ └── checkout_page.py # CheckoutPage(BasePage)
└── tests/
├── __init__.py # пустой
├── base_test.py # BaseTest
├── test_login.py # TestLogin(BaseTest)
├── test_inventory.py # TestInventory(BaseTest)
└── test_cart.py # TestCart(BaseTest)
BasePage — шаблон
| Метод | Описание | EC-условие |
find(locator) |
Ожидает и возвращает элемент |
presence_of_element_located |
click(locator) |
Ждёт кликабельности и кликает |
element_to_be_clickable |
type_text(locator, text) |
Очищает и вводит текст |
presence_of_element_located |
get_text(locator) |
Возвращает текст элемента |
presence_of_element_located |
find_all(locator) |
Список всех элементов |
presence_of_all_elements_located |
is_visible(locator) |
Проверяет видимость |
visibility_of_element_located |
LoginPage — ключевые локаторы и методы
| Атрибут/метод | Значение/действие |
USERNAME_INPUT | (By.ID, "user-name") |
PASSWORD_INPUT | (By.ID, "password") |
LOGIN_BUTTON | (By.ID, "login-button") |
ERROR_MESSAGE | (By.CLASS_NAME, "error-message-container") |
open() | Открывает saucedemo.com |
enter_username(username) | Вводит логин |
enter_password(password) | Вводит пароль |
click_login() | Нажимает кнопку Login |
success_login(user, pwd) | Полный цикл авторизации |
get_error_message() | Текст ошибки |
InventoryPage — ключевые методы
| Метод | Описание |
get_items() | Все элементы .inventory_item |
get_items_amount() | Количество товаров (должно быть 6) |
get_item_names() | Список названий товаров |
get_item_price(item_name) | Цена конкретного товара (XPath по названию) |
add_item_to_cart(item_name) | Нажимает кнопку «Add to cart» у товара |
go_to_cart() | Клик по иконке корзины |
all_items_are_displayed() | True, если все товары видны |
all_item_names_contains_sauce_labs() | True, если все названия начинаются с "Sauce Labs" |
CartPage — ключевые методы
| Метод | Описание |
get_cart_item_price(item_name) | Цена товара в корзине (XPath по названию) |
remove_item_from_cart(item_name) | Удаляет товар из корзины |
proceed_to_checkout() | Клик по кнопке Checkout |
CheckoutPage — ключевые методы
| Метод | Описание |
fill_checkout_form(first, last, zip) | Заполняет форму данными покупателя |
get_total_price() | Читает итоговую стоимость с Overview-страницы |
BaseTest — шаблон
| Элемент | Описание |
@pytest.fixture(scope="class", autouse=True) | Автоматически запускается для каждого класса-наследника |
self.driver | Экземпляр WebDriver |
self.login_page | LoginPage(self.driver) |
self.inventory_page | InventoryPage(self.driver) |
self.cart_page | CartPage(self.driver) |
yield | Разделитель setup/teardown |
self.driver.quit() | Закрытие браузера после всех тестов класса |
Запуск тестов
# Запуск всех тестов проекта
pytest tests/
# Запуск конкретного файла
pytest tests/test_inventory.py
# Запуск с подробным выводом
pytest tests/ -v
# Запуск с остановкой на первой ошибке
pytest tests/ -x