Что такое Selenium Grid?

Selenium Grid позволяет запускать тесты на нескольких машинах (нодах) параллельно, в разных браузерах и ОС. Вместо последовательного запуска 100 тестов на одной машине (2 часа) можно распределить их на 10 нодов параллельно (12 минут).

Зачем нужен Grid

Без GridС Grid
1 браузер за разНесколько браузеров одновременно
Последовательное выполнениеПараллельное выполнение
Одна ОСНесколько ОС
100 тестов × 2 мин = 200 мин100 тестов ÷ 10 нодов = 20 мин

Архитектура Selenium Grid 4

┌─────────────────────────────────────┐
│           Selenium Grid             │
│  ┌──────────┐  ┌──────────────┐    │
│  │  Router   │  │  Distributor │    │
│  └────┬─────┘  └──────┬───────┘    │
│  ┌────┴─────┐  ┌──────┴───────┐    │
│  │  Session  │  │   Node       │    │
│  │  Map      │  │   Manager    │    │
│  └──────────┘  └──────────────┘    │
└─────────────────────────────────────┘
         │              │
    ┌────┴────┐   ┌────┴────┐
    │  Node 1 │   │  Node 2 │
    │ Chrome  │   │ Firefox │
    └─────────┘   └─────────┘

Компоненты:

  • Router — точка входа, принимает WebDriver-запросы
  • Distributor — назначает сессии доступным нодам
  • Session Map — отслеживает, какой Node владеет какой сессией
  • Node — запускает браузеры и выполняет тесты

Настройка Selenium Grid

Standalone-режим (одна машина)

java -jar selenium-server-4.18.0.jar standalone

Grid доступен на http://localhost:4444.

Режим Hub и Node (несколько машин)

# На машине hub
java -jar selenium-server-4.18.0.jar hub

# На машине-ноде
java -jar selenium-server-4.18.0.jar node --hub http://hub-ip:4444

Подключение тестов к Grid

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.browser_version = "latest"

driver = webdriver.Remote(
    command_executor="http://localhost:4444",
    options=options
)

driver.get("https://app.example.com")
driver.quit()

Selenium Grid на Docker

Docker — рекомендуемый способ запуска Selenium Grid.

Настройка Docker Compose

version: "3"
services:
  selenium-hub:
    image: selenium/hub:4.18.0
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4444:4444"

  chrome-node:
    image: selenium/node-chrome:4.18.0
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_MAX_SESSIONS=4
    deploy:
      replicas: 2

  firefox-node:
    image: selenium/node-firefox:4.18.0
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
docker compose up -d
docker compose up -d --scale chrome-node=5
open http://localhost:4444/ui

Параллельное выполнение тестов

pytest (Python)

pip install pytest-xdist
pytest tests/ -n 4  # 4 параллельных воркера

WebdriverIO (JavaScript)

exports.config = {
  maxInstances: 10,
  capabilities: [
    { browserName: 'chrome', maxInstances: 5 },
    { browserName: 'firefox', maxInstances: 3 },
  ],
};

Облачные провайдеры Grid

ПровайдерБраузерыРеальные устройстваЦена
BrowserStack3 000+ДаОт $29/мес
Sauce Labs2 000+ДаОт $39/мес
LambdaTest3 000+ДаОт $15/мес

Интеграция с BrowserStack

options = webdriver.ChromeOptions()
options.set_capability('bstack:options', {
    'os': 'Windows',
    'osVersion': '11',
    'browserVersion': 'latest',
    'projectName': 'E-Commerce Tests',
})

driver = webdriver.Remote(
    command_executor=f'https://{USERNAME}:{ACCESS_KEY}@hub-cloud.browserstack.com/wd/hub',
    options=options
)

Мониторинг и отладка Grid

Dashboard UI

Откройте http://localhost:4444/ui для просмотра: подключённых нодов, активных сессий, длины очереди, состояния здоровья.

Запись видео

chrome-node:
  image: selenium/node-chrome:4.18.0
  volumes:
    - ./videos:/opt/selenium/assets
  environment:
    - SE_RECORD_VIDEO=true

Упражнение: Настройте Selenium Grid

  1. Создайте Docker Compose с Hub, 2 нодами Chrome, 1 нодом Firefox
  2. Запустите grid и проверьте, что все ноды видны в дашборде
  3. Модифицируйте тест для использования RemoteWebDriver с подключением к grid
  4. Запустите один тест в Chrome и Firefox через capabilities
  5. Запустите тесты параллельно через pytest-xdist
  6. Сравните время выполнения: последовательно vs параллельно

Ключевые выводы

  • Selenium Grid обеспечивает параллельное, распределённое выполнение тестов
  • Docker Compose — простейший способ настроить и управлять Grid
  • Grid 4 имеет модернизированную архитектуру с Router, Distributor, Session Map и Nodes
  • Облачные провайдеры предлагают управляемые grid для корпоративного масштаба
  • Параллельное выполнение может сократить время suite на 80-90%
  • Всегда мониторьте здоровье Grid через встроенный дашборд