Я смог настроить Selenium::Driver
на использование :headless_chrome
и отлично выполнить свои тесты на моей локальной машине, но когда я нажимаю на gitlab, мой CI дает сбой и поднимает Selenium::WebDriver::Error: unable to connect to chromedriver 127.0.0.1:9515
. Я провел всю ночь в поисках решений для разных форумов, но безрезультатно.
В моем spec/rails_helper.rb
я поместил следующий кодовый блок в конфигурацию Rspec:
config.include Devise::Test::ControllerHelpers, type: :controller
config.include Devise::Test::ControllerHelpers, type: :view
config.include Devise::Test::IntegrationHelpers, type: :feature
options = Selenium::WebDriver::Chrome::Options.new
options.add_preference(:download, prompt_for_download: false, default_directory: '/tmp/downloads')
options.add_preference(:browser, set_download_behavior: { behavior: 'allow' })
Capybara.register_driver :chrome do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end
Capybara.register_driver :headless_chrome do |app|
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1280,800')
options.add_argument('--no-sandbox')
Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end
Capybara.javascript_driver = :headless_chrome
На этом этапемои тесты работают очень хорошо локально. Далее я настраиваю свой gitlab-ci.yml
файл, следуя этому руководству . Учебное пособие было отличным, за исключением той части, в которой мой system_test
терпит неудачу из-за указанной ошибки в chromedriver. После многих испытаний я очень растерялся и не знаю, что делать, чтобы заставить его работать.
Вот необходимые файлы из учебника, которому я следовал.
Dockerfile
FROM ruby:2.6.0
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update -qqy && apt-get install -qqyy yarn nodejs postgresql postgresql-contrib libpq-dev cmake
RUN rm -rf /var/lib/apt/lists/*
`.gitlab-ci.yml
image: "registry.gitlab.com/catch-all/catch-all-app:latest"
variables:
LC_ALL: C.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
RAILS_ENV: "test"
POSTGRES_DB: test_db
POSTGRES_USER: runner
POSTGRES_PASSWORD: ""
# cache gems and node_modules for next usage
.default-cache: &default-cache
cache:
untracked: true
key: my-project-key-5.2
paths:
- node_modules/
- vendor/
- public/
build:
<<: *default-cache
services:
- postgres:latest
stage: build
script:
- ruby -v
- node -v
- yarn --version
- which ruby
- gem install bundler --no-document
- bundle install --jobs $(nproc) "${FLAGS[@]}" --path=vendor
- yarn install
- cp config/database.yml.gitlab config/database.yml
- RAILS_ENV=test bundle exec rake db:create db:schema:load
- RAILS_ENV=test bundle exec rails assets:precompile
integration_test:
<<: *default-cache
stage: test
services:
- postgres:latest
- redis:alpine
script:
- gem install bundler --no-document
- bundle install --jobs $(nproc) "${FLAGS[@]}" --path=vendor
- cp config/database.yml.gitlab config/database.yml
- bundle install --jobs $(nproc) "${FLAGS[@]}" --path=vendor
- RAILS_ENV=test bundle exec rake db:create db:schema:load
- RAILS_ENV=test bundle exec rails assets:precompile
- bundle exec rspec spec/controllers
- bundle exec rspec spec/helpers
- bundle exec rspec spec/models
- bundle exec rspec spec/policies
system_test:
<<: *default-cache
stage: test
services:
- postgres:latest
- redis:alpine
- selenium/standalone-chrome:latest
script:
- gem install bundler --no-document
- bundle install --jobs $(nproc) "${FLAGS[@]}" --path=vendor
- cp config/database.yml.gitlab config/database.yml
- export selenium_remote_url="http://selenium__standalone-chrome:4444/wd/hub/"
- bundle install --jobs $(nproc) "${FLAGS[@]}" --path=vendor
- RAILS_ENV=test bundle exec rake db:create db:schema:load
- RAILS_ENV=test bundle exec rails assets:precompile
- bundle exec rspec spec/features
artifacts:
when: on_failure
paths:
- tmp/screenshots/
rubocop:
<<: *default-cache
stage: test
script:
- gem install bundle --no-document
- bundle install --jobs $(nproc) "${FLAGS[@]}" --path=vendor
- bundle exec rubocop
config/environments/test.rb
# Raises error for missing translations
# config.action_view.raise_on_missing_translations = true
net = Socket.ip_address_list.detect(&:ipv4_private?)
ip = net.nil? ? 'localhost' : net.ip_address
config.domain = ip
config.action_mailer.default_url_options = { host: config.domain }
Capybara.server_port = 8200
Capybara.server_host = ip
test/application_system_test_case.rb
# frozen_string_literal: true
require 'test_helper'
require 'socket'
def prepare_options
driver_options = {
desired_capabilities: {
chromeOptions: {
args: %w[headless disable-gpu disable-dev-shm-usage] # preserve memory & cpu consumption
}
}
}
driver_options[:url] = ENV['selenium_remote_url'] if ENV['selenium_remote_url']
driver_options
end
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
driven_by :selenium, using: :chrome, screen_size: [1400, 1400]
end
Спасибо и надеемся, что кто-нибудь может привести меня к правильному решению. :)