代码之家  ›  专栏  ›  技术社区  ›  rossta

使用带有无头Chrome和Selenium Webdriver、macOS、Rails、Capybara的acceptsecurecerts

  •  2
  • rossta  · 技术社区  · 6 年前

    问题

    headless Chrome是否可以通过macOS上的Selenium Webdriver使用自签名证书?

    信息

    我有一个本地自签名证书,可以通过ruby Puma应用服务器来终止SSL请求。为了允许驱动程序忽略本地签名证书上的SSL警告,我使用 acceptInsecureCerts 用于配置驱动程序功能的标志。 让我相信 this ticket in Chromium

    我可以通过Chrome、Firefox和headless Firefox进行测试。试验在无头铬下不合格。我正在使用(在撰写本文时)我认为是最新版本的Chrome及其变体。

    尽管有人在 Chromium ticket 似乎是通过Selenium webdriver在本地签名的SSL上成功地运行了headless Chrome,我还没有发现这可以与这里描述的设置一起工作。如果我的配置是正确的,那么我不确定macOS上的headless Chrome、Selenium webdriver ruby gem或其他一些我没有考虑过的东西是否有限制。如果有人在macOS上使用类似的Rails,我会有兴趣了解您的设置。

    来源

    下面是一些代码,演示如何配置和运行RSpec/Capybara测试。

    测试设置

    # rails_helper.rb
    # ... standard rspec rails helper setup omitted ...
    
    Capybara.register_driver(:headless_chrome) do |app|
      options = Selenium::WebDriver::Chrome::Options.new(
        args: %w[--headless --disable-gpu --no-sandbox --disable-web-security]
      )
      capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
        acceptInsecureCerts: true,
      )
      Capybara::Selenium::Driver.new(
        app,
        browser: :chrome,
        options: options,
        desired_capabilities: capabilities
      )
    end
    
    RSpec.configure do |config|
      config.before(:each, type: :system) do
        driven_by :headless_firefox
      end
    end
    
    module SystemTestHelpers
      def key_file_path
        Rails.root.join("config", "ssl", "ssl-lvh.me.key")
      end
    
      def cert_file_path
        Rails.root.join("config", "ssl", "ssl-lvh.me.crt")
      end
    
      def using_app_host(host)
        original_host = Capybara.app_host
        Capybara.app_host = host
    
        Capybara.server = :puma, {
          Host: "ssl://#{Capybara.server_host}?key=#{key_file_path}&cert=#{cert_file_path}"
        }
        yield
      ensure
        Capybara.app_host = original_host
      end
    end
    
    RSpec.configure do |config|
      config.include SystemTestHelpers, type: :system
    end
    

    样品测试

    # spec/system/welcome_spec.rb
    
    require 'rails_helper'
    
    RSpec.feature "Welcome", :js, type: :system do
      scenario "Visit homepage" do
        using_app_host('https://subdomain.lvh.me') do
          visit "/"
    
          expect(page).to have_content('Welcome')
    
          expect(page).to have_content('Your domain: subdomain.lvh.me')
          expect(page).to have_content('Your protocol: https://')
        end
      end
    end
    

    页面内容:

    <div>
      <h2>Welcome!</h2>
    
      <p>Your protocol: <%= request.protocol %></p>
      <p>Your domain: <%= request.host %></p>
    </div>
    

    Capybara.register_driver(:headless_firefox) do |app|
      options = Selenium::WebDriver::Firefox::Options.new(args: %w[--headless])
    
      capabilities = Selenium::WebDriver::Remote::Capabilities.firefox(
        acceptInsecureCerts: true,
      )
      Capybara::Selenium::Driver.new(
        app,
        browser: :firefox,
        options: options,
        desired_capabilities: capabilities
      )
    end
    

    复制此问题并包含上述代码的应用程序的完整源代码位于此处: https://bitbucket.org/rossta/system-test-demo .

    以下链接指向在无头Chrome或无头Firefox中运行测试的一些调试输出: https://gist.github.com/rossta/b160204baa87a520e7888c19c8b1ed98 .

    请注意,在输出中,会话响应不包括Chrome的“acceptInsecureCerts”功能(test-headless-Chrome.log,第15行),而在Firefox中,我们确实看到会话包含标志(test-headless-Firefox.log,第22行)。

    系统

    • MacOS 10.13.6版
    • 轨道5.2.1
    • 红宝石2.4.1
    • capybara (创业板)3.5.1
    • selenium-webdriver (创业板)3.14.0
    • chromdriver-helper
    • 铬68.0.3440.106。也试过
      • 谷歌Chrome 70.0.3524.0金丝雀
    2 回复  |  直到 6 年前
        1
  •  3
  •   Thomas Walpole    6 年前

    从你的日志来看,它显示它正在启动chromedriver v2.34。 acceptInsecureCerts

        2
  •  0
  •   Anand Chavan    6 年前

    caps=Selenium::WebDriver::Remote::Capabilities.firefox

    caps['acceptinsurecerts']=真