Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Сохранение данных сессии и восстановление ее при запуске браузера. Как реализовать?

pytest
python
Теги: #<Tag:0x00007fedb94e8f78> #<Tag:0x00007fedb94e8d70>

(Gukobrist) #1

Честно сказать я уже упоролся. Искал разные решения, но ничего не помогло. Помогло только 1 решение, но там сохраняется огромное количество данных ненужных. Хотелось бы чтобы все было аккуратно.

Задача - я запускаю тестовую процедуру из 20 тестов. Первый тест - это авторизация в системе (логин, пароль + подтверждение по смс). Первый тест я всегда вручную запускаю. Получаю код и ввожу его ручками, потому что пока что еще не придумал, как это автоматизировать. После этого ручного теста, мне нужно сохранить куки (сессию), чтобы при последующих тестах мне не приходилось логиниться. Как мне это сделать и чтобы все было аккуратно и компактно. Обязательно через fixture pytest. Например я залогинился на своей локальной машине, потом взял куку (срок жизни сессии не ограниченный) и подложил ее на свой тестовый сервер где запускаются и крутятся тесты. Он подхватил куку и дальше начал гонять оставшиеся 19 тестов.

Как у меня получилось это реализовать - я написал фикстуру:

import pytest
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

executable_path = '/home/xxx/Projects/xxx/test/autotests/integration/driver/chromedriver'

@pytest.fixture(scope='session', autouse=True)
def driver(request):
    print("\nstart SESSION")
    chrome_options = Options()
    chrome_options.add_argument("user-data-dir=selenium")
    driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=executable_path)
    driver.maximize_window()
    return driver

Данные настройки позволяют мне сохранять полностью весь профиль в папке. Все логины с сеанса на сеанс.
Преимущества данного способа, то что вы можете хранить различные папки с различными профилями, в которых могут содержаться различные расширения для браузера, логины, пароли, куки, различные настройки, короче - ПОЛНОСТЬЮ ПРОФИЛЬ. (см. рис.)

Минусы подхода в том, что там целая куча файлов в папке в итоге. Мне они не нужны. Мне нужно только сохранить сессию для 1 сайта, чтобы один раз залогиниться там и больше ничего не делать. Мне нужно небольшое, аккуратное решение для Pytest.

Спасибо.


(Maxim Andryushchenkov) #2

По поводу смс было уже, решение тут
Что касается основного вопроса - тесты должны быть независимыми. То есть сетап и тирдаун конечно добавят тестам какое то время, но вы получите меньше головное боли.


(Gukobrist) #3

Независимые тесты это хорошо, но что если у меня бизнес-процесс или user case. Где есть определенная последовательность действий пользователя, просто она разделена на отдельные тесты - лог-ин, какая-то работа, покупка платной версии, какая-то работа, лог-аут. Зачем мне перед каждым тестом логиниться. Я ведь могу 1 раз залогиниться, сохранить сессию, запустить следующий тест с “какой-то работой” с этой сессией и продожить тест.

Каждый раз делать все с самого начала - это очень много времени может занимать. К тому же сервис блочит учетные записи на время, если было слишком много активностей в аккаунте (логин, релогин, лог-аут и т.д.). Например через 5 релогинов, он уже не пустит в систему. Или может я не совсем верно понял вас?


(Maxim Andryushchenkov) #4

Но это же будут разные юзеры, потому что вы их заново будете пересоздавать. Такой сетап может находиться в фикстуре:

@pytest.fixture()
def recreate_users(db_config, users_config, request):
    """
    Фикстура для пересоздания списка юзеров в базе данных
    Забирает значение маркера "recreate_users" и пересоздает в базе
    каждого юзера из списка
    :param db_config: фикстура получения конфигураций баз данных
    :param users_config: фикстура получения конфигураций пользователей
    """
    users_names = request.node.get_marker('recreate_users').args
    for user_name in users_names:
        user_config = users_config[user_name].copy()
        db_cfg = db_config['db_target']
        db_actions = DBActions(db_cfg)
        db_actions.delete_user_from_db(user_config)
        db_actions.add_user_to_db(user_config)

И далее вызываться в тесте с маркером имен юзеров, которых надо пересоздать:

@pytest.mark.recreate_users('user_1', 'user_2')
def test_valid_response(recreate_users):
    pass

(Gukobrist) #5

Спасибо вам большое за пример и за описание автоматизации смс) Очень полезно, благодарю.