问题
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。也试过