Что такое HTTP cookies и как с ними работать в автотестах?

Ответ

HTTP cookies — это небольшие фрагменты данных (пары ключ-значение), которые сервер отправляет в HTTP-ответе (заголовок Set-Cookie), а браузер клиента сохраняет и автоматически отправляет обратно с последующими запросами к тому же домену (заголовок Cookie). Они используются для управления сессиями, аутентификации, хранения предпочтений пользователя и отслеживания.

Основные атрибуты cookie:

  • Имя и Значение: Основные данные.
  • Domain и Path: Определяют, к каким запросам cookie будет прикрепляться.
  • Expires/Max-Age: Время жизни. Cookie без этих атрибутов — сессионное (удаляется при закрытии браузера).
  • Secure: Передаётся только по HTTPS.
  • HttpOnly: Недоступно для JavaScript (защита от XSS).
  • SameSite: Защита от CSRF-атак (значения: Strict, Lax, None).

Работа с cookies в автотестах (Selenium WebDriver на Java):

import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

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

        // 1. Получить все cookies с текущей страницы
        Set<Cookie> allCookies = driver.manage().getCookies();
        for (Cookie cookie : allCookies) {
            System.out.println("Cookie: " + cookie.getName() + " = " + cookie.getValue());
        }

        // 2. Добавить новую cookie (часто для обхода аутентификации в тестах)
        Cookie authCookie = new Cookie.Builder("session_id", "abc123")
                                        .domain("example.com")
                                        .path("/")
                                        .isSecure(true) // Атрибут Secure
                                        .isHttpOnly(true) // Атрибут HttpOnly
                                        .build();
        driver.manage().addCookie(authCookie);

        // 3. Получить конкретную cookie по имени
        Cookie sessionCookie = driver.manage().getCookieNamed("session_id");

        // 4. Удалить cookie
        driver.manage().deleteCookieNamed("session_id");
        // или удалить все
        driver.manage().deleteAllCookies();

        driver.quit();
    }
}

Важно для тестирования:

  • Проверять, что критические cookie (например, сессионные) имеют флаги Secure и HttpOnly.
  • Использовать предварительно установленные cookies для авторизации в E2E-тестах, чтобы не проходить полный UI-флоу логина каждый раз.
  • Очищать cookies между тестами для обеспечения их изоляции.

Ответ 18+ 🔞

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

Что за атрибуты у этой печеньки, чтобы она не протухла?

  • Имя и Значение: Ну тут всё ясно — «сессия=абракадабра123».
  • Domain и Path: Где эту печеньку показывать можно. Чтобы не тыкали её налево-направо, куда не надо.
  • Expires/Max-Age: Срок годности. Если не указан — сессионная, то есть живёт, пока вкладку не закроешь. Закрыл — и всё, печенька сдохла.
  • Secure: Передавать только по HTTPS, а то какой-нибудь хитрожопый посредник её перехватит.
  • HttpOnly: Недоступна для JavaScript. Защита от того, чтобы какой-нибудь скрипт-гадёнок её не стырил через XSS.
  • SameSite: Защита от CSRF. Strict — вообще никуда не таскать, Lax — только для безопасных переходов, None — таскай куда хочешь, но только с Secure.

А теперь, как этим в автотестах рулить, чтобы не ебаться с логином каждый раз:

import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

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

        // 1. Вытащить все печеньки, что уже есть
        Set<Cookie> allCookies = driver.manage().getCookies();
        for (Cookie cookie : allCookies) {
            System.out.println("Cookie: " + cookie.getName() + " = " + cookie.getValue());
        }

        // 2. Подсунуть свою, левую (например, для авторизации)
        Cookie authCookie = new Cookie.Builder("session_id", "abc123")
                                        .domain("example.com")
                                        .path("/")
                                        .isSecure(true) // Атрибут Secure
                                        .isHttpOnly(true) // Атрибут HttpOnly
                                        .build();
        driver.manage().addCookie(authCookie);

        // 3. Достать конкретную печеньку по имени
        Cookie sessionCookie = driver.manage().getCookieNamed("session_id");

        // 4. Удалить эту ненужную хрень
        driver.manage().deleteCookieNamed("session_id");
        // или почистить весь стол разом
        driver.manage().deleteAllCookies();

        driver.quit();
    }
}

Что важно помнить, когда тестируешь эту кухню:

  • Проверяй флаги, ёпта! Критические куки (сессия, токен) должны быть с Secure и HttpOnly. Если нет — это дыра размером с Волгоград.
  • Не проходи UI-логин в каждом тесте, ебать ты консерватор! Залогинься раз, вытащи куку, и подкладывай её в начале остальных тестов. Экономия времени — овердохуищная.
  • Чисти за собой! Между тестами удаляй куки, чтобы они не влияли друг на друга. Иначе один тест наложит, а второй словит неожиданный пиздец. Изоляция, мать её!