Приходилось ли вам использовать cookies в автоматизированном тестировании?

Ответ

Да, работа с cookies — это стандартная задача в автоматизированном тестировании веб-приложений и API. Cookies используются для эмуляции состояния пользовательской сессии, авторизации, сохранения предпочтений и отслеживания поведения.

Основные сценарии использования cookies в тестах:

  1. Авторизация и аутентификация: Сохранение сессионного токена после логина для последующих запросов.
  2. Тестирование персонализации: Проверка работы функций, зависящих от пользовательских настроек, сохраненных в cookies.
  3. Валидация безопасности: Проверка флагов HttpOnly, Secure, SameSite.
  4. Тестирование истечения сессии: Валидация работы приложения после истечения срока жизни cookie.

Примеры работы с cookies в разных контекстах:

1. Selenium WebDriver (Java):

import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;

public class CookieTest {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("https://example.com/login");

        // Логинимся (после этого сервер установит cookie сессии)
        driver.findElement(By.id("username")).sendKeys("testuser");
        driver.findElement(By.id("password")).sendKeys("password123");
        driver.findElement(By.id("login-btn")).click();

        // Получаем все cookies
        Set<Cookie> allCookies = driver.manage().getCookies();
        System.out.println("Всего cookies: " + allCookies.size());

        // Получаем конкретную cookie
        Cookie sessionCookie = driver.manage().getCookieNamed("session_id");
        if (sessionCookie != null) {
            System.out.println("Значение session_id: " + sessionCookie.getValue());
            System.out.println("Срок жизни: " + sessionCookie.getExpiry());
            System.out.println("Флаг Secure: " + sessionCookie.isSecure());
        }

        // Устанавливаем свою cookie (например, для тестирования локали)
        Cookie localeCookie = new Cookie("user_locale", "ru_RU", ".example.com", "/", null, true, true);
        driver.manage().addCookie(localeCookie);

        // Обновляем страницу, чтобы применилась новая cookie
        driver.navigate().refresh();

        // Удаляем cookie
        driver.manage().deleteCookieNamed("tracking_id");

        driver.quit();
    }
}

2. REST Assured (API-тестирование, Java):

import static io.restassured.RestAssured.*;

public class ApiCookieTest {

    @Test
    public void testAuthWithCookie() {
        // 1. Логинимся и получаем cookie из ответа
        Response loginResponse = given()
            .formParam("username", "testuser")
            .formParam("password", "secret")
        .when()
            .post("/login");

        // Извлекаем cookie сессии из ответа
        String sessionCookie = loginResponse.getCookie("JSESSIONID");

        // 2. Используем полученную cookie для авторизованного запроса
        given()
            .cookie("JSESSIONID", sessionCookie) // Устанавливаем cookie в заголовок
        .when()
            .get("/api/profile")
        .then()
            .statusCode(200)
            .body("username", equalTo("testuser"));
    }

    @Test
    public void testCookieAttributes() {
        // Проверяем атрибуты cookie, установленной сервером
        when()
            .get("/set-cookie-test")
        .then()
            .statusCode(200)
            .cookie("preferences", notNullValue()) // Проверяем наличие
            .cookie("preferences", containsString("theme=dark")) // Проверяем значение
            .cookie("preferences", path("$")) // Получаем детали cookie
            .cookie("session_id", sameSite("Strict")) // Проверяем атрибут SameSite
            .cookie("secure_token", isSecured(true)); // Проверяем флаг Secure
    }
}

3. Playwright (Python):

import asyncio
from playwright.async_api import async_playwright

async def test_cookies():
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        context = await browser.new_context()
        page = await context.new_page()

        await page.goto('https://example.com/login')

        # Выполняем логин
        await page.fill('#username', 'testuser')
        await page.fill('#password', 'password123')
        await page.click('#login-btn')

        # Получаем cookies из контекста браузера
        cookies = await context.cookies()
        print(f"Получено cookies: {len(cookies)}")
        for cookie in cookies:
            print(f"  {cookie['name']}: {cookie['value']} (domain: {cookie['domain']})")

        # Устанавливаем свою cookie
        await context.add_cookies([{
            'name': 'test_marker',
            'value': 'automated_test',
            'domain': 'example.com',
            'path': '/'
        }])

        # Проверяем, что cookie установилась
        test_cookie = await context.cookies('https://example.com')
        assert any(c['name'] == 'test_marker' for c in test_cookie)

        await browser.close()

asyncio.run(test_cookies())

Ключевые аспекты для тестирования:

  • Безопасность: Проверка флагов HttpOnly (доступ только на сервере), Secure (передача только по HTTPS), SameSite (защита от CSRF).
  • Срок жизни: Валидация правильности работы Expires/Max-Age.
  • Домен и путь: Корректность установки атрибутов Domain и Path.
  • Шифрование: Для чувствительных данных (токенов) проверка, что они не хранятся в plain text.

Инструменты для отладки:

  • Браузерные DevTools (вкладка Application/Storage > Cookies)
  • Снифферы трафика (Charles Proxy, Fiddler)
  • Логирование cookies в фреймворках тестирования

Ответ 18+ 🔞

Слушай, ну вот тебе про кукисы, как они в тестах работают, это же, блядь, основа основ! Без них ты как без штанов на морозе — нихуя не протестируешь, если пользователь должен быть залогинен. Это ж сессия, авторизация, всякие предпочтения пользователя — всё в этих маленьких, ёбта, печеньках сидит.

