Ошибка SSL в системных тестах RSpec в док-приложении Rails 5 с селеном / standalone-chrome - PullRequest
1 голос
/ 06 апреля 2019

Исходя из Rails 3 и никогда не использовавшей Capybara / Selenium, я сейчас запускаю приложение на Rails 5 в докере и хочу использовать «обновленный» способ написания тестов, то есть использовать спецификации системы, запроса и модели, а не спецификации контроллера.Я добавил еще один экземпляр докера, работающий с тем же образом с Guard, чтобы запускать соответствующие тесты, когда что-то менялось.И поскольку системным тестам RSpecs требуется Selenium, я запускаю официальный selenium/standalone-chrome образ для докера.Кажется, все подключено идеально, однако системные тесты не пройдены, потому что кажется, что Selenium пытается использовать SSL.Почему это так, если я четко просил использовать http?Можно ли как-то это отключить?

Я использую docker-compose, чтобы все заработало, и важными частями docker-compose.yml являются:

version: '3.5'

services:

  app:
    build: .
    volumes:
      - .:/srv/mldb
    ports:
      - "3000:3000"
    depends_on:
      - db
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    tty: true

  guard:
    build: .
    volumes:
      - .:/srv/mldb
    depends_on:
      - app
      - chrome
    command: bundle exec guard --no-bundler-warning --no-interactions
    tty: true
  chrome:
    image: selenium/standalone-chrome
    volumes:
      - /dev/shm:/dev/shm
    ports:
      - "4444:4444"

ИВот все соответствующие строки из spec/rails_helper.rb, которые я использую для настройки Capybara и Selenium:

selenium_url = "http://chrome:4444/wd/hub"

Capybara.register_driver :selenium_remote do |app|
  Capybara::Selenium::Driver.new(
    app,
    browser: :remote,
    url: selenium_url,
    desired_capabilities: :chrome)
end

RSpec.configure do |config| 
  config.before(:each, type: :system, js: true) do
    driven_by :selenium_remote
    host! "http://app:3000"
  end
end

Ошибки, которые я получаю при выполнении примера теста, который просто пытается заполнить поле ввода инажмите кнопку подтверждения.

Из контейнера Guard, в котором запущена системная спецификация:

1) Movie management given correct input values allows user to create movie
    Capybara::ElementNotFound:
       Unable to find button "New Movie"

Из контейнера приложения, в котором запущены рельсы:

2019-04-06 16:28:22 +0000: HTTP parse error, malformed request (): #<Puma::HttpParserError: Invalid HTTP format, parsing fails.>

Содержимое журнала-file:

   (0.4ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
   (0.2ms)  BEGIN
   (0.2ms)  ROLLBACK

И снимок экрана, который делает Capybara:

Ошибка

Все остальные тесты (спецификации запроса и модели) работают отлично итестирование всего вручную работает также отлично.

Вот системная спецификация, которая не работает:

require 'rails_helper'                                                                                

RSpec.describe "Movie management", type: :system, js: true do                                         

  context "given correct input values" do                                                             

    it "enables users to create movies" do                                                            
      visit "/movies"                                                                                 
      expect(page).to_not have_text("Hellboy")                                                        

      click_button "New Movie"                                                                        

      fill_in "Titel", with: "Hellboy"                                                                
      fill_in "Jahr", with: "2004"                                                                    

      click_button "Film anlegen"                                                                     

      expect(page).to have_current_path("/movies")                                                    
      expect(page).to have_text("Film erfolgreich angelegt.")                                         
      expect(page).to have_text("Hellboy")                                                            
      expect(page).to have_text("2004")                                                               
    end                                                                                               
  end                                                                                                 
end                        

1 Ответ

0 голосов
/ 11 апреля 2019

Проблема в том, что Google владеет доменами верхнего уровня app и принудительно заставляет браузер использовать HTTPS.Вот ссылка об этом.

https://superuser.com/questions/1276048/starting-with-chrome-63-urls-containing-app-redirects-to-https

Решение состоит в том, чтобы не использовать app в качестве имени контейнера для вашего веб-сайта.При использовании website в качестве имени контейнера для моих сайтов мои тесты выполнялись нормально.

Подробнее о доменах Google в этой ссылке

https://chromium.googlesource.com/chromium/src/net/+/master/http/transport_security_state_static.json#285

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...