Ответ
Да, работа с cookies — это стандартная задача в автоматизированном тестировании веб-приложений и API. Cookies используются для эмуляции состояния пользовательской сессии, авторизации, сохранения предпочтений и отслеживания поведения.
Основные сценарии использования cookies в тестах:
- Авторизация и аутентификация: Сохранение сессионного токена после логина для последующих запросов.
- Тестирование персонализации: Проверка работы функций, зависящих от пользовательских настроек, сохраненных в cookies.
- Валидация безопасности: Проверка флагов
HttpOnly,Secure,SameSite. - Тестирование истечения сессии: Валидация работы приложения после истечения срока жизни 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+ 🔞
Слушай, ну вот тебе про кукисы, как они в тестах работают, это же, блядь, основа основ! Без них ты как без штанов на морозе — нихуя не протестируешь, если пользователь должен быть залогинен. Это ж сессия, авторизация, всякие предпочтения пользователя — всё в этих маленьких, ёбта, печеньках сидит.
Зачем они вообще нужны, эти куки, в тестах-то?
- Чтоб зайти под юзером. Ну логично же: залогинился, сервер тебе в ответ сунул в заголовки
Set-Cookieс каким-нибудьsession_id, и ты его потом, как пропуск, ко всем следующим запросам прикладываешь. Без него — хуй тебе, а не доступ к личному кабинету. - Проверить, что персонализация работает. Ну там, язык сайта сменил — в куку
locale=ru_RUзаписались. Перезагрузил страницу — а она, сука, опять на английском. Вот это и лови. - Безопасность пощупать. А cookie-то
HttpOnlyстоит? Чтобы JS её не украл? АSecureфлаг есть, чтобы только по HTTPS ходила? АSameSiteнастроен, чтобы тебя не подставили? Это всё проверять надо, а то потом удивляемся, откуда утечки. - Сессию убить. Поигрался с
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. Бесценная штука. - Логи в самом фреймворке. Выводи в консоль все куки, которые получаешь и отправляешь. Глазами посмотреть — часто всё сразу ясно становится.
В общем, куки — это не просто печеньки, это, блядь, документы. Без них в системе — ты аноним, бомж цифровой. А с правильными куками — свой в доску. Тестируй это дело тщательно.