Headless и Xvfb с Testrunner
На этой странице объясняется, к ак тестраннер WebdriverIO поддерживает безголовое выполнение на Linux с использованием Xvfb (X Virtual Framebuffer). Она охватывает случаи, когда Xvfb полезен, как его настроить и как он ведет себя в CI и Docker.
Когда использовать Xvfb или нативный headless режим
- Используйте нативный headless режим (например, Chrome
--headless=...
), когда это возможно, для минимальных накладных расходов. - Используйте Xvfb, когда:
- Тестируете Electron или приложения, которые требуют оконного менеджера или среды рабочего стола
- Вы полагаетесь на GLX или поведение, зависящее от оконного менеджера
- Ваши инструменты ожидают наличия сервера дисплея (
DISPLAY
) - Вы сталкиваетесь с ошибками Chromium, такими как:
session not created: probably user data directory is already in use ...
Chrome failed to start: exited abnormally. (DevToolsActivePort file doesn't exist)
Ошибка коллизии директории пользовательских данных может вводить в заблуждение, так как часто является результатом сбоя браузера и немедленного перезапуска, который повторно использует ту же директорию профиля от предыдущего экземпляра. Обеспечение стабильного дисплея (например, через Xvfb) часто решает эту проблему - если нет, вы должны передать уникальный--user-data-dir
для каждого воркера.
Конфигурация
Четыре опции раннера контролируют поведение Xvfb:
-
autoXvfb
(boolean, по умолчанию: true)- Авторитетный переключатель для использования. Если
false
, раннер никогда не использует Xvfb. - Если
true
, раннер может использовать Xvfb при необходимости.
- Авторитетный переключатель для использования. Если
-
xvfbAutoInstall
(boolean, по умолчанию: false)- Включает автоматическую установку
xvfb-run
, если она отсутствует - При значении false, раннер предупредит и продолжит работу без установки
- Включает автоматическую установку
-
xvfbAutoInstallMode
('root' | 'sudo', по умолчанию: 'sudo')- 'root': устанавливать то лько если запущен от имени root (без sudo)
- 'sudo': разрешить неинтерактивный sudo (
sudo -n
), если не root; пропустить, если sudo отсутствует
-
xvfbAutoInstallCommand
(string | string[], опционально)- Пользовательская команда для установки вместо встроенного определения менеджера пакетов
- При указании эта команда выполняется как есть и переопределяет встроенную логику установки
-
xvfbMaxRetries
(number, по умолчанию: 3)- Количество попыток повторных попыток при сбоях процесса xvfb.
- Полезно для нестабильных сред CI, где запуск Xvfb может иногда не удаваться.
-
xvfbRetryDelay
(number, по умолчанию: 1000)- Базовая задержка между повторными попытками в миллисекундах при сбоях процесса xvfb.
- Использует прогрессивную задержку: задержка × номер попытки (например, 1000мс, 2000мс, 3000мс и т.д.).
Примеры:
export const config: WebdriverIO.Config = {
// Использовать Xvfb при необходимости
autoXvfb: true,
// Автоматически устанавливать пакеты Xvfb с использованием sudo
xvfbAutoInstall: true,
xvfbAutoInstallMode: 'sudo',
capabilities: [{
browserName: 'chrome',
'goog:chromeOptions': { args: ['--headless=new', '--no-sandbox'] }
}]
}
export const config: WebdriverIO.Config = {
// Использовать Xvfb при необходимости
autoXvfb: true,
// Автоматически устанавливать пакеты Xvfb с использованием пользовательской команды и sudo
xvfbAutoInstall: true,
xvfbAutoInstallMode: 'sudo',
xvfbAutoInstallCommand: 'curl -L https://github.com/X11/xvfb/releases/download/v1.20.14/xvfb-linux-x64.tar.gz | tar -xz -C /usr/local/bin/',
capabilities: [{
browserName: 'chrome',
'goog:chromeOptions': { args: ['--headless=new', '--no-sandbox'] }
}]
}
export const config: WebdriverIO.Config = {
// Использовать Xvfb при необходимости
autoXvfb: true,
// Автоматически устанавливать пакеты Xvfb с использованием sudo
xvfbAutoInstall: true,
xvfbAutoInstallMode: 'sudo',
// Настроить поведение повторных попыток для нестабильных сред CI
xvfbMaxRetries: 5,
xvfbRetryDelay: 1500,
capabilities: [{
browserName: 'chrome',
'goog:chromeOptions': { args: ['--headless=new', '--no-sandbox'] }
}]
}