簡體   English   中英

Docker Unknown錯誤中的Chrome無頭

[英]Chrome headless in Docker Unknown error

我想使用selenium和帶有nodejs的webdriver在Docker容器中運行無頭chrome。 我已經創建了一個安裝了所有內容的容器,而我可以在內部啟動無頭鍍鉻,成功啟動nodejs webdriver測試后會在一段時間后崩潰。

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)

這里也可以看到完整的代碼。

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

我嘗試了幾個版本,但它總是或多或少相同。

我有asp npm依賴項

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

我的代碼就是這種在我的普通計算機上運行順暢的hello世界

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

最后我運行一切

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

怎么了? 我不知道如何獲得更多的日志細節。 我閱讀了有關在docker中運行chrome的特殊性的不同文章,但似乎有些東西阻止我的webdriver工作。

在webdriver項目中填寫了一個問題來跟蹤這個問題。

問題是傳遞chrome參數。 它是一個數組,應該像在CLI中那樣以這種方式傳遞

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

之后,錯誤不再顯示。

Selenium發布了一個使用Selenium獨立Java服務器的“獨立”Chrome Docker容器 (也是Firefox )。 您可以在后台運行它們,然后使用webdriver測試連接它們。

任何webdriver庫都可以連接(如https://webdriver.io ),而不必擔心啟動瀏覽器的低級細節。

Selenium Chrome docker鏡像也是基於debian的,但它包含一些擴展的chrome和webdriver 配置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM