← Назад к вопросам

Написать автотест на вход в систему

2.0 Middle🔥 201 комментариев
#Теория тестирования

Условие

Напишите автотест на Python с использованием Selenium для следующего сценария:

  1. Открыть страницу логина
  2. Ввести валидный email и пароль
  3. Нажать кнопку Login
  4. Проверить, что пользователь перешел на главную страницу

Требования

  • Использовать 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

Хорошие практики

  1. Page Object Model: Отделяем локаторы от логики тестов
  2. Явные ожидания: Используем WebDriverWait вместо sleep()
  3. Обработка исключений: Try-except для флакого кода
  4. Логирование: Добавляем логи для отладки
  5. Фиксатуры pytest: Автоматическая инициализация браузера
  6. Параметризованные тесты: Тестируем разные сценарии

Граничные случаи для тестирования

  • Пустые поля email и пароль
  • Невалидные форматы email
  • Очень длинные строки
  • Спецсимволы в пароле
  • Сессия истекла
  • Сеть недоступна
  • JavaScript отключен

Для QA автоматизации

Page Object Model позволяет:

  • Легче обновлять тесты при изменении UI
  • Переиспользовать методы страниц
  • Читаемость и поддерживаемость кода
  • Масштабируемость тестовой базы
Написать автотест на вход в систему | PrepBro