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

Обзор

Playwright позволяет эмулировать мобильные устройства, различные разрешения экрана, часовые пояса, геолокацию и многое другое. Это делает тестирование адаптивных и мобильных версий сайта максимально реалистичным без физических устройств.

Встроенные устройства — playwright.devices

Playwright содержит предустановленные профили популярных устройств. Словарь playwright.devices содержит настройки для каждого устройства.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    # Вывести все доступные устройства
    for name in p.devices:
        print(name)
Примечание: Список устройств насчитывает более 80 профилей, включая iPhone, iPad, Samsung Galaxy, Pixel, Nokia, BlackBerry, Kindle и многие другие.

Использование профиля устройства

Профили устройств передаются в browser.new_context() через распаковку словаря:

context = browser.new_context(**p.devices["iPhone 13"])
page = context.new_page()
page.goto("https://example.com")

То же самое для Android:

context = browser.new_context(**p.devices["Pixel 5"])

Кастомный viewport

Если встроенные устройства не подходят, укажите свой viewport вручную:

context = browser.new_context(
    viewport={"width": 1280, "height": 720}
)

Параметры эмуляции

ПараметрОписаниеПример
viewportРазмер окна в пикселях{"width": 390, "height": 844}
device_scale_factorDPI экрана (2, 3 и т.д.)3
is_mobileМобильный режимTrue
has_touchЭмуляция тач-событийTrue
user_agentКастомный User-Agent"Mozilla/5.0 ..."
localeЯзык и регион"de-DE"
timezone_idЧасовой пояс"Europe/Berlin"
geolocationГеопозиция{"latitude": 55.75, "longitude": 37.62}
permissionsРазрешения["geolocation"]
color_schemeЦветовая схема"dark"
extra_http_headersДополнительные заголовки{"X-Custom": "value"}
offlineЭмуляция офлайнTrue

Пример: полная эмуляция Pixel 5

context = browser.new_context(
    viewport={"width": 393, "height": 851},
    device_scale_factor=2.75,
    is_mobile=True,
    has_touch=True,
    user_agent="Mozilla/5.0 (Linux; Android 12; Pixel 5) ...",
    locale="ru-RU",
    timezone_id="Europe/Moscow",
    geolocation={"latitude": 55.75, "longitude": 37.62},
    permissions=["geolocation"],
    color_scheme="dark",
    extra_http_headers={"X-Device": "Pixel 5"},
    offline=False
)

Локаль и часовой пояс

Изменение локали влияет на формат дат, чисел и язык интерфейса сайта:

context = browser.new_context(
    locale="de-DE",
    timezone_id="Europe/Berlin"
)
Совет: Комбинация locale и timezone_id позволяет тестировать интернационализацию (i18n) без реального перемещения между регионами.

Геолокация и разрешения

Установите геопозицию при создании контекста:

context = browser.new_context(
    geolocation={"latitude": 55.75, "longitude": 37.62},
    permissions=["geolocation"]
)

Динамическое изменение через методы контекста:

# Изменить геопозицию
context.set_geolocation(
    geolocation={"latitude": 59.93, "longitude": 30.31}
)

# Выдать дополнительные разрешения
context.grant_permissions(["notifications"])

# Отозвать все разрешения
context.clear_permissions()

Цветовая схема (dark/light)

# Темная тема
context = browser.new_context(color_scheme="dark")

# Светлая тема
context = browser.new_context(color_scheme="light")

Эмуляция офлайн-режима

context = browser.new_context(offline=True)
page = context.new_page()
page.goto("https://example.com")  # упадет с ошибкой сети

Кастомные заголовки

context = browser.new_context(
    extra_http_headers={
        "X-Forwarded-For": "192.168.1.1",
        "X-Device-Type": "mobile"
    }
)

Популярные устройства

НазваниеТипРазмер экрана
"iPhone 13"Смартфон390 x 844
"iPhone 13 Pro Max"Смартфон428 x 926
"iPhone 15"Смартфон393 x 852
"iPad Pro 11"Планшет834 x 1194
"Pixel 5"Смартфон Android393 x 851
"Pixel 7"Смартфон Android412 x 915
"Galaxy S24"Смартфон Android384 x 854
"Galaxy Tab S9"Планшет Android1280 x 800
"iPhone SE"Смартфон (малый)375 x 667
"Nexus 10"Планшет800 x 1280
# Пример: тест на нескольких устройствах
devices = ["iPhone 13", "Pixel 7", "iPad Pro 11"]

for device_name in devices:
    context = browser.new_context(**p.devices[device_name])
    page = context.new_page()
    page.goto("https://example.com")
    page.screenshot(path=f"screenshot-{device_name}.png")
    context.close()

Полный пример

from playwright.sync_api import sync_playwright

def test_device_emulation():
    with sync_playwright() as p:
        browser = p.chromium.launch()

        # Эмуляция iPhone 13
        iphone_context = browser.new_context(**p.devices["iPhone 13"])
        page = iphone_context.new_page()
        page.goto("https://example.com")
        print(page.viewport_size)  # {'width': 390, 'height': 844}
        iphone_context.close()

        # Эмуляция Galaxy S24 с кастомной локалью
        galaxy_context = browser.new_context(
            **p.devices["Galaxy S24"],
            locale="ko-KR",
            timezone_id="Asia/Seoul"
        )
        page2 = galaxy_context.new_page()
        page2.goto("https://example.com")
        galaxy_context.close()

        browser.close()

test_device_emulation()