Как стать автором
Обновить

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

Уровень сложностиСредний
Время на прочтение3 мин
Количество просмотров2.1K

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

Привет, тестировщики и кодеры! Представь: пишешь автотесты для 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 и немного хитрости — это всё что нам потребовалось. Если что-то не зашло или есть идеи, пиши в комменты, обсудим. Удачи и быстрых тестов!

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
О каком опыте вы хотите узнать?
50% Структура проекта с автотестами: файлы и папки, где что лежит и почему (API/UX)4
50% Создание собственного фреймворка для автоматизации, почему это хорошая идея?4
25% Инструменты из папки utils, что полезного можно там держать?2
0% Свой вариант в комментариях0
Проголосовали 8 пользователей. Воздержался 1 пользователь.
Теги:
Хабы:
+3
Комментарии5

Публикации

Работа

Ближайшие события