Настройка Capybara + Selenium для тестирования по SSL - PullRequest
0 голосов
/ 14 мая 2018

Основная часть моего приложения выполняет вызовы 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

Заранее спасибо! here's the files I generated

1 Ответ

0 голосов
/ 14 мая 2018

Похоже, в вашем run_ssl_server есть дополнительный материал, который не имеет никакого смысла

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

Capybara::Driver::Selenium.new(app, :browser=> :firefox, :profile => profile)

, поэтому я предполагаю, что это была просто ошибка копирования / вставки?

Переходя к получаемой ошибке, похоже, говорит вам, что протоколы SSLv2 / SSLv3 не известны / не поддерживаются соединением.Вы можете отключить их в параметрах WEBRick, указав параметры SSLOptions, SSLCiphers и SSLVersion, как показано в Как укрепить рельсы + webrick + https с небезопасными шифрами, удаленными в Ruby 2.2

Прощеможет быть вариант не регистрировать свой собственный сервер, исправлять Capybara, фиксировать порт сервера или устанавливать app_host, но вместо этого переключиться на использование Capybara> = 3.1.0 и просто настроить Puma для запуска SSL

Capybara.server = :puma, { Host: "ssl://#{Capybara.server_host}?key=#{key_file_path}&cert=#{cert_file_path}" }

Затем вы можете зарегистрировать любой браузер, который вы используете в Selenium, чтобы разрешить самозаверяющие сертификаты (при необходимости)

Capybara.register_driver :insecure_selenium do |app|
  Capybara::Selenium::Driver.new(
    app,
    browser: :firefox,
    desired_capabilities: { accept_insecure_certs: true }
  )
end

Capybara.javascript_driver = :insecure_selenium # https://github.com/teamcapybara/capybara#drivers
...