Контекст приложения Flask для pytest+Silenium

Cтолкнулся с такой проблемой, у меня есть такие фикстуры:

@pytest.fixture(scope="session")
def app():
    """Создание экземпляра приложения."""
    app = create_app()
    app.config.update({
        "TestingConfig": True,
    })
    app.testing = True
    yield app
    '''with app.test_request_context():
        db.session.remove()
        db.drop_all()'''


@pytest.fixture()
def client(app, new_user):
    """Создание тестового клиента."""
    with app.test_client() as client:
        login_user(new_user)
        yield client


@pytest.fixture()
def runner(app):
    """Саздание клиентского раннера."""
    return app.test_cli_runner()


@pytest.fixture(scope="module")
def driver():
    """Инициализация драйвера браузера."""
    driver = webdriver.Chrome()
    yield driver
    driver.quit()

А есть вот такая функция тестирования:

def test_href_home_page(self, driver):
        driver.get("http://localhost:5000")
        element = WebDriverWait(driver,
                                10).until(
                                    EC.presence_of_element_located(
                                        (By.CLASS_NAME, 'btn-MENU')))
        element.click()
        assert 'Сделайте выбор!' in driver.title

Проблема вот в чём, для того, чтобы мне проверить элемент btn-MENU(это href ссылка), мне нужно чтобы у фикстуры drive был контекст приложения Flask, а так же логгирование, с помощью login_user (т.к. только при логгировании, на html странице появится нужный мне элемент), как у фикстуры client, но добавление его таким же методом как у client, не приносит желаемого результата, что делать?


Ответы (1 шт):

Автор решения: Andrey Soloviev

Чтобы добавить контекст приложения и авторизацию в фикстуру driver, вы можете модифицировать её так, чтобы она использовала созданный экземпляр приложения и проходила процесс авторизации через функцию login_user, как это делается в фикстуре client.

Однако, поскольку вы используете Selenium WebDriver в фикстуре driver для взаимодействия с браузером, вам потребуется немного изменить подход. Вместо использования тестового клиента Flask (app.test_client()), который подходит для тестирования без запуска браузера, вам нужно будет запустить ваше приложение в фоновом режиме, чтобы Selenium мог взаимодействовать с ним.

Для этого вы можете создать временный сервер Flask в фикстуре driver и выполнить авторизацию пользователя перед тестированием функционала через браузер. Вот пример того, как можно организовать вашу фикстуру driver:

import threading
from flask import Flask
from selenium import webdriver

@pytest.fixture(scope="module")
def driver(app, new_user):
    """Инициализация драйвера браузера с авторизацией пользователя."""
    # Запуск тестового сервера Flask в фоновом режиме
    def run_app():
        app.run(use_reloader=False)

    threading.Thread(target=run_app).start()

    driver = webdriver.Chrome()
    try:
        # Открыть домашнюю страницу приложения
        driver.get("http://localhost:5000")
        # Выполнить авторизацию пользователя
        login_user(new_user, driver)  # Функция login_user должна быть адаптирована для работы с Selenium
        yield driver
    finally:
        driver.quit()
        # Остановить Flask сервер после завершения теста
        app.do_teardown_appcontext()

Обратите внимание, что вам может потребоваться доработать функцию login_user для выполнения авторизации через интерфейс, который Selenium может манипулировать, например, отправляя данные формы через браузер. Также не забудьте убедиться, что ваше приложение Flask настроено на прослушивание соответствующего адреса (localhost и порта 5000 в данном случае), который вы используете в тестах.

→ Ссылка