Эмуляция устройств
Мобильные устройства, viewport, геолокация, цветовая схема и другие параметры эмуляции
Обзор
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)
Использование профиля устройства
Профили устройств передаются в 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_factor | DPI экрана (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" | Смартфон Android | 393 x 851 |
"Pixel 7" | Смартфон Android | 412 x 915 |
"Galaxy S24" | Смартфон Android | 384 x 854 |
"Galaxy Tab S9" | Планшет Android | 1280 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()