Браузерные контексты
Изолированные сессии, настройки окружения и управление состоянием
Что такое браузерный контекст?
BrowserContext — это изолированная сессия, аналог окна в режиме инкогнито. Каждый контекст имеет собственные cookies, localStorage, историю и настройки. Страницы внутри одного контекста разделяют эти данные, но контексты полностью изолированы друг от друга.
Создание контекста
Метод browser.new_context() создаёт новый контекст:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context()
page = context.new_page()
page.goto("https://example.com")
Настройки контекста
При создании контекста можно передать множество параметров:
| Параметр | Описание |
|---|---|
viewport | Размер окна: {"width": 1280, "height": 720} |
user_agent | Строка User-Agent |
locale | Локаль, напр. "ru-RU" |
timezone_id | Часовой пояс, напр. "Europe/Moscow" |
geolocation | Геолокация: {"latitude": 55.75, "longitude": 37.61} |
permissions | Список разрешений: ["geolocation", "notifications"] |
color_scheme | "light" или "dark" |
device_scale_factor | Коэффициент масштабирования (DPR) |
http_credentials | Учётные данные для HTTP-аутентификации |
proxy | Прокси для контекста |
Пример с настройками
context = browser.new_context(
viewport={"width": 1920, "height": 1080},
locale="ru-RU",
timezone_id="Europe/Moscow",
geolocation={"latitude": 55.75, "longitude": 37.61},
permissions=["geolocation"],
color_scheme="light"
)
Управление cookies
# Получить все cookies
cookies = context.cookies()
# Добавить cookie
context.add_cookies([
{"name": "session_id", "value": "abc123", "url": "https://example.com"}
])
# Очистить все cookies
context.clear_cookies()
Сохранение и восстановление состояния
Метод storage_state() экспортирует cookies и localStorage:
# Сохранить состояние
state = context.storage_state(path="state.json")
# Восстановить в новом контексте
context = browser.new_context(storage_state="state.json")
add_init_script() — скрипты до загрузки
Позволяет выполнить JavaScript перед загрузкой любой страницы в контексте:
context.add_init_script("""
Object.defineProperty(navigator, 'webdriver', {get: () => undefined});
""")
Перехват запросов (context.route)
context.route() перехватывает все запросы из любого окна контекста:
context.route("**/*.png", lambda route: route.abort())
context.route("**/api/**", lambda route: route.fulfill(
status=200,
content_type="application/json",
body='{"ok": true}'
))
HTTP-заголовки для всех запросов
context.set_extra_http_headers({
"Authorization": "Bearer token123"
})
Разрешения
# Выдать разрешения
context.grant_permissions(["notifications", "geolocation"])
# Отозвать все разрешения
context.clear_permissions()
События контекста
def on_page(page):
print(f"Новая страница: {page.url}")
context.on("page", on_page)
def on_request(request):
print(f"Запрос: {request.url}")
context.on("request", on_request)
context.on("response", lambda resp: print(f"Ответ: {resp.status}"))
context.pages и context.close()
for page in context.pages:
print(page.title())
context.close() # закрывает контекст и все его страницы
Пример: два контекста с разными логинами
with sync_playwright() as p:
browser = p.chromium.launch()
# Контекст для пользователя A
ctx_a = browser.new_context(storage_state="user_a.json")
page_a = ctx_a.new_page()
page_a.goto("https://example.com/dashboard")
# Контекст для пользователя B
ctx_b = browser.new_context(storage_state="user_b.json")
page_b = ctx_b.new_page()
page_b.goto("https://example.com/dashboard")
ctx_a.close()
ctx_b.close()