简体   繁体   中英

Docker-compose testing with Selenium fails / Selenium::WebDriver::Error::UnknownError: unknown error: net::ERR_CONNECTION_REFUSED

I am trying to run tests using Docker-compose, but I am having trouble with Selenium. I have no previous experience with docker so I am struggling with it.

Dockerfile

# syntax=docker/dockerfile:1
FROM ruby:2.7.2
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Configure the main process to run when running the image
CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose.yml

version: "3.9"
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
  selenium-hub:
    image: selenium/hub:3.141.59-20210913
    container_name: selenium-hub
    ports:
      - "4444:4444"
    expose: 
      - 4444
  chrome:
    image: selenium/node-chrome:3.141.59-20210913
    links:
    - selenium-hub
    container_name: chrome
    deploy:
      replicas: 1
    ports:
      - "5900:5900"
    volumes:
      - /dev/shm:/dev/shm
    depends_on:
      - selenium-hub
    environment:
      - HUB_HOST=selenium-hub
      - HUB_PORT=4444
      - JAVA_OPTS=-Dwebdriver.chrome.whitelistedIps=
      - NODE_MAX_INSTANCES=3
      - NODE_MAX_SESSION=3
  firefox:
    image: selenium/node-firefox:3.141.59-20210913
    container_name: firefox
    deploy:
      replicas: 1
    volumes:
      - /dev/shm:/dev/shm
    depends_on:
      - selenium-hub
    environment:
      - HUB_HOST=selenium-hub
      - HUB_PORT=4444

rails_helper.rb

