2017-09-02 3 views
3

Je souhaite exécuter un chrome sans tête à l'intérieur d'un conteneur Docker à l'aide de sélénium et de webdriver avec nodejs. J'ai créé un conteneur avec tout installé et pendant que je peux lancer un chrome sans tête à l'intérieur de lancer avec succès un test de nodejs webdriver se bloque toujours après un certain temps.Chrome sans tête dans Docker Erreur inconnue

WebDriverError: unknown error: Chrome failed to start: exited abnormally 
    (Driver info: chromedriver=2.32.498513 (2c63aa53b2c658de596ed550eb5267ec5967b351),platform=Linux 4.9.41-moby x86_64) 
    at WebDriverError (/usr/src/app/node_modules/selenium-webdriver/lib/error.js:27:5) 
    at Object.checkLegacyResponse (/usr/src/app/node_modules/selenium-webdriver/lib/error.js:529:15) 
    at parseHttpResponse (/usr/src/app/node_modules/selenium-webdriver/lib/http.js:509:13) 
    at doSend.then.response (/usr/src/app/node_modules/selenium-webdriver/lib/http.js:441:30) 
    at process._tickCallback (internal/process/next_tick.js:109:7) 
From: Task: WebDriver.createSession() 
    at Function.createSession (/usr/src/app/node_modules/selenium-webdriver/lib/webdriver.js:769:24) 
    at Function.createSession (/usr/src/app/node_modules/selenium-webdriver/chrome.js:761:15) 
    at createDriver (/usr/src/app/node_modules/selenium-webdriver/index.js:170:33) 
    at Builder.build (/usr/src/app/node_modules/selenium-webdriver/index.js:642:16) 
    at Object.<anonymous> (/usr/src/app/selenium.js:19:4) 
    at Module._compile (module.js:570:32) 
    at Object.Module._extensions..js (module.js:579:10) 
    at Module.load (module.js:487:32) 
    at tryModuleLoad (module.js:446:12) 
    at Function.Module._load (module.js:438:3) 

code complet peut être vu here aussi.

Mon Dockerfile est quelque chose comme ça

FROM debian:sid 

# Install deps + add Chrome Stable + purge all the things 
RUN apt-get update && apt-get install -y \ 
    apt-transport-https \ 
    ca-certificates \ 
    curl unzip \ 
    gnupg \ 
    --no-install-recommends \ 
    && curl -sSL https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \ 
    && echo "deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list \ 
    && apt-get update && apt-get install -y \ 
    nodejs npm google-chrome-stable \ 
    --no-install-recommends \ 
    && apt-get purge --auto-remove -y gnupg \ 
    && rm -rf /var/lib/apt/lists/* 

# Add Chrome as a user 
RUN groupadd -r chrome && useradd -r -g chrome -G audio,video chrome \ 
    && mkdir -p /home/chrome && chown -R chrome:chrome /home/chrome 

# Add app and install dependencies 
WORKDIR /usr/src/app 
RUN chown -R chrome: /usr/src/app 
USER chrome 
COPY . . 
RUN npm install 

ENV DBUS_SESSION_BUS_ADDRESS=/dev/null 

CMD ["node", "selenium.js"] 

J'ai essayé plusieurs versions mais il est toujours plus ou moins la même chose.

Asp dépendances NPM j'ai

"chromedriver": "^2.32.0", 
"selenium-webdriver": "^3.5.0" 

Et mon code est ce genre de Bonjour tout le monde qui fonctionne en douceur dans mon ordinateur régulier

const fs = require('fs'); 
const webdriver = require('selenium-webdriver'); 
const chromedriver = require('chromedriver'); 

// const PATH_TO_CHROME = 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe'; 
const PATH_TO_CHROME = '/usr/bin/google-chrome'; 

const chromeCapabilities = webdriver.Capabilities.chrome(); 
chromeCapabilities.set('chromeOptions', { 
    binary: PATH_TO_CHROME, 
    'args': [ 
    '--headless --window-size=800,600 --disable-gpu', 
    ] 
}); 

const driver = new webdriver.Builder() 
    .forBrowser('chrome') 
    .withCapabilities(chromeCapabilities) 
    .build(); 

// Navigate to google.com, enter a search. 
driver.get('https://www.google.com/ncr'); 
driver.findElement({ name: 'q' }).sendKeys('webdriver', webdriver.Key.RETURN); 
driver.wait(webdriver.until.titleIs('webdriver - Google Search'), 1000); 

// Take screenshot of results page. Save to disk. 
driver.takeScreenshot().then(base64png => { 
    fs.writeFileSync('screenshot.png', new Buffer(base64png, 'base64')); 
}); 

driver.quit(); 

Enfin je cours tout avec

docker run --rm --cap-add=SYS_ADMIN headless 

Que se passe-t-il? Je ne sais pas comment obtenir plus de détails de journal aussi. J'ai lu différents articles sur les particularités de l'exécution de chrome dans docker mais il semble y avoir quelque chose qui empêche mon pilote web de fonctionner.

J'ai rempli un issue in the webdriver project pour suivre ce problème.

Répondre

1

Le problème est de transmettre les arguments chrome. Il est un tableau et doit être transmis de cette façon plutôt que dans le CLI

chromeCapabilities.set('chromeOptions', { 
    binary: PATH_TO_CHROME, 
    'args': [ 
     '--headless', '--verbose', '--window-size=1920,1080', '--ignore-certificate-errors' 
    ] 
    }); 

Après que l'erreur n'apparaît pas plus.

0

Le sélénium distribue un "standalone" Chrome Docker container (Firefox too) qui utilise le serveur Java autonome Selenium. Vous pouvez les exécuter en arrière-plan, puis vous y connecter avec vos tests webdriver.

Toute bibliothèque webdriver sera en mesure de se connecter (comme https://webdriver.io) sans que vous ayez à vous soucier des détails de bas niveau pour lancer les navigateurs.

Le Selenium Chrome docker image est également basé sur Debian, mais il inclut quelques extensions chrome et un pilote web config.

+0

Ma question concerne l'utilisation de webdriver à partir du noeud à l'intérieur du conteneur plutôt que du serveur Java autonome. De toute façon la même erreur se produit avec l'image autonome. Il n'est pas basé sur debian mais sur Ubuntu16.04 qui est venu avec une ancienne version de noeud donc vous devez installer un noeud avec un script. – guillem