Dockerizedselenium与轨道testing

我想在docker中运行selenium chrome的rspectesting,但是发现了几十个错误。 最后我连接水豚到远程水豚,但现在我得到了这些错误:

有0个失败和2个其他错误:

1.1) Failure/Error: visit new_user_session_path Selenium::WebDriver::Error::WebDriverError: unexpected response, code=404, content-type="text/html" <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>Action Controller: Exception caught</title> 

………………..

  Failure/Error: raise Error::WebDriverError, msg Selenium::WebDriver::Error::WebDriverError: unexpected response, code=404, content-type="text/html" <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>Action Controller: Exception caught</title> <style> body { background-color: #FAFAFA; 

……………

所以这里是我的rails_helper.rb 。 这是非常混乱,因为我尝试了十几次不同的configuration

 require 'simplecov' SimpleCov.start ENV['RAILS_ENV'] ||= 'test' require File.expand_path('../../config/environment', __FILE__) # Prevent database truncation if the environment is production abort("The Rails environment is running in production mode!") if Rails.env.production? require 'spec_helper' require 'rspec/rails' require 'turnip/capybara' require "selenium/webdriver" require 'capybara-screenshot/rspec' Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } Shoulda::Matchers.configure do |config| config.integrate do |with| with.test_framework :rspec with.library :rails end end # Checks for pending migration and applies them before tests are run. # If you are not using ActiveRecord, you can remove this line. ActiveRecord::Migration.maintain_test_schema! Capybara::Screenshot.register_driver(:headless_chrome) do |driver, path| driver.browser.manage.window.resize_to(1600, 1200) driver.browser.save_screenshot("tmp/capybara/chrom_#{Time.now}.png") end url = 'http://test.prs.com:3001/' Capybara.javascript_driver = :remote_browser Capybara.register_driver :headless_chrome do |app| capabilities = Selenium::WebDriver::Remote::Capabilities.chrome( chromeOqptions: { args: %w(headless disable-gpu no-sandbox) } ) end capabilities = Selenium::WebDriver::Remote::Capabilities.chrome( chromeOqptions: { args: %w(headless disable-gpu no-sandbox) } ) Capybara.default_driver = :remote_browser Capybara.register_driver :remote_browser do |app| Capybara::Selenium::Driver.new(app, :browser => :remote, url: url, desired_capabilities: capabilities) end # Capybara::Selenium::Driver.new app, # browser: :chrome, # desired_capabilities: capabilities # end Capybara.app_host = "http://#{ENV['APP_HOST']}:#{3001}" Capybara.run_server = false Capybara.configure do |config| config.always_include_port = true end Chromedriver.set_version '2.32' # Capybara.javascript_driver = :headless_chrome # Capybara.server_host= '0.0.0.0' # Capybara.default_host = "http://test.prs.com" # Capybara.app_host = "#{Capybara.default_host}:#{Capybara.server_port}" RSpec.configure do |config| config.include FactoryGirl::Syntax::Methods config.include RequestSpecHelper # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures config.fixture_path = "#{::Rails.root}/spec/fixtures" config.before(:each) do DatabaseCleaner.strategy = :truncation DatabaseCleaner.clean end config.before(:all, type: :request) do host! 'test.prs.com' end config.use_transactional_fixtures = true config.infer_spec_type_from_file_location! config.filter_rails_from_backtrace! end 

这里是我的docker-compose.yml:

  version: '3' services: db: image: postgres web: build: . command: bundle exec rails s -p 3001 -b '0.0.0.0' volumes: - .:/prs ports: ['3000:3000', '3001:3001'] # - "3001:3001" depends_on: - db - selenium extra_hosts: - "test.prs.com:127.0.0.1" environment: - APP_HOST=test.prs.com links: - selenium selenium: image: selenium/standalone-chrome-debug:3.6.0-bromine # Debug version enables VNC ability ports: ['4444:4444', '5900:5900'] # Bind selenium port & VNC port volumes: - /dev/shm:/dev/shm shm_size: 1024m privileged: true container_name: selenium 

我是新来的这一切,所以任何帮助将不胜感激。

从您已经澄清,您正试图在使用selenium docker实例中的selenium驱动的浏览器在web泊坞窗实例中运行testing的意见。 此外,由于您的testing在本地工作,我假设您正在使用Rails 5.1+,因此functiontesting的事务性testing可以正常工作。 基于这些参数,有一些事情需要使一切正常工作。

  1. 水豚需要启动自己的应用程序副本运行testing。 这是事务性testing工作和请求完成检测所需的。 你用这个来启用它

     Capybara.run_server = true # You currently have this set to false for some reason 
  2. 水豚需要在可以从selenium docker实例到达的接口上运行应用程序的副本。 最简单的方法是指定绑定到0.0.0.0

     Capybara.server_host = `0.0.0.0` Capybara.server_port = 3001 # I'm assuming this is what you want, change to another port and make sure it's reachable from `selenium` instance if desired 
  3. 驱动程序水豚使用需要configuration使用selenium实例

     Capybara.register_driver :remote_browser do |app| capabilities = Selenium::WebDriver::Remote::Capabilities.chrome( chromeOptions: { args: %w(headless disable-gpu no-sandbox) } ) Capybara::Selenium::Driver.new(app, :browser => :remote, url: "http://selenium:4444", desired_capabilities: capabilities ) end Capybara.javascript_driver = :remote_browser # Capybara.default_driver = :remote_browser # only needed if you want all tests to use selenium rather than just JS tagged tests. 
  4. configuration水豚在访问相对URL时使用正确的主机

     Capybara.app_host = "http://web:3001" # a URL that represents the `web` docker instance from the perspective of the `selenium` docker instance 

注意:如果你期待你的testing在端口3001上运行,那么你想停止Docker实例在这个端口上启动rails s ,因为你想要testing运行在Capybara本身启动的应用实例#command # command: bundle exec rails s -p 3001 -b '0.0.0.0' 。 如果你当前在3001上运行的实例是其他的东西,那么你将需要一个不同的端口进行testing。

另外,如果你没有运行Rails 5.1+,那么你需要设置config.use_transactional_fixtures = false并且完全configurationdatabase_cleanerhttps://github.com/DatabaseCleaner/database_cleaner#rspec-with- config.use_transactional_fixtures = false 。 如果你使用Rails 5.1+,那么你可能会删除所有的database_cleaner的东西。