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

Официальный Docker-образ

Microsoft публикует официальные Docker-образы Playwright в реестре mcr.microsoft.com/playwright. Образы включают все браузеры, их системные зависимости и Python.

# Pull образа с Python
docker pull mcr.microsoft.com/playwright/python:v1.61.0-noble

# Просмотр тегов
docker pull mcr.microsoft.com/playwright/python:latest

# Запуск интерактивной сессии
docker run -it --rm --ipc=host \
  mcr.microsoft.com/playwright/python:v1.61.0-noble /bin/bash

Базовые образы: Playwright использует Ubuntu Noble (24.04). Образы доступны для Node.js (playwright), Python (playwright/python) и Java (playwright/java).

Запуск контейнера: ключевые флаги

  • --ipc=host — отключает изоляцию IPC. Предотвращает нехватку памяти (OOM) в Chromium при множестве открытых страниц.
  • --init — запускает init-процесс (tini) для корректной обработки zombie-процессов.
  • --user pwuser — запуск от непривилегированного пользователя (безопасность).
  • --security-opt seccomp=seccomp_profile.json — кастомный seccomp-профиль для доступа к untrusted-сайтам.
# Запуск с --ipc=host и --init
docker run -it --rm --ipc=host --init \
  mcr.microsoft.com/playwright/python:v1.61.0-noble /bin/bash

# Запуск от пользователя pwuser
docker run -it --rm --ipc=host --user pwuser \
  mcr.microsoft.com/playwright/python:v1.61.0-noble pytest tests/

Playwright Server (удалённые браузеры)

Playwright может запускаться в режиме сервера, предоставляя доступ к браузерам по WebSocket. Это позволяет отделить тесты от браузеров.

# Запуск сервера на порту 5555
npx playwright run-server --port 5555

# Docker: запуск сервера в контейнере
docker run -d --rm --ipc=host --name pw-server -p 5555:5555 \
  mcr.microsoft.com/playwright/python:v1.61.0-noble \
  npx playwright run-server --port 5555

# Подключение к серверу из тестов
from playwright.sync_api import sync_playwright

with sync_playwright() as pw:
    browser = pw.chromium.connect("ws://localhost:5555/playwright/chromium")
    page = browser.new_page()
    page.goto("https://example.com")
    print(page.title())
    browser.close()

Кастомный Dockerfile

Если вам нужно добавить свои зависимости поверх официального образа:

FROM mcr.microsoft.com/playwright/python:v1.61.0-noble

WORKDIR /app

# Копирование зависимостей и установка
COPY requirements.txt .
RUN pip install -r requirements.txt

# Копирование тестов
COPY tests/ ./tests/

# Запуск тестов
CMD ["pytest", "-v", "--tb=short"]
# Сборка образа
docker build -t my-playwright-tests .

# Запуск
docker run --rm --ipc=host my-playwright-tests

Совет: Если вам не нужны все браузеры (например, только Chromium), можно сократить размер образа, установив только нужный браузер: playwright install chromium.

Docker Compose

Пример docker-compose.yml с сервером Playwright и тестовым сервисом:

version: "3.9"

services:
  playwright-server:
    image: mcr.microsoft.com/playwright/python:v1.61.0-noble
    container_name: pw-server
    ipc: host
    ports:
      - "5555:5555"
    command: npx playwright run-server --port 5555

  tests:
    build: .
    container_name: pw-tests
    ipc: host
    depends_on:
      - playwright-server
    environment:
      - PLAYWRIGHT_WS_ENDPOINT=ws://playwright-server:5555/playwright/chromium
    command: pytest -v --base-url=http://web:8000

noVNC для GitHub Codespaces

Playwright поддерживает noVNC для просмотра браузера в реальном времени из GitHub Codespaces. Это полезно для отладки.

# В .devcontainer/devcontainer.json или Dockerfile
# Включение noVNC и VNC-сервера

docker run -it --rm --ipc=host -p 6080:6080 \
  -e DISPLAY=:99 \
  mcr.microsoft.com/playwright/python:v1.61.0-noble \
  /bin/bash -c "Xvfb :99 && x11vnc -display :99 -forever && pytest"

Внимание: Без флага --ipc=host Chromium может аварийно завершаться с ошибкой Navigation failed because browser has disconnected при открытии множества вкладок. Всегда добавляйте --ipc=host для production-нагрузки.

Seccomp-профиль для untrusted-сайтов

Если тесты посещают потенциально опасные (untrusted) сайты, используйте кастомный seccomp-профиль.

# Скачать профиль
wget https://raw.githubusercontent.com/microsoft/playwright/main/utils/docker/seccomp_profile.json

# Запуск с профилем
docker run --rm --ipc=host \
  --security-opt seccomp=seccomp_profile.json \
  mcr.microsoft.com/playwright/python:v1.61.0-noble pytest

Запуск тестов внутри контейнера

Полный пример команды для запуска тестов с монтированием локальной директории:

docker run --rm --ipc=host \
  -v "$(pwd)":/app \
  -w /app \
  mcr.microsoft.com/playwright/python:v1.61.0-noble \
  bash -c "pip install -r requirements.txt && pytest --trace=on"