Зачем они вообще нужны, эти куки, в тестах-то?

  1. Чтоб зайти под юзером. Ну логично же: залогинился, сервер тебе в ответ сунул в заголовки Set-Cookie с каким-нибудь session_id, и ты его потом, как пропуск, ко всем следующим запросам прикладываешь. Без него — хуй тебе, а не доступ к личному кабинету.
  2. Проверить, что персонализация работает. Ну там, язык сайта сменил — в куку locale=ru_RU записались. Перезагрузил страницу — а она, сука, опять на английском. Вот это и лови.
  3. Безопасность пощупать. А cookie-то HttpOnly стоит? Чтобы JS её не украл? А Secure флаг есть, чтобы только по HTTPS ходила? А SameSite настроен, чтобы тебя не подставили? Это всё проверять надо, а то потом удивляемся, откуда утечки.
  4. Сессию убить. Поигрался с Expires — выставил время жизни в прошлое, отправил запрос и смотришь: выкинуло ли тебя из аккаунта, как и планировалось, или ты, блядь, вечный лорд системы.

Ну и как с этим всем работать? Смотри, примеры:

1. В Selenium (Java) — когда браузером управляешь:

// ... браузер запустили, на страницу логина зашли, залогинились

// Получаем ВСЕ куки, которые браузер для этого сайта хранит
Set<Cookie> allCookies = driver.manage().getCookies();
System.out.println("Всего cookies: " + allCookies.size()); // Считаем, нехуй собакаться

// Достаём конкретную, например, сессионную
Cookie sessionCookie = driver.manage().getCookieNamed("session_id");
if (sessionCookie != null) {
    System.out.println("Значение session_id: " + sessionCookie.getValue());
    System.out.println("Срок жизни: " + sessionCookie.getExpiry()); // Когда помрёт
    System.out.println("Флаг Secure: " + sessionCookie.isSecure()); // Только по HTTPS?
}

// Хочешь свою подсунуть? Например, для теста локали
Cookie localeCookie = new Cookie("user_locale", "ru_RU", ".example.com", "/", null, true, true);
driver.manage().addCookie(localeCookie); // Добавили
driver.navigate().refresh(); // Обновились — и вуаля, сайт на русском!

// А эту — нахуй удалить
driver.manage().deleteCookieNamed("tracking_id");

Тут всё просто: браузер — твой пес, куки — его косточки. Дал, забрал, новую подкинул.

2. В REST Assured (API-тестирование, Java) — тут уже напрямую с HTTP возимся:

// 1. Логинимся и вытаскиваем куку из ответа сервера
Response loginResponse = given()
    .formParam("username", "testuser")
    .formParam("password", "secret")
.when()
    .post("/login");

// Выковыриваем оттуда сессионную печеньку
String sessionCookie = loginResponse.getCookie("JSESSIONID");

// 2. И теперь ты с этой печенькой — царь и бог. Кидаешь её в следующий запрос.
given()
    .cookie("JSESSIONID", sessionCookie) // Прилепил её к заголовкам
.when()
    .get("/api/profile")
.then()
    .statusCode(200)
    .body("username", equalTo("testuser")); // И тебе открываются тайны профиля!

// 3. А можно и проверить, какую тебе сервер куку прислал, со всеми её атрибутами
when()
    .get("/set-cookie-test")
.then()
    .cookie("preferences", notNullValue()) // Вообще есть?
    .cookie("preferences", containsString("theme=dark")) // А значение правильное?
    .cookie("secure_token", isSecured(true)); // А защищённая ли она, сука? (флаг Secure)

Тут уже ближе к металлу. Сам headers правишь, сам cookie строку формируешь если надо. Полный контроль, ебать.

3. В Playwright (Python) — модно, стильно, асинхронно:

# ... контекст браузера создали, страницу открыли, логин прошли

# Вытаскиваем все куки из контекста
cookies = await context.cookies()
print(f"Получено cookies: {len(cookies)}")
for cookie in cookies:
    print(f"  {cookie['name']}: {cookie['value']} (domain: {cookie['domain']})")

# Подкидываем свою, тестовую
await context.add_cookies([{
    'name': 'test_marker',
    'value': 'automated_test',
    'domain': 'example.com',
    'path': '/'
}])

# Проверяем, прижилась ли наша диверсионная печенька
test_cookie = await context.cookies('https://example.com')
assert any(c['name'] == 'test_marker' for c in test_cookie) # Должна быть!

Playwright хорош тем, что работает с целым контекстом, а не с одной вкладкой. Удобно для сложных сценариев.

На что смотреть, когда тестируешь, а то проёбешься:

  • Безопасность, ёпта! HttpOnly — чтобы через JS не стырили. Secure — чтоб не по HTTP болталась. SameSite — от CSRF защищает. Если этого нет — пиши пропало.
  • Срок годности. Expires или Max-Age должны быть адекватными. Сессионная — должна кончаться, постоянная — нет.
  • Где живет. Domain и Path должны быть строго по делу, а не на весь интернет.
  • Не светится ли. Токены всякие не должны в открытом виде лежать. Хоть какое-то подобие шифрования.

Чем смотреть, если что-то пошло не так:

  • Инструменты разработчика в браузере. Вкладка Application (или Storage) -> Cookies. Там всё как на ладони, какая кука чему равна.
  • Прокси-снифферы (Charles, Fiddler). Видишь весь трафик, включая эти самые заголовки Set-Cookie и Cookie. Бесценная штука.
  • Логи в самом фреймворке. Выводи в консоль все куки, которые получаешь и отправляешь. Глазами посмотреть — часто всё сразу ясно становится.

В общем, куки — это не просто печеньки, это, блядь, документы. Без них в системе — ты аноним, бомж цифровой. А с правильными куками — свой в доску. Тестируй это дело тщательно.