Постоянный логин в автотестах? Решаем с Playwright и экономим время

от автора

Когда тесты — это не про тестирование, а про ожидание

Привет, тестировщики и кодеры! Представь: пишешь автотесты для UX, всё красиво, запускаешь — и каждый тест начинает с нуля: логин, пароль, кнопка. Как будто у тестов амнезия! Это бесит, тормозит и превращает код в копипасту. Давай разберёмся, как выкинуть повторный логин на свалку и ускорить всё с Playwright и Python.

Почему повторная авторизация — зло

Повторная авторизация в тестах — это как если бы ты каждый раз, входя в дом, заново представлялся своей собаке. Вот что бесит:

  • Тормоза: Каждый логин — это + ~5 секунд к тесту. Умножь на 100 тестов, и ты уже варишь кофе, пока они ползут.

  • Код — помойка: Пихать шаги логина в каждый тест — это как копипастить «Hello, World!» в каждый файл. Ну такое.

Короче, жить так нельзя. И не будем. Playwright и немного магии Python нам в помощь.

Решение: один контекст на всех

В Playwright есть такая штука, как контекст браузера. Это типа твоя сессия, где хранятся куки, localStorage и прочие вкусности. Идея простая — авторизуемся один раз в общем контексте, а потом пускаем все тесты пастись в нём, как в общем пастбище. Никаких лишних логинов, всё летает, все счастливы.

Но мы не просто сделаем общий контекст, мы добавим гибкости: если тестам нужна авторизация — берём общий контекст, если нет — новый. А чтобы не запутаться, замутим декоратор @use_session, который будет говорить: «Эй, этот тест хочет в общий котёл!» Погружаемся в код.

Как это сделать: фикстуры и код

Шаг 1: Фикстуры — наше всё

В conftest.py мы настроим фикстуры, чтобы они работали как швейцарские часы. Что нам нужно:

  • Общий контекст: Один на всю сессию, с авторизацией.

  • Новый контекст: Для тестов, где авторизация не нужна.

  • Фикстура page: Умная штука, которая сама решает, какой контекст подсунуть, глядя на декоратор.

  • Фикстура authorize: Логинится раз и всё.

Шаг 2: Декоратор @use_session

Просто метка для классов тестов или отдельных тестов. Если она есть — тест бежит в общий контекст, если нет — в новый. Всё, никаких лишних движений.

Шаг 3: Пишем тесты

Ставишь @use_session на класс/тест — и тесты используют общую сессию. Не ставишь — тест крутится в своём песочнице. Просто и красиво.

Пример conftest.py

import allure import pytest from playwright.sync_api import sync_playwright  from src.pages.auth_page import AuthPage from src.pages.landing_page import LandingPage  def use_session(cls):     cls.use_session = True     return cls  @pytest.fixture(scope="session") def playwright():     with sync_playwright() as p:         yield p  @pytest.fixture(scope="session") def browser(playwright):     browser = playwright.chromium.launch(headless=True)     yield browser     browser.close()  @pytest.fixture(scope="session") def shared_context(browser, authorize):     context = browser.new_context()     yield context     context.close()  @pytest.fixture(scope="function") def new_context(browser):     context = browser.new_context()     yield context     context.close()  @pytest.fixture(scope="function") def page(request, new_context, shared_context, domain):     context = shared_context if hasattr(request.cls, "use_session") else new_context     page = context.new_page()     page.goto(domain, wait_until="load", timeout=3000)     yield page     page.close()  @pytest.fixture(scope="session", autouse=True) def authorize(shared_context, domain):     page = shared_context.new_page()     page.goto(domain, wait_until="load", timeout=3000)          with allure.step("Авторизуемся один раз и навсегда"):         landing = LandingPage(page, domain)         landing.open()         landing.click_login_button()                  auth = AuthPage(page, domain)         auth.fill_login("testuser@example.com")         auth.fill_password("supersecret")         auth.click_submit()          page.close()

Что тут творится:

  • shared_context: Живёт всю сессию, авторизация в нём делается один раз.

  • new_context: Новый для каждого теста, если общий не нужен.

  • page: Смотрит на класс теста и решает, какой контекст брать.

  • authorize: Залогинились один раз — и всё, можно курить бамбук.

Пример test.py

Вот тебе пример теста. Представь, что мы проверяем страницу с котиками после авторизации.

import allure import pytest from conftest import use_session from src.pages.cat_page import CatPage  @use_session class TestCatPage:     @allure.title("Проверяем, что котики на месте")     def test_check_cats(self, page, domain):         cats = CatPage(page, domain)         cats.open()         assert cats.count_cats() > 0, "Где котики? Я требую котиков!"

Тут мы просто открываем страницу и проверяем, что котики на месте. Логин? Какой логин? Он уже в прошлом!

Почему это хорошо:

  • Скорость: Тесты бегут, как спринтеры.

  • Гибкость: Хочешь с логином, хочешь без — всё под контролем.

  • Код чистый: Никаких копипастов с шагами авторизации.

Итог

Вот и всё. Теперь твои тесты не будут тратить время на вечные логины. Playwright, Python и немного хитрости — это всё что нам потребовалось. Если что-то не зашло или есть идеи, пиши в комменты, обсудим. Удачи и быстрых тестов!

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

О каком опыте вы хотите узнать?

0% Структура проекта с автотестами: файлы и папки, где что лежит и почему (API/UX)0
0% Создание собственного фреймворка для автоматизации, почему это хорошая идея?0
0% Инструменты из папки utils, что полезного можно там держать?0
0% Свой вариант в комментариях0

Никто еще не голосовал. Воздержавшихся нет.

ссылка на оригинал статьи https://habr.com/ru/articles/918546/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *