diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..9143196 --- /dev/null +++ b/.env.example @@ -0,0 +1,19 @@ +# ============================================================ +# ШАБЛОН .env — скопируй в .env и заполни реальными данными +# Команда: cp .env.example .env +# ============================================================ + +# Роль: Управление ветеринарии +VETDEPT_LOGIN= +VETDEPT_PASSWORD= + +# Роль: Ветеринарная станция +VETSTATION_LOGIN= +VETSTATION_PASSWORD= + +# Роль: Администрация (префектура) +PREFECTURE_LOGIN= +PREFECTURE_PASSWORD= + +# Базовый URL портала +BASE_URL=https://vet.goznak.ru diff --git a/requirements.txt b/requirements.txt index fc63313..a62a99f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ -playwright -pytest -pytest-playwright -pytest-xdist -pytest-html==3.2.0 \ No newline at end of file +playwright +pytest +pytest-playwright +pytest-xdist +pytest-html==3.2.0 +python-dotenv \ No newline at end of file diff --git a/tests/conftest.py b/tests/conftest.py index 0701195..725f3eb 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,41 +1,66 @@ +import os import pytest +from dotenv import load_dotenv from playwright.sync_api import Page -# Словарь с учетными данными для разных ролей +# Загружаем переменные из .env (файл находится в корне проекта) +load_dotenv() + +# Базовый URL портала — берётся из .env или дефолт +BASE_URL = os.getenv("BASE_URL", "https://vet.goznak.ru") + +# Словарь с учетными данными для разных ролей — берутся из .env CREDENTIALS = { - "vetdept": {"login": "gz_vetdept@vet.goznak.ru", "password": "y2pyBAn7zw"}, - "vetstation": {"login": "gz_vetstation@vet.goznak.ru", "password": "A6wrpzpD5T"}, - "prefecture": {"login": "gz_prefecture@vet.goznak.ru", "password": "sbT9shGsbe"}, + "vetdept": { + "login": os.getenv("VETDEPT_LOGIN"), + "password": os.getenv("VETDEPT_PASSWORD"), + }, + "vetstation": { + "login": os.getenv("VETSTATION_LOGIN"), + "password": os.getenv("VETSTATION_PASSWORD"), + }, + "prefecture": { + "login": os.getenv("PREFECTURE_LOGIN"), + "password": os.getenv("PREFECTURE_PASSWORD"), + }, } + @pytest.fixture(scope="function") def role_page(page: Page, request): """ Фикстура, которая определяет роль теста и автоматически авторизует пользователя. + Учётные данные загружаются из файла .env (не хранятся в коде). """ - # 2. Выполняем логин role = None for marker in request.node.iter_markers(): if marker.name in CREDENTIALS: role = marker.name break - - # 3. Если маркер не найден, честно говорим об этом (вместо молчаливого NameError) + + # Если маркер не найден, честно говорим об этом (вместо молчаливого NameError) if role is None: pytest.fail("ОШИБКА: У теста нет маркера роли (например, @pytest.mark.vetstation)!") - print(f"\n[АВТОЛОГИН] Выполняется вход под ролью: {role}") - - page.goto("https://vet.goznak.ru") creds = CREDENTIALS[role] - + + # Проверяем что .env заполнен + if not creds["login"] or not creds["password"]: + pytest.fail( + f"ОШИБКА: Переменные окружения для роли '{role}' не заданы. " + f"Скопируй .env.example в .env и заполни данные." + ) + + print(f"\n[АВТОЛОГИН] Выполняется вход под ролью: {role}") + + page.goto(BASE_URL) page.get_by_role("textbox", name="Email").fill(creds["login"]) page.get_by_role("textbox", name="Введите пароль").fill(creds["password"]) page.get_by_role("button", name="Войти в аккаунт").click() - + page.wait_for_selector("#app", timeout=10000) - + yield page page.context.clear_cookies() \ No newline at end of file