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'] }
}]
}