2013-07-16 29 views
2

我正在使用RSpec,Capybara和Selenium来测试我的本地Rails应用程序。水豚本身工作正常。我的问题是我在我的大多数应用程序中使用强制SSL连接。如何在本地环境中使用SSL与Capybara/Selenium搭配使用

那种解决方法我现在是配置水豚像这样的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 

,只有当我独立启动的服务器在3001端口上具有有效的本地SSL证书工作。在实践中,这是令人讨厌的,通常只是我不喜欢的手动依赖。

有没有人知道这个更清洁的解决方法?或者:

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

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

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

任何帮助将不胜感激。

回答

4

通过将接受应用程序和端口的块传递给Capybara.server,您可以告诉Capybara如何启动服务器。默认只是调用耙::处理器:: 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 => cert, 
    :SSLPrivateKey => key 
    } 

    Rack::Handler::WEBrick.run(app, opts) 
end 

# Elsewhere in your test/spec helper 
Capybara.server = {|app, port| run_ssl_server(app, port)} 
+0

我已经试过了,但所有它导致的错误'RuntimeError:Rack应用boot'按我的帖子,我已经成功地找到解决的唯一途径期间超时开始独立服务器外部,但我不知道为什么。有什么想法吗? – Bryce

+0

好吧,我终于开始工作了,但是我重写了Capybara的'respon'函数来处理SSL。感谢您指点我正确的方向! – Bryce

相关问题