← Назад к вопросам
Написать автотест на вход в систему
2.0 Middle🔥 201 комментариев
#Теория тестирования
Условие
Напишите автотест на Python с использованием Selenium для следующего сценария:
- Открыть страницу логина
- Ввести валидный email и пароль
- Нажать кнопку Login
- Проверить, что пользователь перешел на главную страницу
Требования
- Использовать Page Object Model
- Добавить явные ожидания
- Обработать возможные исключения
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение: Автотест логина с Page Object Model
Структура проекта
tests/
pages/
login_page.py
home_page.py
base_page.py
test_login.py
conftest.py
1. Base Page (Базовый класс)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class BasePage:
def __init__(self, driver, timeout=10):
self.driver = driver
self.wait = WebDriverWait(driver, timeout)
def wait_for_element(self, by, locator):
return self.wait.until(EC.presence_of_element_located((by, locator)))
def wait_for_clickable(self, by, locator):
return self.wait.until(EC.element_to_be_clickable((by, locator)))
def wait_for_url(self, url):
return self.wait.until(EC.url_contains(url))
2. Login Page
from selenium.webdriver.common.by import By
from pages.base_page import BasePage
class LoginPage(BasePage):
# Локаторы
EMAIL_INPUT = (By.ID, "email")
PASSWORD_INPUT = (By.NAME, "password")
LOGIN_BUTTON = (By.XPATH, "//button[normalize-space()='Login']")
ERROR_MESSAGE = (By.CLASS_NAME, "error-message")
def enter_email(self, email: str):
element = self.wait_for_element(*self.EMAIL_INPUT)
element.clear()
element.send_keys(email)
def enter_password(self, password: str):
element = self.wait_for_element(*self.PASSWORD_INPUT)
element.clear()
element.send_keys(password)
def click_login(self):
button = self.wait_for_clickable(*self.LOGIN_BUTTON)
button.click()
def get_error_message(self) -> str:
try:
element = self.wait_for_element(*self.ERROR_MESSAGE)
return element.text
except:
return ""
def login(self, email: str, password: str):
self.enter_email(email)
self.enter_password(password)
self.click_login()
3. Home Page
from selenium.webdriver.common.by import By
from pages.base_page import BasePage
class HomePage(BasePage):
# Локаторы
WELCOME_TEXT = (By.CLASS_NAME, "welcome-message")
USER_PROFILE = (By.ID, "user-profile")
def is_logged_in(self) -> bool:
try:
self.wait_for_element(*self.WELCOME_TEXT)
return True
except:
return False
def get_welcome_text(self) -> str:
element = self.wait_for_element(*self.WELCOME_TEXT)
return element.text
4. Файл конфигурации (conftest.py)
import pytest
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
@pytest.fixture(scope="function")
def driver():
options = Options()
# Разкомментировать для headless режима
# options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options)
driver.maximize_window()
yield driver
driver.quit()
5. Основной тестовый файл (test_login.py)
import pytest
from pages.login_page import LoginPage
from pages.home_page import HomePage
class TestLogin:
@pytest.fixture(autouse=True)
def setup(self, driver):
self.driver = driver
self.base_url = "http://localhost:8000"
self.driver.get(f"{self.base_url}/login")
def test_successful_login(self):
login_page = LoginPage(self.driver)
home_page = HomePage(self.driver)
# Выполняем логин
login_page.login(
email="test@example.com",
password="securePassword123"
)
# Проверяем URL
home_page.wait_for_url("/home")
# Проверяем что пользователь на главной странице
assert home_page.is_logged_in(), "Пользователь не залогинился"
# Проверяем приветственное сообщение
welcome_text = home_page.get_welcome_text()
assert "Welcome" in welcome_text, "Приветственное сообщение не найдено"
def test_login_with_invalid_credentials(self):
login_page = LoginPage(self.driver)
login_page.login(
email="wrong@example.com",
password="wrongPassword"
)
# Проверяем сообщение об ошибке
error_message = login_page.get_error_message()
assert "Invalid" in error_message or "incorrect" in error_message.lower()
def test_login_with_empty_email(self):
login_page = LoginPage(self.driver)
# Оставляем email пустым
login_page.enter_password("somePassword123")
login_page.click_login()
# Проверяем валидацию
error_message = login_page.get_error_message()
assert error_message, "Ошибка валидации не отображается"
6. Расширенная версия с логированием
import logging
class TestLoginWithLogging:
@pytest.fixture(autouse=True)
def setup(self, driver):
self.driver = driver
self.logger = logging.getLogger(__name__)
self.logger.setLevel(logging.INFO)
def test_successful_login_with_logging(self):
self.logger.info("Начинаем тест логина")
login_page = LoginPage(self.driver)
try:
self.logger.info("Вводим email и пароль")
login_page.login(
email="test@example.com",
password="securePassword123"
)
self.logger.info("Проверяем переход на главную страницу")
home_page = HomePage(self.driver)
assert home_page.is_logged_in()
self.logger.info("Тест пройден успешно")
except AssertionError as e:
self.logger.error(f"Тест не пройден: {e}")
raise
except Exception as e:
self.logger.critical(f"Неожиданная ошибка: {e}")
raise
Команды для запуска
# Запустить все тесты
pytest tests/test_login.py -v
# Запустить конкретный тест
pytest tests/test_login.py::TestLogin::test_successful_login -v
# С отчётом HTML
pytest tests/test_login.py --html=report.html
# С логами
pytest tests/test_login.py -v -s --log-cli-level=INFO
Хорошие практики
- Page Object Model: Отделяем локаторы от логики тестов
- Явные ожидания: Используем WebDriverWait вместо sleep()
- Обработка исключений: Try-except для флакого кода
- Логирование: Добавляем логи для отладки
- Фиксатуры pytest: Автоматическая инициализация браузера
- Параметризованные тесты: Тестируем разные сценарии
Граничные случаи для тестирования
- Пустые поля email и пароль
- Невалидные форматы email
- Очень длинные строки
- Спецсимволы в пароле
- Сессия истекла
- Сеть недоступна
- JavaScript отключен
Для QA автоматизации
Page Object Model позволяет:
- Легче обновлять тесты при изменении UI
- Переиспользовать методы страниц
- Читаемость и поддерживаемость кода
- Масштабируемость тестовой базы