Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 配置水豚&x2B;Selenium将通过SSL进行测试_Ruby On Rails_Selenium_Rspec_Tdd_Capybara - Fatal编程技术网

Ruby on rails 配置水豚&x2B;Selenium将通过SSL进行测试

Ruby on rails 配置水豚&x2B;Selenium将通过SSL进行测试,ruby-on-rails,selenium,rspec,tdd,capybara,Ruby On Rails,Selenium,Rspec,Tdd,Capybara,我的应用程序的核心部分调用Etsy API。 我正在尝试使用Rspec、Capybara和Selenium编写测试来测试该API。 在我打了一个成功的电话之后,我想把这些都删掉 我的问题是Etsy身份验证过程仅适用于SSL。因此,当我尝试使用http进行测试时,我得到错误400 我使用它来设置SSL,但我一直收到以下错误: 1) New connection authenticates with Etsy Failure/Error: res = http.get('/__iden

我的应用程序的核心部分调用Etsy API。 我正在尝试使用Rspec、Capybara和Selenium编写测试来测试该API。 在我打了一个成功的电话之后,我想把这些都删掉

我的问题是Etsy身份验证过程仅适用于SSL。因此,当我尝试使用http进行测试时,我得到错误400

我使用它来设置SSL,但我一直收到以下错误:

  1) New connection authenticates with Etsy
     Failure/Error: res = http.get('/__identify__')

     OpenSSL::SSL::SSLError:
       SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol
     # ./spec/spec_helper.rb:68:in `responsive?'
这是我的spec_helper.rb:

require 'webmock/rspec'
require 'capybara/rspec'
include WebMock::API
require 'etsy'
WebMock.disable_net_connect!(allow_localhost: true)
#Capybara.current_driver = :selenium
Capybara.default_max_wait_time = 20

require 'webrick/https'
require 'rack/handler/webrick'

def run_ssl_server(app, port)

  opts = {
    :Port => port,
    :SSLEnable => true,
    :SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE,
    :SSLPrivateKey => OpenSSL::PKey::RSA.new("./spec/support/server.key"),
    :SSLCertificate => OpenSSL::X509::Certificate.new(File.read "./spec/support/server.crt"),
    :SSLCertName => [["US", 'localhost.key']],
    :AccessLog => [],
    :Logger => WEBrick::Log::new(Rails.root.join("./log/capybara_test.log").to_s)
  }
  profile = Selenium::WebDriver::Firefox::Profile.new
  profile.assume_untrusted_certificate_issuer = false

   Capybara::Driver::Selenium.new(app, :browser=> :firefox, :profile => profile)
  Rack::Handler::WEBrick.run(app, opts)
end

Capybara.server do |app, port|
  run_ssl_server(app, port)
end

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

  Capybara.register_driver :selenium do |app|
    profile = Selenium::WebDriver::Firefox::Profile.new
    profile.assume_untrusted_certificate_issuer = false
    Capybara::Selenium::Driver.new(app, :profile => profile)
  end

module Capybara
  class Server
    def responsive?
      return false if @server_thread && @server_thread.join(0)

      http = Net::HTTP.new(host, @port)
      http.use_ssl = true
      http.verify_mode = OpenSSL::SSL::VERIFY_NONE
      res = http.get('/__identify__')

      if res.is_a?(Net::HTTPSuccess) or res.is_a?(Net::HTTPRedirection)
        return res.body == @app.object_id.to_s
      end
    rescue SystemCallError
      return false
    end
  end
end
提前谢谢!

您的
运行ssl\u服务器中似乎有多余的东西,这没有任何意义

profile = Selenium::WebDriver::Firefox::Profile.new
profile.assume_untrusted_certificate_issuer = false

Capybara::Driver::Selenium.new(app, :browser=> :firefox, :profile => profile)
所以我假设这只是一个复制/粘贴错误

继续讨论您遇到的错误似乎是在告诉您,连接不知道/不支持SSLv2/SSLv3协议。您可以通过指定SSLOptions、SSLCiphers和SSLVersion选项在WEBRick选项中禁用它们,如中所示

一个更简单的选择可能是不注册您自己的服务器、修补Capybara、修复服务器端口或设置
app\u host
,而是切换到使用Capybara>=3.1.0,只需将Puma配置为运行SSL

Capybara.server = :puma, { Host: "ssl://#{Capybara.server_host}?key=#{key_file_path}&cert=#{cert_file_path}" }
然后,您可以向Selenium注册您正在使用的任何浏览器,以允许自签名证书(如有必要)


您的
运行\u ssl\u服务器中似乎有多余的内容,这没有任何意义

profile = Selenium::WebDriver::Firefox::Profile.new
profile.assume_untrusted_certificate_issuer = false

Capybara::Driver::Selenium.new(app, :browser=> :firefox, :profile => profile)
所以我假设这只是一个复制/粘贴错误

继续讨论您遇到的错误似乎是在告诉您,连接不知道/不支持SSLv2/SSLv3协议。您可以通过指定SSLOptions、SSLCiphers和SSLVersion选项在WEBRick选项中禁用它们,如中所示

一个更简单的选择可能是不注册您自己的服务器、修补Capybara、修复服务器端口或设置
app\u host
,而是切换到使用Capybara>=3.1.0,只需将Puma配置为运行SSL

Capybara.server = :puma, { Host: "ssl://#{Capybara.server_host}?key=#{key_file_path}&cert=#{cert_file_path}" }
然后,您可以向Selenium注册您正在使用的任何浏览器,以允许自签名证书(如有必要)


非常感谢你,托马斯!这无疑是对我所做工作的巨大改进,但在我看来,服务器仍在通过https以常规http启动:水豚启动Puma…*版本3.11.4,代号:情歌*最小线程数:0,最大线程数:4*正在收听tcp://127.0.0.1:44047 打开的浏览器也使用http。我非常感谢你的帮助,谢谢@MaayanNaveh听起来好像有什么东西覆盖了
Capybara.server
设置。您是否有可能在Rails 5.1上使用系统测试?Rails 5.1中有一个bug,它会覆盖用户设置的任何服务器。它是固定的。如果您无法升级到Rails 5.2,您可以使用monkeypatch ActionDispatch::SystemTestings::Server#将"U Server"设置为不执行任何操作-感谢您的建议!这是rspec中的一个功能测试。@MaayanNaveh您确定这是一个“功能”测试,并且没有在rspec中使用“系统”测试吗?如果是“功能”测试,则查找其他任何位置的
Capybara.server
正在设置,并确保您的设置以加载顺序出现在它之后。另外,我假设您运行的是Capybara 3.1,并且您将密钥和证书文件的位置添加到了我在回答中显示的服务器声明中。它肯定在features文件夹中,我已在上按位置推断了类型。我搜索了所有的项目文件,没有找到其他的水豚服务器。我正在使用你建议的解决方案,是的。我尝试从主分支降级到正式版本,它用ssl启动服务器:但当我升级到主分支时,同样的事情发生了,它从http启动。当我“降级”时,它是从ssl开始的,然后selenium拒绝了它,因为它是自签名的,所以我被困在第1方:(非常感谢,@Thomas!这对我所做的工作来说无疑是一个巨大的改进,但在我看来,服务器仍在通过https以常规http启动:水豚启动Puma…*版本3.11.4,代码名:情歌*最小线程数:0,最大线程数:4*正在收听。)tcp://127.0.0.1:44047 打开的浏览器也使用http。非常感谢您的帮助,谢谢!@MaayanNaveh听起来您好像有什么东西覆盖了
Capybara.server
设置。您是否碰巧在Rails 5.1上使用了系统测试?Rails 5.1中有一个bug,它会覆盖用户设置的任何服务器。它已在中修复。如果您无法升级到Rails 5.2,您可以使用monkeypatch ActionDispatch::SystemTestings::Server#将#U Server设置为不执行任何操作-感谢您的建议!这是rspec中的功能测试。@MaayanNaveh您确定这是一个“功能”测试,而不是现在在rspec中使用“系统”测试吗?如果是“功能”测试然后查找其他任何位置的
Capybara。正在设置服务器
,并确保您的设置在加载顺序之后发生。此外,我假设您正在运行Capybara 3.1,并且您已将密钥和证书文件的位置添加到我在回答中显示的服务器声明中。它肯定位于features文件夹中,并且我已经完成了设置pe按位置在上。我搜索了所有项目文件,没有找到其他Capybara服务器。我正在使用您建议的解决方案,是的。我尝试从主分支降级到正式版本,它使用ssl启动服务器:但当我升级到主分支时,同样的情况发生,它从http开始。当我“降级”它从ssl开始,然后selenium拒绝了它,因为它是自签名的,所以我只能停留在第1步:(