简体   繁体   English

Docker-compose 测试 Selenium 失败 / Selenium::WebDriver::Error::UnknownError: unknown error:.net::ERR_CONNECTION_REFUSED

[英]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.我正在尝试使用 Docker-compose 运行测试,但我在使用 Selenium 时遇到了问题。我以前没有使用 docker 的经验,所以我正在努力解决这个问题。

Dockerfile 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 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 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:我在使用 selenium chrome 驱动程序进行测试时遇到错误:

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.该错误意味着 chrome 驱动程序崩溃并且不再可用。 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作为 docker 的问题,主要原因是 chrome 无法作为 GUI 程序启动,而您正尝试在没有 GUI 的情况下从 dokcer 运行它

You should be using any display server like xvfb您应该使用任何显示服务器,例如 xvfb

read more at:阅读更多:

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

If you are running linux/macos try doing this:如果您正在运行 linux/macos,请尝试这样做:

  1. Update the docker-compose file as follows:更新docker-compose文件如下:
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然后确保没有在 webdriver 中标记--headless标志
  2. Open a terminal and run:打开终端并运行:
xhost +
docker-compose up

Tested with Selenium::WebDriver::Firefox :)测试Selenium::WebDriver::Firefox :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Net :: ReadTimeout:Net :: ReadTimeout和Selenium :: WebDriver :: Error :: UnknownError:未知错误:Chrome无法启动Rails 5.1.beta系统测试 - Net::ReadTimeout: Net::ReadTimeout and Selenium::WebDriver::Error::UnknownError: unknown error: Chrome failed to start on Rails 5.1.beta System Test Selenium Webdriver不适用于docker-compose - Selenium webdriver not working with docker-compose Selenium::WebDriver::Error::UnknownError: 未知错误: Chrome 启动失败: 异常退出 - Selenium::WebDriver::Error::UnknownError: unknown error: Chrome failed to start: exited abnormally 如何在Amazon Linux上使用带有chrome驱动程序的selenium。 错误:Selenium :: WebDriver :: Error :: UnknownError:未知错误:找不到Chrome二进制文件 - How to use selenium with chrome driver on Amazon Linux. error: Selenium::WebDriver::Error::UnknownError: unknown error: cannot find Chrome binary 与&#39;ws:// localhost:35729 / livereload&#39;的WebSocket连接失败:连接建立错误:net :: ERR_CONNECTION_REFUSED - WebSocket connection to 'ws://localhost:35729/livereload' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED 从移动设备测试应用程序时出错 - ERR_CONNECTION_REFUSED - Error when testing app from mobile device - ERR_CONNECTION_REFUSED Docker容器的ERR_CONNECTION_REFUSED - ERR_CONNECTION_REFUSED by docker container Selenium::WebDriver::Error::UnknownError: 无效的内容类型 - Selenium::WebDriver::Error::UnknownError: Invalid Content-Type AJAX返回net :: ERR_CONNECTION_REFUSED - AJAX returns net::ERR_CONNECTION_REFUSED docker-compose 导轨 mysql 连接被拒绝 - docker-compose rails mysql connection refused
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM