【问题标题】:Why is Capybara not sending the server's port to the browser on visit i.e root_path?为什么 Capybara 在访问时不将服务器的端口发送到浏览器,即 root_path?
【发布时间】:2021-06-04 21:41:50
【问题描述】:

在 ruby​​ 2.6.1 中,rails 6.0 我正在尝试让 Capybara 启动一个测试服务器,并可以通过打开或关闭无头选项来选择是否显示使用 capybara 3.35.3 和 cuprite 0.13 的 chrome 上的案例。

我的发现和问题:

理想情况下,不要定义Capybara.server_hostCapybara.server_port,而是使用Capybara.always_include_port = true,根据Capybara 的文档,这意味着在测试用例中使用访问时始终将端口发送或附加到服务器主机地址,浏览器中的网址为http://127.0.0.1:xxxx/。这种方法的问题是Capybara.always_include_port 没有这样做,而是在服务器运行后,浏览器转到http://127.0.0.1/

如果我设置Capybara.server_port,无论Capybara.always_include_port 的状态如何,浏览器在bundle exec rspec 上仍然没有端口。

作为参考,我在每个案例之前使用CAPYBARA_APP_HOSThost!而不使用通用Capybara.app_host的原因是因为Rails自动将后者的值更改为127.0.0.1,所以这更像是一个工作大约是从 evilmartians 那里获得的。

注释的代码行是为了展示我提到的观点。

值得注意的是,当前环境工作的唯一方法是如果我设置 Capybara.run_server = false ,并取消注释 server_hostserver_portCAPYBARA_APP_HOSThost! 行,并使用 @ 启动单独的 rails 服务器987654338@ 然后运行规范,不太理想。

任何指针?谢谢

我的 rails_helper.rb:

require 'spec_helper'

ENV['RAILS_ENV'] ||= 'test'

require File.expand_path('../config/environment', __dir__)

abort("The Rails environment is running in production mode!") if Rails.env.production?

require 'rspec/rails'
require 'capybara/rails'
require "capybara/cuprite"

Dir[File.join(__dir__, "system/support/**/*.rb")].sort.each { |file| require file }

Capybara.default_driver = Capybara.javascript_driver  = Capybara.current_driver = :cuprite
Capybara.default_max_wait_time = 5
Capybara.default_normalize_ws = true

Capybara.server = :puma
Capybara.always_include_port = true
# Capybara.server_host = '0.0.0.0'
# Capybara.server_port = 3030
# CAPYBARA_APP_HOST = "http://#{Capybara.server_host}:#{Capybara.server_port}".freeze

Capybara.register_driver(:cuprite) do |app|
  Capybara::Cuprite::Driver.new(
    app,
    **{
      window_size: [1200, 800],
      browser_options: {},
      process_timeout: 10,
      inspector: true,
      headless: !ENV["HEADLESS"].in?(%w[n 0 no false])
    }
  )
end

begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  puts e.to_s.strip
  exit 1
end

RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/factories"
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!

  config.prepend_before(:each, type: :system) do
    # host! CAPYBARA_APP_HOST
    # Use JS driver always
    driven_by Capybara.javascript_driver
  end
end

【问题讨论】:

    标签: ruby-on-rails rspec capybara cuprite


    【解决方案1】:

    所以我决定调试lib/capybara/session.rb 并注意到always_include_port 实际上正在正常工作,结果确实是使用完整的uri 启动驱动程序;一个 url + 端口。

    问题是我在运行关于在应用程序控制器中拥有force_ssl if: :ssl_configured? 的规范时一直忽略的警告。我算出那条线,一切都按预期工作。

    教训:不要忽略运行时警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2015-11-05
      • 2020-06-30
      • 1970-01-01
      相关资源
      最近更新 更多