【问题标题】:How to get Capybara/Selenium to play nicely with SSL in local environment如何让 Capybara/Selenium 在本地环境中很好地使用 SSL
【发布时间】:2013-07-15 07:26:12
【问题描述】:

我正在使用 RSpec、Capybara 和 Selenium 来测试我的本地 Rails 应用程序。 Capybara 本身运行良好。我的问题是我在大部分应用程序中都使用了强制 SSL 连接。

我现在的解决方法是像这样配置 Capybara 进行 javascript 测试:

Capybara.register_driver :selenium_profile do |app|
  profile = Selenium::WebDriver::Firefox::Profile.new
  profile.secure_ssl = false
  profile.assume_untrusted_certificate_issuer = true
  Capybara::Selenium::Driver.new(app, :browser => :firefox, :profile => profile)
end 
Capybara.javascript_driver = :selenium_profile

Capybara.run_server = false
Capybara.server_port = 3001
Capybara.app_host = "https://localhost:%d" % Capybara.server_port

仅当我使用有效的本地 SSL 证书在端口 3001 上独立启动服务器时才有效。实际上,这很烦人,通常只是我不喜欢的手动依赖。

有没有人知道一个更干净的解决方法?要么:

1) 如何配置Capybara的内部服务器来查找和使用我的本地SSL证书?,或者

2) 如何为 javascript 测试禁用强制 SSL,或者

3) 如何在任何 javascript 测试之前自动启动本地服务器?

任何帮助将不胜感激。

【问题讨论】:

    标签: ruby-on-rails selenium capybara


    【解决方案1】:

    您可以告诉 Capybara 如何启动服务器,方法是将接受应用程序的块和端口传递给 Capybara.server。默认只调用 Rake::Handler::WEBrick.run:

    # This is the default setting
    Capybara.server = {|app, port| Capybara.run_default_server(app, port)}
    
    def run_default_server(app, port)
      require 'rack/handler/webrick'
      Rack::Handler::WEBrick.run(app, :Port => port, :AccessLog => [], :Logger => WEBrick::Log::new(nil, 0))
    end
    

    只要您传递给服务器的任何内容都接受应用程序和端口,您就可以定义您喜欢的任何服务器启动代码。

    Rack::Handler::WEBrick 将其大部分选项直接传递给 WEBrick::HTTPServer,因此您可以传递 SSL 配置的选项(SSLEnable、SSLCertificate 和 SSLPrivateKey,采用 from the docs)并启动您的服务器,例如这个:

    def run_ssl_server(app, port)
      require 'rack/handler/webrick'
      require 'webrick/https'
    
      certificate = OpenSSL::X509::Certificate.new File.read '/myapp/some_directory/certificate.pem'
      key = OpenSSL::PKey::RSA.new File.read '/myapp/some_directory/key.pem'
    
      opts = {
        :Port => port,
        :AccessLog => [],
        :Logger => WEBrick::Log::new(nil, 0),
        :SSLEnable => true,
        :SSLCertificate => certificate,
        :SSLPrivateKey => key 
      }
    
      Rack::Handler::WEBrick.run(app, opts)
    end
    
    # Elsewhere in your test/spec helper
    Capybara.server = {|app, port| run_ssl_server(app, port)}
    

    【讨论】:

    • 我试过了,但它导致的只是错误RuntimeError: Rack application timed out during boot 根据我的帖子,我设法找到的唯一方法是在外部启动一个单独的服务器,但我没有不知道为什么。有什么想法吗?
    • 好吧,我终于让它工作了,尽管我需要重写 Capybara 的 responsive? 函数来使用 SSL。感谢您为我指明正确的方向!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2010-10-29
    • 2020-03-28
    • 1970-01-01
    • 2011-09-08
    相关资源
    最近更新 更多