web-dev-qa-db-fra.com

Capybara sans tête chrome dans le docker renvoie le fichier DevToolsActivePort n'existe pas

Im essayant de configurer les tests système pour fonctionner avec sans tête chrome dans Selenium. J'ai la configuration de capybara suivante:

# spec/support/capybara.rb

Capybara.server = :puma, { Silent: true }

RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :rack_test
  end

  config.before(:each, type: :system, js: true) do
    driven_by :Selenium_chrome_headless, screen_size: [1400, 1400]
  end
end

et le Dockerfile suivant (pas de base de données car j'utilise l'hôte pour cela):

FROM Ruby:2.5.1

RUN apt-get update
RUN apt-get install -y wget git

# Node
RUN curl -sL https://deb.nodesource.com/setup_9.x | bash -
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update

# Essentials
RUN apt-get install -y git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev software-properties-common libffi-dev nodejs yarn unzip

# Chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
    && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list
RUN apt-get update && apt-get -y install google-chrome-stable

# Chromedriver
RUN wget -q https://chromedriver.storage.googleapis.com/2.39/chromedriver_linux64.Zip
RUN unzip chromedriver_linux64.Zip -d /usr/local/bin
RUN rm -f chromedriver_linux64.Zip

RUN apt-get clean

J'ai suivi plusieurs sources en ligne sur la façon de configurer les tests headless_chrome, mais ils reviennent tous à la configuration ci-dessus. En essayant d'exécuter capybara, il affiche l'erreur suivante et je n'arrive pas à le déboguer avec succès.

Selenium::WebDriver::Error::UnknownError:
    unknown error: DevToolsActivePort file doesn't exist
        (Driver info: chromedriver=2.39.562737 (dba483cee6a5f15e2e2d73df16968ab10b38a2bf),platform=Linux 4.16.11-1-Arch x86_64)

Le fichier docker ci-dessus contient les dernières versions chrome et chromedriver, respectivement 67 et 2.39. J'ai également essayé des versions plus anciennes avec la même erreur ci-dessus, par exemple 66 et 2.38, en respectant le support de version sur http://chromedriver.chromium.org/downloads .

Quelqu'un a-t-il déjà vu cette erreur?

14
user1213904

Il semble que les paramètres Selenium_chrome_headless par défaut de capybara ne soient pas suffisants pour fonctionner dans un conteneur Docker. Je l'ai résolu en modifiant mes paramètres spec/support/capybara.rb comme suit:

# spec/support/capybara.rb

# Setup chrome headless driver
Capybara.server = :puma, { Silent: true }

Capybara.register_driver :chrome_headless do |app|
  options = ::Selenium::WebDriver::Chrome::Options.new

  options.add_argument('--headless')
  options.add_argument('--no-sandbox')
  options.add_argument('--disable-dev-shm-usage')
  options.add_argument('--window-size=1400,1400')

  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end

Capybara.javascript_driver = :chrome_headless

# Setup rspec
RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :rack_test
  end

  config.before(:each, type: :system, js: true) do
    driven_by :chrome_headless
  end
end

En particulier, "--disable-dev-shm-usage" ne doit pas être oublié, car il résout des problèmes de ressources limitées dans Docker, comme indiqué dans: https://github.com/GoogleChrome/puppeteer/issues/1834

Edit: Je n'ai apporté aucune modification au Dockerfile ci-dessus

22
user1213904