Chrome headless in Docker 未知错误

Chrome headless in Docker Unknown error

我想 运行 Docker 容器内的无头 chrome 使用 selenium 和 webdriver 与 nodejs。我已经创建了一个安装了所有东西的容器,虽然我可以在里面启动一个无头 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)

也可以看到完整代码here

我的Docker文件是这样的

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 world

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 中阅读了关于 运行ning chrome 的特殊性的不同文章,但似乎有些东西阻止我的网络驱动程序工作。

我已经填写了一个 issue in the webdriver project 来跟踪这个问题。

Selenium 分发 "standalone" Chrome Docker container (Firefox too) 使用 Selenium 独立 java 服务器。 您可以在后台 运行 这些,然后通过您的 webdriver 测试连接到它们。

任何 webdriver 库都可以连接(如 https://webdriver.io),您无需担心启动浏览器的底层细节。

Selenium Chrome docker image is also debian based but it includes some extended chrome and webdriver config

问题是传递 chrome 参数。它是一个数组,应该像在 CLI 中那样以这种方式传递

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

此后错误不再显示。