Gitlab-CI Selenium::WebDriver::Error::WebDriverError: unable to connect to chromedriver 127.0.0.1:9515

Gitlab-CI Selenium::WebDriver::Error::WebDriverError: unable to connect to chromedriver 127.0.0.1:9515

我能够设置我的 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

在这一点上,我的测试 运行ning 在本地很好。接下来是我按照 this tutorial 设置我的 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

谢谢并希望任何人都能引导我找到正确的解决方案。 :)

该错误很可能是由于 chrome 和 chrome 驱动程序版本不匹配造成的。最简单的解决方案是将网络驱动程序 gem 添加到您的项目中。

我能够通过在我的 Dockerfile 中添加最新版本的 chrome 和 chrome-驱动程序来解决我的问题。这是通过添加以下行实现的:

# Latest Google Chrome installation package
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
  && sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'

# Latest Ubuntu Firefox, Google Chrome, XVFB and JRE installs
RUN apt-get update -qqy \
  && apt-get -qqy install \
    xvfb \
    google-chrome-stable

# Clean clears out the local repository of retrieved package files. Run apt-get clean from time to time to free up disk space.
RUN apt-get clean \
  && rm -rf /var/lib/apt/lists/*

# 1. Step to fixing the error for Node.js native addon build tool (node-gyp)
# https://github.com/nodejs/node-gyp/issues/454
# https://github.com/npm/npm/issues/2952
RUN rm -fr /root/tmp
# Jasmine and protractor global install
# 2. Step to fixing the error for Node.js native addon build tool (node-gyp)
# https://github.com/nodejs/node-gyp/issues/454
RUN npm install --unsafe-perm --save-exact -g protractor@5.0.0 \
# Get the latest Google Chrome driver
  && npm update \
# Get the latest WebDriver Manager
  && webdriver-manager update