SSL 下 Capybara、Puma、Rails 系统测试的 EOFError

EOFError with Capybara, Puma, Rails System Tests under SSL

运行 Rails SSL 下的系统测试表现出奇怪的行为,我不确定这是错误还是设计使然。

这个非常基本的 Example Application 有一个系统测试可以在索引页上查找元素。

git clone https://github.com/frankjmattia/rails-ssl-system-tests.git blorgh
cd blorgh
./bin/setup

此时您必须创建一个自签名证书并指示您的操作系统信任它。

./bin/generate-blorgh-cert blorgh.test

这将生成证书并打印说明以在 Mac OS X 或 Ubuntu 上信任它。这将对 https://blorgh.testhttps://127.0.0.1https://localhost

有效

rake到运行系统测试

rails s 启动服务器,然后导航到 https://localhost:3000

当 运行他们通过测试时,我什至在发出请求之前就收到 Puma 抛出的错误。

% rake
Run options: --seed 43000

# Running:
    Capybara starting Puma...
* Version 3.12.1 , codename: Llamas in Pajamas
* Min threads: 1, max threads: 1
* Listening on ssl://127.0.0.1:56260?key=/Users/frankjmattia/src/blorgh/ssl/blorgh.test.key.pem&cert=/Users/frankjmattia/src/blorgh/ssl/blorgh.test.cert.pem
2019-04-28 16:59:48 -0400: SSL error, peer: 127.0.0.1, peer cert: , #<Puma::MiniSSL::SSLError: OpenSSL error: error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request - 336027804>
2019-04-28 16:59:49 -0400: SSL error, peer: 127.0.0.1, peer cert: , #<Puma::MiniSSL::SSLError: OpenSSL error: error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request - 336027804>
.

Finished in 3.177669s, 0.3147 runs/s, 0.3147 assertions/s.
1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
2019-04-28 16:59:49 -0400: Read error: #<EOFError: EOFError>
/Users/frankjmattia/.asdf/installs/ruby/2.6.2/lib/ruby/gems/2.6.0/gems/puma-3.12.1/lib/puma/client.rb:306:in `try_to_finish'
/Users/frankjmattia/.asdf/installs/ruby/2.6.2/lib/ruby/gems/2.6.0/gems/puma-3.12.1/lib/puma/client.rb:119:in `reset'
/Users/frankjmattia/.asdf/installs/ruby/2.6.2/lib/ruby/gems/2.6.0/gems/puma-3.12.1/lib/puma/server.rb:486:in `process_client'
/Users/frankjmattia/.asdf/installs/ruby/2.6.2/lib/ruby/gems/2.6.0/gems/puma-3.12.1/lib/puma/server.rb:334:in `block in run'
/Users/frankjmattia/.asdf/installs/ruby/2.6.2/lib/ruby/gems/2.6.0/gems/puma-3.12.1/lib/puma/thread_pool.rb:135:in `block in spawn_thread'

我认为这是来自 Capybara 服务器检查 responsive? 但我不确定如何证明它或解决它。

此外,即使所有测试都在本地通过,但在 CI 平台(如 SemaphoreCI)上 运行 时它们会挂起。

如果这是一个错误,那是谁的错误?我 倾向于 Capybara,但 不想浪费任何人的时间来提交错误报告,如果我不了解所有事实,或者无法充分描述它的话。

当 Capybara 在等待服务器启动并确定是 http 还是 https 时尝试向服务器发出 http 请求时,OpenSSL 会输出 SSL "error"。收到错误后,Capybara 将作为 https 请求重试。这不是一个实际影响除输出消息以外的任何东西的错误,"error" 没有理由导致 SemaphoreCI 挂起。

如果 Semaphore 使用 docker 平台并且您 运行ning Chrome >= 73 您可能会发现您需要传递命令行选项 --no-sandbox--disable-features='VizDisplayCompositor' 到 Chrome 以便它正确 运行。

No clue what the EOFError is about though it could have to do with you switching app_host while the page is being requested (page load is not guaranteed to be done when visit returns)

不这样做就解决了我的问题。在我的情况下,不需要将额外的选项传递给 chromedriver。