diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..98fe3c3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Игнорировать кэш Python +__pycache__/ +*.pyc +*.pyo +*.pyd + +# Игнорировать кэш pytest +.pytest_cache/ +.coverage +htmlcov/ + +# Игнорировать временные файлы тестов +*.tmp +*.testdb +*.log + +# Игнорировать локальные настройки +local_*.py +.env.test + +# Игнорировать файлы IDE +.idea/ +.vscode/ +*.swp \ No newline at end of file diff --git a/README.md b/README.md index c08c9c2..e437c4b 100644 Binary files a/README.md and b/README.md differ diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..fdaa5c0 --- /dev/null +++ b/conftest.py @@ -0,0 +1,106 @@ +# conftest.py +import pytest +import time +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 +from urls import BASE_URL + +@pytest.fixture(scope="function") +def driver(): + """Фикстура для инициализации и завершения работы драйвера""" + driver = webdriver.Chrome() + yield driver + driver.quit() + +@pytest.fixture +def user_credentials(): + """Генерирует уникальные учетные данные пользователя""" + timestamp = int(time.time() * 1000) + return { + "name": f"TestUser{timestamp}", + "email": f"test{timestamp}@example.com", + "password": f"Password{timestamp % 10000}" + } + +@pytest.fixture +def registered_user(driver, user_credentials): + """Фикстура регистрации нового пользователя""" + driver.get(f"{BASE_URL}register") + + # Ожидаем загрузку формы регистрации + WebDriverWait(driver, 15).until( + EC.visibility_of_element_located((By.XPATH, "//h2[text()='Регистрация']")) + ) + + # Используем более надежные локаторы + name_input = WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.XPATH, "//label[contains(text(), 'Имя')]/following-sibling::input")) + ) + email_input = WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.XPATH, "//label[contains(text(), 'Email')]/following-sibling::input")) + ) + password_input = WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.XPATH, "//input[@type='password']")) + ) + + # Заполнение формы + name_input.send_keys(user_credentials["name"]) + email_input.send_keys(user_credentials["email"]) + password_input.send_keys(user_credentials["password"]) + + # Отправка формы + driver.find_element(By.XPATH, "//button[text()='Зарегистрироваться']").click() + + # Ожидание перехода на страницу входа + WebDriverWait(driver, 15).until(EC.url_contains("login")) + return user_credentials + +@pytest.fixture +def login(driver, registered_user): + """Фикстура для выполнения входа зарегистрированного пользователя""" + def _login(): + driver.get(f"{BASE_URL}login") + + # Ожидаем загрузку формы входа + WebDriverWait(driver, 15).until( + EC.visibility_of_element_located((By.XPATH, "//h2[text()='Вход']")) + ) + + # Находим поля с более надежными локаторами + email_field = WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.XPATH, "//input[@type='text' and contains(@name, 'name')]")) + ) + password_field = WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.XPATH, "//input[@type='password']")) + ) + + # Заполняем поля + email_field.clear() + email_field.send_keys(registered_user["email"]) + password_field.clear() + password_field.send_keys(registered_user["password"]) + + # Кликаем кнопку входа + login_button = WebDriverWait(driver, 10).until( + EC.element_to_be_clickable((By.XPATH, "//button[text()='Войти']")) + ) + login_button.click() + + # Ожидаем успешного входа + WebDriverWait(driver, 15).until( + EC.visibility_of_element_located((By.XPATH, "//button[text()='Оформить заказ']")) + ) + return _login + +@pytest.hookimpl(tryfirst=True, hookwrapper=True) +def pytest_runtest_makereport(item, call): + outcome = yield + rep = outcome.get_result() + + if rep.when == "call" and rep.failed: + driver = item.funcargs.get('driver') + if driver is not None: + timestamp = time.strftime("%Y%m%d_%H%M%S") + driver.save_screenshot(f"failure_{item.name}_{timestamp}.png") diff --git a/helpers.py b/helpers.py new file mode 100644 index 0000000..c0848ea --- /dev/null +++ b/helpers.py @@ -0,0 +1,65 @@ +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC + +def login(driver, base_url, test_credentials): + wait = WebDriverWait(driver, 10) # Ожидание до 10 секунд + + # 1. Переход на страницу входа + driver.get(f"{base_url}login") + + # 2. Ожидание появления формы входа (проверяем заголовок "Вход") + wait.until( + EC.visibility_of_element_located((By.XPATH, "//h2[text()='Вход']")) + ) + + # 3. Ввод email и пароля + email_field = wait.until( + EC.visibility_of_element_located((By.XPATH, "//input[@name='name']")) + ) + email_field.send_keys(test_credentials["email"]) + + password_field = wait.until( + EC.visibility_of_element_located((By.XPATH, "//input[@type='password']")) + ) + password_field.send_keys(test_credentials["password"]) + + # 4. Клик по кнопке "Войти" + login_button = wait.until( + EC.element_to_be_clickable((By.XPATH, "//button[text()='Войти']")) + ) + login_button.click() + + # 5. Ожидание успешного входа (например, появления кнопки "Оформить заказ" на главной) + wait.until( + EC.visibility_of_element_located((By.XPATH, "//button[text()='Оформить заказ']")) + ) + + from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from locators import LoginPageLocators + +class LoginHelper: + @staticmethod + def perform_login(driver, email, password): + """Выполняет вход в систему""" + email_field = WebDriverWait(driver, 10).until( + EC.visibility_of_element_located(LoginPageLocators.EMAIL_INPUT) + ) + email_field.clear() + email_field.send_keys(email) + + password_field = WebDriverWait(driver, 10).until( + EC.visibility_of_element_located(LoginPageLocators.PASSWORD_INPUT) + ) + password_field.clear() + password_field.send_keys(password) + + login_button = WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(LoginPageLocators.LOGIN_BUTTON) + ) + login_button.click() + + WebDriverWait(driver, 10).until( + EC.visibility_of_element_located(LoginPageLocators.ORDER_BUTTON) + ) \ No newline at end of file diff --git a/locators.py b/locators.py new file mode 100644 index 0000000..ad0e28c --- /dev/null +++ b/locators.py @@ -0,0 +1,49 @@ +from selenium.webdriver.common.by import By + + +class MainPageLocators: + """Локаторы главной страницы""" + LOGIN_BUTTON = (By.XPATH, "//button[text()='Войти в аккаунт']") + ACCOUNT_BUTTON = (By.XPATH, "//a[@href='/account']") + LOGO = (By.CLASS_NAME, "AppHeader_header__logo__2D0X2") + + +class ConstructorPageLocators: + """Локаторы конструктора""" + CONSTRUCTOR_BUTTON = (By.XPATH, "//p[text()='Конструктор']") + BUNS_TAB = (By.XPATH, "//div[contains(@class, 'tab_tab')]//span[text()='Булки']/..") + SAUCES_TAB = (By.XPATH, "//div[contains(@class, 'tab_tab')]//span[text()='Соусы']/..") + TOPPINGS_TAB = (By.XPATH, "//div[contains(@class, 'tab_tab')]//span[text()='Начинки']/..") + ACTIVE_TAB = (By.XPATH, "//div[contains(@class, 'tab_tab_type_current')]/span") + BUNS_SECTION = (By.XPATH, "//h2[text()='Булки']/..") + SAUCES_SECTION = (By.XPATH, "//h2[text()='Соусы']/..") + TOPPINGS_SECTION = (By.XPATH, "//h2[text()='Начинки']/..") + + +class LoginPageLocators: + """Локаторы страницы входа""" + LOGIN_HEADER = (By.XPATH, "//h2[contains(text(), 'Вход')]") + EMAIL_INPUT = (By.XPATH, "//input[@name='name']") + PASSWORD_INPUT = (By.XPATH, "//input[@type='password']") + LOGIN_BUTTON = (By.XPATH, "//button[text()='Войти']") + ORDER_BUTTON = (By.XPATH, "//button[text()='Оформить заказ']") + + +class RegistrationPageLocators: + """Локаторы страницы регистрации""" + REGISTRATION_HEADER = (By.XPATH, "//h2[contains(text(), 'Регистрация')]") + NAME_INPUT = (By.XPATH, "//label[contains(text(), 'Имя')]/following-sibling::input") + EMAIL_INPUT = (By.XPATH, "//label[contains(text(), 'Email')]/following-sibling::input") + PASSWORD_INPUT = (By.XPATH, "//input[@type='password']") + SUBMIT_BUTTON = (By.XPATH, "//button[contains(text(), 'Зарегистрироваться')]") + PASSWORD_ERROR = (By.XPATH, "//p[contains(text(), 'Некорректный пароль')]") + LOGIN_LINK = (By.XPATH, "//a[text()='Войти']") + + +class ForgotPasswordLocators: + """Локаторы страницы восстановления пароля""" + LOGIN_LINK = (By.XPATH, "//a[text()='Войти']") + +class AccountPageLocators: + """Локаторы страницы личного кабинета""" + LOGOUT_BUTTON = (By.XPATH, "//button[contains(text(), 'Выход')]") \ No newline at end of file diff --git a/test_constructor.py b/test_constructor.py new file mode 100644 index 0000000..694d052 --- /dev/null +++ b/test_constructor.py @@ -0,0 +1,77 @@ +import pytest +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from urls import BASE_URL +from locators import ConstructorPageLocators + + +class TestConstructorNavigation: + """Тесты навигации между разделами конструктора""" + + def test_buns_section_by_default(self, driver): + """Проверка, что по умолчанию активна вкладка 'Булки'""" + driver.get(BASE_URL) + + active_tab = WebDriverWait(driver, 10).until( + EC.visibility_of_element_located(ConstructorPageLocators.ACTIVE_TAB) + ) + assert active_tab.text == "Булки", f"Ожидалась активная вкладка 'Булки', но получили '{active_tab.text}'" + + def test_switch_between_buns_and_sauces(self, driver): + """Тест переключения между разделами 'Булки' и 'Соусы'""" + driver.get(BASE_URL) + + # Ожидаем загрузки конструктора + WebDriverWait(driver, 15).until( + EC.presence_of_element_located(ConstructorPageLocators.BUNS_SECTION) + ) + + # Проверяем начальное состояние + active_tab = WebDriverWait(driver, 10).until( + EC.visibility_of_element_located(ConstructorPageLocators.ACTIVE_TAB) + ) + assert active_tab.text == "Булки", "По умолчанию должна быть активна вкладка 'Булки'" + + # Переключаемся на соусы + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(ConstructorPageLocators.SAUCES_TAB) + ).click() + + # Ждем активации вкладки "Соусы" + WebDriverWait(driver, 15).until( + EC.text_to_be_present_in_element(ConstructorPageLocators.ACTIVE_TAB, "Соусы") + ) + + # Возвращаемся на булки + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(ConstructorPageLocators.BUNS_TAB) + ).click() + + # Ждем активации вкладки "Булки" с увеличенным таймаутом + WebDriverWait(driver, 15).until( + EC.text_to_be_present_in_element(ConstructorPageLocators.ACTIVE_TAB, "Булки") + ) + + # Дополнительная проверка видимости раздела + WebDriverWait(driver, 10).until( + EC.visibility_of_element_located(ConstructorPageLocators.BUNS_SECTION) + ) + + def test_switch_to_toppings_section(self, driver): + """Тест переключения на раздел 'Начинки'""" + driver.get(BASE_URL) + + toppings_tab = WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(ConstructorPageLocators.TOPPINGS_TAB) + ) + toppings_tab.click() + + # Ждем появления раздела начинок + WebDriverWait(driver, 10).until( + EC.visibility_of_element_located(ConstructorPageLocators.TOPPINGS_SECTION) + ) + + active_tab = WebDriverWait(driver, 10).until( + EC.visibility_of_element_located(ConstructorPageLocators.ACTIVE_TAB) + ) + assert active_tab.text == "Начинки", f"Ожидалась активная вкладка 'Начинки', но получили '{active_tab.text}'" \ No newline at end of file diff --git a/test_login.py b/test_login.py new file mode 100644 index 0000000..223bf2c --- /dev/null +++ b/test_login.py @@ -0,0 +1,49 @@ +import pytest +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from urls import BASE_URL +from locators import (MainPageLocators, RegistrationPageLocators, ForgotPasswordLocators) +from helpers import LoginHelper + +class TestLogin: + """Тесты авторизации пользователя""" + + def test_login_from_main_page_button(self, driver, registered_user): + """Тест входа через кнопку на главной странице""" + driver.get(BASE_URL) + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(MainPageLocators.LOGIN_BUTTON) + ).click() + + LoginHelper.perform_login(driver, registered_user["email"], registered_user["password"]) + assert BASE_URL == driver.current_url + + def test_login_from_personal_account_button(self, driver, registered_user): + """Тест входа через кнопку личного кабинета""" + driver.get(BASE_URL) + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(MainPageLocators.ACCOUNT_BUTTON) + ).click() + + LoginHelper.perform_login(driver, registered_user["email"], registered_user["password"]) + assert BASE_URL == driver.current_url + + def test_login_from_registration_form(self, driver, registered_user): + """Тест входа через форму регистрации""" + driver.get(f"{BASE_URL}register") + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(RegistrationPageLocators.LOGIN_LINK) + ).click() + + LoginHelper.perform_login(driver, registered_user["email"], registered_user["password"]) + assert BASE_URL == driver.current_url + + def test_login_from_forgot_password_form(self, driver, registered_user): + """Тест входа через форму восстановления пароля""" + driver.get(f"{BASE_URL}forgot-password") + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(ForgotPasswordLocators.LOGIN_LINK) + ).click() + + LoginHelper.perform_login(driver, registered_user["email"], registered_user["password"]) + assert BASE_URL == driver.current_url \ No newline at end of file diff --git a/test_logout.py b/test_logout.py new file mode 100644 index 0000000..8837e08 --- /dev/null +++ b/test_logout.py @@ -0,0 +1,82 @@ +import pytest +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from urls import BASE_URL +from locators import ( + MainPageLocators, + ConstructorPageLocators, + LoginPageLocators, + AccountPageLocators +) + + +class TestAccountLogout: + """Тесты выхода из аккаунта""" + + def test_logout_from_account(self, driver, login): + """Тест выхода из личного кабинета""" + login() + + # Переходим в личный кабинет + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(MainPageLocators.ACCOUNT_BUTTON) + ).click() + + # Выходим из аккаунта + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(AccountPageLocators.LOGOUT_BUTTON) + ).click() + + # Проверяем, что произошел выход + WebDriverWait(driver, 10).until( + EC.presence_of_element_located(LoginPageLocators.LOGIN_BUTTON) + ) + + assert not driver.current_url.endswith("/account"), "После выхода не должно быть доступа к личному кабинету" + + +class TestNavigationFromAccount: + """Тесты навигации из личного кабинета""" + + def test_navigate_to_constructor_via_button(self, driver, login): + """Тест перехода в конструктор через кнопку""" + login() + driver.get(f"{BASE_URL}account") + + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(ConstructorPageLocators.CONSTRUCTOR_BUTTON) + ).click() + + assert driver.current_url == BASE_URL, \ + f"После клика на 'Конструктор' ожидался переход на {BASE_URL}" + + def test_navigate_to_constructor_via_logo(self, driver, login): + """Тест перехода в конструктор через логотип""" + login() + driver.get(f"{BASE_URL}account") + + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(MainPageLocators.LOGO) + ).click() + + assert driver.current_url == BASE_URL, \ + f"После клика на логотип ожидался переход на {BASE_URL}" + + +class TestPersonalAccount: + """Тесты личного кабинета""" + + def test_personal_account_click(self, driver): + """Тест перехода в личный кабинет без авторизации""" + driver.get(BASE_URL) + + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(MainPageLocators.ACCOUNT_BUTTON) + ).click() + + assert driver.current_url == f"{BASE_URL}login", \ + f"Ожидался переход на страницу входа" + + assert WebDriverWait(driver, 10).until( + EC.visibility_of_element_located(LoginPageLocators.LOGIN_HEADER) + ).is_displayed(), "Заголовок 'Вход' не отображается" \ No newline at end of file diff --git a/test_navigation.py b/test_navigation.py new file mode 100644 index 0000000..79681fd --- /dev/null +++ b/test_navigation.py @@ -0,0 +1,51 @@ +import pytest +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from urls import BASE_URL +from locators import MainPageLocators, ConstructorPageLocators, LoginPageLocators + + +class TestNavigationFromAccount: + """Тесты навигации из личного кабинета""" + + def test_navigate_to_constructor_via_button(self, driver, login): + """Тест перехода в конструктор через кнопку""" + login() + + # Переходим в личный кабинет + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(MainPageLocators.ACCOUNT_BUTTON) + ).click() + + # Кликаем на кнопку "Конструктор" + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(ConstructorPageLocators.CONSTRUCTOR_BUTTON) + ).click() + + # Проверяем переход на главную страницу + WebDriverWait(driver, 10).until( + EC.url_to_be(BASE_URL) + ) + assert driver.current_url == BASE_URL, \ + f"После клика на 'Конструктор' ожидался переход на {BASE_URL}" + + def test_navigate_to_constructor_via_logo(self, driver, login): + """Тест перехода в конструктор через логотип""" + login() + + # Переходим в личный кабинет + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(MainPageLocators.ACCOUNT_BUTTON) + ).click() + + # Кликаем на логотип + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(MainPageLocators.LOGO) + ).click() + + # Проверяем переход на главную страницу + WebDriverWait(driver, 10).until( + EC.url_to_be(BASE_URL) + ) + assert driver.current_url == BASE_URL, \ + f"После клика на логотип ожидался переход на {BASE_URL}" \ No newline at end of file diff --git a/test_personal_account.py b/test_personal_account.py new file mode 100644 index 0000000..1fc0c83 --- /dev/null +++ b/test_personal_account.py @@ -0,0 +1,33 @@ +import pytest +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from urls import BASE_URL +from locators import MainPageLocators, LoginPageLocators + + +class TestPersonalAccount: + """Тесты для проверки личного кабинета""" + + def test_personal_account_click(self, driver): + """Тест перехода в личный кабинет без авторизации""" + # Переходим на главную страницу + driver.get(BASE_URL) + + # Ожидаем и кликаем на кнопку личного кабинета + account_button = WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(MainPageLocators.ACCOUNT_BUTTON) + ) + account_button.click() + + # Проверяем редирект на страницу входа + WebDriverWait(driver, 10).until( + EC.url_contains("login") + ) + assert driver.current_url == f"{BASE_URL}login", \ + f"Ожидался переход на {BASE_URL}login, получен {driver.current_url}" + + # Проверяем отображение заголовка страницы входа + login_title = WebDriverWait(driver, 10).until( + EC.visibility_of_element_located(LoginPageLocators.LOGIN_HEADER) + ) + assert login_title.is_displayed(), "Заголовок 'Вход' не отображается" \ No newline at end of file diff --git a/test_registration.py b/test_registration.py new file mode 100644 index 0000000..e4d2400 --- /dev/null +++ b/test_registration.py @@ -0,0 +1,89 @@ +import time +import pytest +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from urls import BASE_URL +from locators import RegistrationPageLocators, LoginPageLocators + + +class TestRegistration: + """Тесты регистрации пользователя""" + + def test_successful_registration(self, driver, user_credentials): + """Тест успешной регистрации нового пользователя""" + # Переходим на страницу регистрации + driver.get(f"{BASE_URL}register") + + # Ожидаем загрузку страницы + WebDriverWait(driver, 10).until( + EC.visibility_of_element_located(RegistrationPageLocators.REGISTRATION_HEADER) + ) + + # Заполняем форму регистрации + name_input = WebDriverWait(driver, 10).until( + EC.presence_of_element_located(RegistrationPageLocators.NAME_INPUT) + ) + email_input = WebDriverWait(driver, 10).until( + EC.presence_of_element_located(RegistrationPageLocators.EMAIL_INPUT) + ) + password_input = WebDriverWait(driver, 10).until( + EC.presence_of_element_located(RegistrationPageLocators.PASSWORD_INPUT) + ) + + name_input.send_keys(user_credentials["name"]) + email_input.send_keys(user_credentials["email"]) + password_input.send_keys(user_credentials["password"]) + + # Отправляем форму + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(RegistrationPageLocators.SUBMIT_BUTTON) + ).click() + + # Проверяем успешную регистрацию (редирект на страницу входа) + WebDriverWait(driver, 10).until( + EC.url_contains("login") + ) + assert "login" in driver.current_url, "После регистрации должен быть редирект на страницу входа" + + # Проверяем наличие заголовка "Вход" + assert WebDriverWait(driver, 10).until( + EC.visibility_of_element_located(LoginPageLocators.LOGIN_HEADER) + ).is_displayed(), "Заголовок страницы входа не отображается" + + def test_invalid_password_registration(self, driver): + """Тест регистрации с некорректным паролем""" + # Переходим на страницу регистрации + driver.get(f"{BASE_URL}register") + + # Ожидаем загрузку страницы + WebDriverWait(driver, 10).until( + EC.visibility_of_element_located(RegistrationPageLocators.REGISTRATION_HEADER) + ) + + # Заполняем форму с некорректным паролем + name_input = WebDriverWait(driver, 10).until( + EC.presence_of_element_located(RegistrationPageLocators.NAME_INPUT) + ) + email_input = WebDriverWait(driver, 10).until( + EC.presence_of_element_located(RegistrationPageLocators.EMAIL_INPUT) + ) + password_input = WebDriverWait(driver, 10).until( + EC.presence_of_element_located(RegistrationPageLocators.PASSWORD_INPUT) + ) + + name_input.send_keys("Тестовое Имя") + email_input.send_keys(f"test{int(time.time())}@example.com") + password_input.send_keys("12345") + + # Отправляем форму + WebDriverWait(driver, 10).until( + EC.element_to_be_clickable(RegistrationPageLocators.SUBMIT_BUTTON) + ).click() + + # Проверяем сообщение об ошибке + error_message = WebDriverWait(driver, 10).until( + EC.visibility_of_element_located(RegistrationPageLocators.PASSWORD_ERROR) + ) + assert error_message.is_displayed(), "Сообщение об ошибке не отображается" + assert "register" in driver.current_url, "При ошибке регистрации не должно быть редиректа" + diff --git a/urls.py b/urls.py new file mode 100644 index 0000000..dfa3118 --- /dev/null +++ b/urls.py @@ -0,0 +1 @@ +BASE_URL = "https://stellarburgers.nomoreparties.site/" \ No newline at end of file