Контекст приложения 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 шт):
Чтобы добавить контекст приложения и авторизацию в фикстуру 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 в данном случае), который вы используете в тестах.