2017-10-20 149 views
0

我想在docker中运行selenium chrome的rspec测试,但发现了数十个错误。最后我连水豚远程水豚,但现在我得到这些错误:Dockerized硒与轨道测试

得到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。这是非常的混乱,因为我有不同的configs

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 

这里试图十几次是我的搬运工,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 

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

+0

这些测试是否在本地工作,没有Docker?那些看起来像铁轨404错误,所以我倾向于认为一切都在谈论,但也许有一个应用程序错误? –

+2

请澄清,你正在尝试做什么。您是否试图在本地主机上运行测试,但在'selenium' docker实例中使用浏览器?或者你是否试图在'web' docker实例中运行测试?通常Capybara会在测试运行的任何系统上启动被测应用程序(因此它可以跟踪打开的请求等),所以重要的是要确切地知道你想要做什么。 –

+0

@JayDorsey这不是应用程序错误,上次我修改我的配置,我得到了相同的输出,但错误代码200 – Denys

回答

0

从您已经阐明的意见中,您已经尝试在使用selenium docker实例中的selenium驱动的浏览器时运行web docker实例中的测试。此外,由于您的测试在本地工作,我假设您使用的是Rails 5.1+,因此功能测试的事务测试将起作用。基于这些参数,有一些事情需要使一切正常工作。

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

    Capybara.run_server = true # You currently have this set to false for some reason 
    
  2. 水豚需要可以从selenium泊坞窗实例达到一个接口上运行的应用程序的副本。要做到这一点最简单的方法是指定绑定到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. 司机豚使用需要被配置为使用硒实例

    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. 配置水豚使用正确的主机时来访的相对URL

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

注意:如果您预期测试在端口3001上运行,那么您希望停止docker实例在该端口上启动rails s,因为您希望测试针对Capybara本身启动的应用实例运行# command: bundle exec rails s -p 3001 -b '0.0.0.0'。如果你当前在3001上运行的实例是其他东西,那么你将需要一个不同的端口进行测试。

此外,如果您未运行Rails 5.1+,则需要设置config.use_transactional_fixtures = false并完全配置database_cleaner - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example。如果您使用的是Rails 5.1+,那么您可能会删除所有的database_cleaner内容。

+0

谢谢你的出色答案,但我做了另一个错误的方式。我在里面制作了自定义的docker镜像,并在那里运行测试。我知道这是不好的做法,但我会稍后尝试使用您的解决方案来做到这一点。 感谢您的帮助! – Denys