ENV["RAILS_ENV"] ||= "test"
require File.expand_path("../../config/environment", __FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require "spec_helper"
require "rspec/rails"
# Add additional requires below this line. Rails is not loaded until this point!
require "capybara/rspec"


# Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

# Checks for pending migrations and applies them before tests are run.
# If you are not using ActiveRecord, you can remove these lines.
begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  puts e.to_s.strip
  exit 1
end

# Seting capybara for google chrome browser

selenium_host = "http://selenium-hub:4444/wd/hub"

unless ENV['SELENIUM_HOST'].nil?
  selenium_host = "http://#{ ENV["SELENIUM_HOST"] }:4444/wd/hub"
end

Capybara.register_driver :selenium_chrome do |app|
  # Capybara::Selenium::Driver.new(app, browser: :chrome)
  options = Selenium::WebDriver::Chrome::Options.new(args: %w[
    headless no-sandbox disable-gpu window-size=1920x1080
  ])
  Capybara::Selenium::Driver.new(
    app,
    browser: :remote,
    desired_capabilities: :chrome,
    options: options,
    url: selenium_host
  )
end

Capybara.server = :puma, { Silent: true }
Capybara.javascript_driver = :selenium_chrome
Capybara.save_path = "#{ Rails.root }/tmp/screenshots/"
Capybara.asset_host = 'http://localhost:3000'
Capybara.run_server = true
Capybara.configure do |config|
  config.match = :prefer_exact
  config.ignore_hidden_elements = true
  config.visible_text_only = true
  # accept clicking of associated label for checkboxes/radio buttons (css psuedo elements)
  config.automatic_label_click = true
end
Capybara.always_include_port = true

RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation
  end

  # This block must be here, do not combine with the other `before(:each)` block.
  # This makes it so Capybara can see the database.
  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
end

Shoulda::Matchers.configure do |config|
  config.integrate do |with|
    with.test_framework :rspec
    with.library :rails
  end
end

After building and running containers, when I try to run the test command:

docker-compose run web bundle exec rspec

I am getting errors for tests with the selenium chrome driver:

Failures:

  1) Create new job offer when all fields are correct 
     Failure/Error: visit '/users/sign_in'
     
     Selenium::WebDriver::Error::UnknownError:
       unknown error: net::ERR_CONNECTION_REFUSED
         (Session info: chrome=93.0.4577.63)
     # #0 0x564856de3583 <unknown>
     # #1 0x564856b57a38 <unknown>
     # #2 0x564856b51e8d <unknown>
     # #3 0x564856b43ec6 <unknown>
     # #4 0x564856b44de3 <unknown>
     # #5 0x564856b44192 <unknown>
     # #6 0x564856b43774 <unknown>
     # #7 0x564856b42543 <unknown>
     # #8 0x564856b42893 <unknown>
     # #9 0x564856b593fa <unknown>
     # #10 0x564856bbdfaf <unknown>
     # #11 0x564856baa752 <unknown>
     # #12 0x564856bbd74c <unknown>
     # #13 0x564856baa643 <unknown>
     # #14 0x564856b80b94 <unknown>
     # #15 0x564856b81b85 <unknown>
     # #16 0x564856e13c6e <unknown>
     # #17 0x564856e29975 <unknown>
     # #18 0x564856e14bc5 <unknown>
     # #19 0x564856e2afb5 <unknown>
     # #20 0x564856e0984b <unknown>
     # #21 0x564856e46248 <unknown>
     # #22 0x564856e463c8 <unknown>
     # #23 0x564856e6073d <unknown>
     # #24 0x7f92b5c68609 start_thread
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/response.rb:72:in `assert_ok'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/response.rb:34:in `initialize'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/common.rb:88:in `new'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/common.rb:88:in `create_response'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/default.rb:114:in `request'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/common.rb:64:in `call'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/bridge.rb:167:in `execute'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/w3c/bridge.rb:567:in `execute'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/w3c/bridge.rb:59:in `get'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/common/navigation.rb:32:in `to'
     # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/selenium/driver.rb:104:in `visit'
     # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/session.rb:278:in `visit'
     # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/dsl.rb:53:in `call'
     # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/dsl.rb:53:in `visit'
     # ./spec/features/create_job_spec.rb:7:in `block (2 levels) in <top (required)>'

  2) The expiring date when deadline is expired yet, date is not displayed
     Failure/Error: visit '/users/sign_in'
     
     Selenium::WebDriver::Error::UnknownError:
       unknown error: net::ERR_CONNECTION_REFUSED
         (Session info: chrome=93.0.4577.63)
     # #0 0x564856de3583 <unknown>
     # #1 0x564856b57a38 <unknown>
     # #2 0x564856b51e8d <unknown>
     # #3 0x564856b43ec6 <unknown>
     # #4 0x564856b44de3 <unknown>
     # #5 0x564856b44192 <unknown>
     # #6 0x564856b43774 <unknown>
     # #7 0x564856b42543 <unknown>
     # #8 0x564856b42893 <unknown>
     # #9 0x564856b593fa <unknown>
     # #10 0x564856bbdfaf <unknown>
     # #11 0x564856baa752 <unknown>
     # #12 0x564856bbd74c <unknown>
     # #13 0x564856baa643 <unknown>
     # #14 0x564856b80b94 <unknown>
     # #15 0x564856b81b85 <unknown>
     # #16 0x564856e13c6e <unknown>
     # #17 0x564856e29975 <unknown>
     # #18 0x564856e14bc5 <unknown>
     # #19 0x564856e2afb5 <unknown>
     # #20 0x564856e0984b <unknown>
     # #21 0x564856e46248 <unknown>
     # #22 0x564856e463c8 <unknown>
     # #23 0x564856e6073d <unknown>
     # #24 0x7f92b5c68609 start_thread
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/response.rb:72:in `assert_ok'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/response.rb:34:in `initialize'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/common.rb:88:in `new'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/common.rb:88:in `create_response'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/default.rb:114:in `request'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/common.rb:64:in `call'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/bridge.rb:167:in `execute'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/w3c/bridge.rb:567:in `execute'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/w3c/bridge.rb:59:in `get'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/common/navigation.rb:32:in `to'
     # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/selenium/driver.rb:104:in `visit'
     # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/session.rb:278:in `visit'
     # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/dsl.rb:53:in `call'
     # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/dsl.rb:53:in `visit'
     # ./spec/features/display_expiring_date_spec.rb:22:in `block (2 levels) in <top (required)>'

  3) The expiring date when deadline is not expired yet, date is displayed
     Failure/Error: visit '/users/sign_in'
     
     Selenium::WebDriver::Error::UnknownError:
       unknown error: net::ERR_CONNECTION_REFUSED
         (Session info: chrome=93.0.4577.63)
     # #0 0x564856de3583 <unknown>
     # #1 0x564856b57a38 <unknown>
     # #2 0x564856b51e8d <unknown>
     # #3 0x564856b43ec6 <unknown>
     # #4 0x564856b44de3 <unknown>
     # #5 0x564856b44192 <unknown>
     # #6 0x564856b43774 <unknown>
     # #7 0x564856b42543 <unknown>
     # #8 0x564856b42893 <unknown>
     # #9 0x564856b593fa <unknown>
     # #10 0x564856bbdfaf <unknown>
     # #11 0x564856baa752 <unknown>
     # #12 0x564856bbd74c <unknown>
     # #13 0x564856baa643 <unknown>
     # #14 0x564856b80b94 <unknown>
     # #15 0x564856b81b85 <unknown>
     # #16 0x564856e13c6e <unknown>
     # #17 0x564856e29975 <unknown>
     # #18 0x564856e14bc5 <unknown>
     # #19 0x564856e2afb5 <unknown>
     # #20 0x564856e0984b <unknown>
     # #21 0x564856e46248 <unknown>
     # #22 0x564856e463c8 <unknown>
     # #23 0x564856e6073d <unknown>
     # #24 0x7f92b5c68609 start_thread
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/response.rb:72:in `assert_ok'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/response.rb:34:in `initialize'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/common.rb:88:in `new'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/common.rb:88:in `create_response'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/default.rb:114:in `request'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/http/common.rb:64:in `call'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/bridge.rb:167:in `execute'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/w3c/bridge.rb:567:in `execute'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/w3c/bridge.rb:59:in `get'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/common/navigation.rb:32:in `to'
     # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/selenium/driver.rb:104:in `visit'
     # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/session.rb:278:in `visit'
     # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/dsl.rb:53:in `call'
     # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/dsl.rb:53:in `visit'
     # ./spec/features/display_expiring_date_spec.rb:7:in `block (2 levels) in <top (required)>'

Finished in 3.82 seconds (files took 1.13 seconds to load)
39 examples, 3 failures

Failed examples:

rspec ./spec/features/create_job_spec.rb:6 # Create new job offer when all fields are correct 
rspec ./spec/features/display_expiring_date_spec.rb:21 # The expiring date when deadline is expired yet, date is not displayed
rspec ./spec/features/display_expiring_date_spec.rb:6 # The expiring date when deadline is not expired yet, date is displayed

Randomized with seed 39822

ERROR: 1

Any help is very welcome.

The error means chrome driver is crashed and no longer available. As its issue with docker, the main reason will be that chrome is unable to start as its a GUI program and you are trying to run it from dokcer without GUI

You should be using any display server like xvfb

read more at:

https://praveendavidmathew.medium.com/running-webdriverio-in-wsl2-windows-91d3a0dc7746

If you are running linux/macos try doing this:

  1. Update the docker-compose file as follows:
volumes:
  - "/tmp/.X11-unix:/tmp/.X11-unix:rw"
environment:
  - DISPLAY=:0
  - QT_X11_NO_MITSHM=1
  1. Then make sure to don't have the --headless flag marked in the webdriver
  2. Open a terminal and run:
xhost +
docker-compose up

Tested with Selenium::WebDriver::Firefox :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM