Playwright Python — справочникНа главный сайт

Что такое браузерный контекст?

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()