2017-09-02 13 views
3

nodejsを持つSeleniumとwebdriverを使用してDockerコンテナ内にヘッドレスクロムを実行したいとします。私はすべてのものがインストールされたコンテナを作成しましたが、ヘッドレスのクロムを起動して、nodejs Webdriverテストを起動すると、しばらくしてからクラッシュすることがありました。DockerのChromeヘッドレス不明のエラー

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) 

完全コードは、hereでも見られる。

マイDockerfileこの

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"] 

のようなもので、私はいくつかのバージョンを試してみましたが、それは常に、多かれ少なかれ同じです。私は

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

そして、私のコードは最後に私が

docker run --rm --cap-add=SYS_ADMIN headless 
ですべてを実行

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(); 

私の通常のコンピュータでスムーズな作品世界ハローのこの種である必要があり

のAsp NPMの依存関係

何が起こっていますか?私はログの詳細をもっと得る方法も知らない。私はドッカーでクロムを実行するための特殊性について別の記事を読んでいますが、私のウェブドライバが動作するのを妨げるものがあるようです。

この問題を追跡するためにissue in the webdriver projectと記入しました。

答えて

1

問題は、クロムの引数を渡しています。これは配列なので、CLIのようにこの方法で渡す必要があります。

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

その後エラーは表示されなくなりました。

0

Seleniumは、SeleniumスタンドアロンJavaサーバーを使用する"standalone" Chrome Docker containerFirefox too)を配布しています。 これらはバックグラウンドで実行し、Webdriverテストでそれらに接続できます。

ブラウザを起動する際の低レベルの詳細を心配することなく、任意のウェブドライブライブラリ(https://webdriver.ioなど)を接続することができます。

Selenium Chrome docker imageもデビアンベースですが、一部にはchromeとwebdriver configが含まれています。

+0

私の質問は、スタンドアロンJavaサーバーではなく、コンテナ内のノードからwebdriverを使用することです。いずれにしてもスタンドアロンイメージで同じエラーが発生しています。それはdebianをベースにしていませんが、古いノードのバージョンに付属しているUbuntu16.04ので、スクリプトでノードをインストールする必要があります。 – guillem