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?
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