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, default: true)- Авторитетний перемикач для використання. Якщо
false
, виконавець ніколи не використовує Xvfb. - Якщо
true
, виконавець може використовувати Xvfb за потреби.
- Авторитетний перемикач для використання. Якщо
-
xvfbAutoInstall
(boolean, default: false)- Увімкнути автоматичне встановлення
xvfb-run
, якщо його немає - Коли false, виконавець попередить і продовжить роботу без встановлення
- Увімкнути автоматичне встановлення
-
xvfbAutoInstallMode
('root' | 'sudo', default: 'sudo')- 'root': встановлювати лише якщо запущено як root (без sudo)
- 'sudo': дозволити неінтерактивний sudo (
sudo -n
), якщо не root; пропустити, якщо sudo відсутній
-
xvfbAutoInstallCommand
(string | string[], optional)- Користувацька команда для встановлення замість вбудованого визначення менеджера пакетів
- Коли надано, ця команда виконується як є і замінює вбудовану логіку встановлення
-
xvfbMaxRetries
(number, default: 3)- Кількість спроб повтору при збоях процесу xvfb.
- Корисно для нестабільних середовищ CI, де запуск Xvfb може іноді не вдаватися.
-
xvfbRetryDelay
(number, default: 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'] }
}]
}