Headless & Xvfb med Testrunner
Denna sida förklarar hur WebdriverIO testrunner stödjer headless-körning på Linux med hjälp av Xvfb (X Virtual Framebuffer). Den beskriver när Xvfb är användbart, hur man konfigurerar det och hur det fungerar i CI och Docker.
När man ska använda Xvfb vs native headless
- Använd native headless (t.ex. Chrome
--headless=...) när det är möjligt för minimal overhead. - Använd Xvfb när:
- Du testar Electron eller appar som kräver en fönsterhanterare eller skrivbordsmiljö
- Du förlitar dig på GLX eller beteenden som är beroende av fönsterhanterare
- Dina verktyg förväntar sig en displayserver (
DISPLAY) - Du stöter på Chromium-fel som:
session not created: probably user data directory is already in use ...Chrome failed to start: exited abnormally. (DevToolsActivePort file doesn't exist)Felet med användardatakatalogkollision kan vara missvisande eftersom det ofta är resultatet av en webbläsarkrasch och omedelbar omstart som återanvänder samma profilkatalog från föregående instans. Att säkerställa en stabil display (t.ex. via Xvfb) löser ofta problemet - om inte, bör du skicka en unik--user-data-dirper worker.
Konfiguration
Fyra runner-alternativ styr Xvfb-beteendet:
-
autoXvfb(boolean, standard: true)- Avgörande växel för användning. Om
falseanvänder runnern aldrig Xvfb. - Om
truekan runnern använda Xvfb vid behov.
- Avgörande växel för användning. Om
-
xvfbAutoInstall(boolean, standard: false)- Aktivera automatisk installation av
xvfb-runom det saknas - När false kommer runnern att varna och fortsätta utan att installera
- Aktivera automatisk installation av
-
xvfbAutoInstallMode('root' | 'sudo', standard: 'sudo')- 'root': installera endast om körning sker som root (ingen sudo)
- 'sudo': tillåt icke-interaktiv sudo (
sudo -n) om inte root; hoppa över om sudo saknas
-
xvfbAutoInstallCommand(string | string[], valfritt)- Anpassat kommando att använda för installation istället för inbyggd pakethanterardetektering
- När det anges körs detta kommando som det är och åsidosätter den inbyggda installationslogiken
-
xvfbMaxRetries(number, standard: 3)- Antal återförsök för xvfb-processfel.
- Användbart för instabila CI-miljöer där Xvfb-uppstart ibland kan misslyckas.
-
xvfbRetryDelay(number, standard: 1000)- Grundfördröjning mellan återförsök i millisekunder för xvfb-processfel.
- Använder progressiv fördröjning: fördröjning × försöksnummer (t.ex. 1000ms, 2000ms, 3000ms, etc.).
Exempel:
export const config: WebdriverIO.Config = {
// Använd Xvfb vid behov
autoXvfb: true,
// Auto-installera Xvfb-paket med sudo
xvfbAutoInstall: true,
xvfbAutoInstallMode: 'sudo',
capabilities: [{
browserName: 'chrome',
'goog:chromeOptions': { args: ['--headless=new', '--no-sandbox'] }
}]
}
export const config: WebdriverIO.Config = {
// Använd Xvfb vid behov
autoXvfb: true,
// Auto-installera Xvfb-paket med ett anpassat kommando och 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 = {
// Använd Xvfb vid behov
autoXvfb: true,
// Auto-installera Xvfb-paket med sudo
xvfbAutoInstall: true,
xvfbAutoInstallMode: 'sudo',
// Konfigurera återförsöksbeteende för instabila CI-miljöer
xvfbMaxRetries: 5,
xvfbRetryDelay: 1500,
capabilities: [{
browserName: 'chrome',
'goog:chromeOptions': { args: ['--headless=new', '--no-sandbox'] }
}]
}
Detekteringslogik
-
Runnern överväger Xvfb när:
- Kör på Linux
- Ingen
DISPLAYär inställd (headless-miljö), eller headless-webbläsarflaggor skickas
-
Om
DISPLAYär inställd, tvingar inte runnern Xvfb som standard och respekterar din befintliga X-server/fönsterhanterare.
Anteckningar:
autoXvfb: falseinaktiverar Xvfb-användning helt (ingen wrapper medxvfb-run).xvfbAutoInstallpåverkar bara installation omxvfb-runsaknas; det aktiverar/inaktiverar inte användning.xvfbAutoInstallModestyr installationsmetoden: 'root' för enbart root-installationer, 'sudo' för sudo-baserade installationer (standard: 'sudo').- Inbyggda paketinstallationer är alltid icke-interaktiva. Enbart root om du inte väljer 'sudo'-läge.
- Återförsöksmekanismen använder progressiva fördröjningar:
xvfbRetryDelay × försöksnummer(t.ex. 1000ms, 2000ms, 3000ms, etc.).
Använda en befintlig DISPLAY i CI
Om din CI konfigurerar sin egen X-server/fönsterhanterare (t.ex. med Xvfb :99 och en WM), antingen:
- Behåll
autoXvfb: trueoch se till attDISPLAYexporteras; runnern kommer att respektera den och undvika wrapping. - Eller ställ in
autoXvfb: falseför att uttryckligen inaktivera allt Xvfb-beteende från runnern.