docker

【Rails5.2】Docker 環境下でのRSpecで ERR_SSL_PROTOCOL_ERROR の解決

・Docker環境でRSpec(Capybara)実行したらERR_SSL_PROTOCOL_ERRORが発生。
・発生内容と解決方法の紹介

経緯

先日、Docker環境でRSpecを試していたらエラーが多発しました。
自分のコーディングミスもあったのですが、その中でもハマりかけた部分もあったので紹介したいと思います。

【Rails5.2 Selenium】Docker 環境下でのRSpec のSystem test実行方法 ・Docker環境でRSpecを試したらエラー発生・解消方法とDocker環境でのRSpec導入方法を紹介 経緯 継続して...

環境情報

各種バージョンとライブラリは下記となります。

名前バージョン
Ruby 2.6.3
Rails5.2.1
言語

Gem名バージョン
rspec-rails 3.9.1
selenium-webdriver 3.142.7
webdrivers 4.6.1
Gemfile

Gemfileの「webdrivers」ですが、最初は「chromedriver-helper」を使っていました。
ですがbundle installしたときに警告が表示されたため、「webdrivers」 を使っています。

エラー内容

root@498c7375a236:/var/www/taskleaf# rspec spec/system/tasks_spec.rb 
Capybara starting Puma...
* Version 3.12.6 , codename: Llamas in Pajamas
* Min threads: 0, max threads: 4
* Listening on tcp://app:39643
2021-08-28 06:27:38 +0000: HTTP parse error, malformed request (): #<Puma::HttpParserError: Invalid HTTP format, parsing fails.>
---
F

Failures:

  1) タスク管理機能 一覧表示機能 ユーザーAがログインしているとき ユーザーAが作成したタスクが表示される
     Failure/Error: visit login_path
     
     Selenium::WebDriver::Error::UnknownError:
       unknown error: net::ERR_SSL_PROTOCOL_ERROR
         (Session info: chrome=92.0.4515.107)
エラー

解決方法

docker-compose.ymlのコンテナ名が「app」のときに起きる事象です。
そのためコンテナ名を「app」以外に変更する必要があります。

docker-compose.yml

変更前

version: "3"

services:
  app:
    build: ./app_rails
    ports:
      - "3000:3000"
    environment:
      - "DATABASE_HOST=db"
      - "DATABASE_PORT=5432"
      - "DATABASE_USER=postgres"
      - "DATABASE_PASSWORD=mysecretpassword1234"
      - "SELENIUM_DRIVER_URL=http://selenium_chrome:4444/wd/hub"

変更後

version: "3"

services:
  web:
    build: ./app_rails
    ports:
      - "3000:3000"
    environment:
      - "DATABASE_HOST=db"
      - "DATABASE_PORT=5432"
      - "DATABASE_USER=postgres"
      - "DATABASE_PASSWORD=mysecretpassword1234"
      - "SELENIUM_DRIVER_URL=http://selenium_chrome:4444/wd/hub"

4行目のコンテナ名を「app」以外の「web」に変更しました。

spec/support/capybara.rb 修正

require 'capybara/rspec'

RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :selenium, using: :headless_chrome, options: {
      browser: :remote,
      url: ENV.fetch("SELENIUM_DRIVER_URL"),
      desired_capabilities: :chrome
    }
    Capybara.server_host = 'web'
    Capybara.app_host="http://#{Capybara.server_host}"
  end
end

capybara用に作成した設定ファイルでもコンテナ名(app)を使っています。
10行目部分をwebに変更します。

動かした結果

以上で設定完了です。
「rspec」コマンドからテストを実行して期待通りの結果となっていることを確認します。

root@20ee950b6800:/var/www/taskleaf# rspec spec/system/tasks_spec.rb 
Capybara starting Puma...
* Version 3.12.6 , codename: Llamas in Pajamas
* Min threads: 0, max threads: 4
* Listening on tcp://web:41281
.

Finished in 5.57 seconds (files took 8.68 seconds to load)
1 example, 0 failures
rspec

参考記事

SSL Error on RSpec system tests in dockerized Rails 5 app with selenium/standalone-chrome
https://stackoverflow.com/questions/55551663/ssl-error-on-rspec-system-tests-in-dockerized-rails-5-app-with-selenium-standalo