来自Rails 3,从没使用过Capybara / Selenium我现在正在docker中运行Rails 5应用程序,并希望使用“更新的”编写测试的方式,即使用系统,请求和模型规格而不是控制器规格。我添加了另一个与Guard运行同一映像的docker实例,以在发生任何更改时触发相应的测试。而且由于RSpecs系统测试需要Selenium,所以我正在为docker运行官方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
中所有相关的行:
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.>
日志文件的内容:
(0.4ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
(0.2ms) BEGIN
(0.2ms) ROLLBACK
水豚拍摄的屏幕截图:
所有其他测试(请求和模型规格)运行完美,手动进行的所有测试也运行正常。
这是失败的系统规格:
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
答案 0 :(得分:0)
问题是Google拥有TLD app
,并强制浏览器使用HTTPS。这是关于它的链接。
解决方案是不使用app
作为您网站的容器名称。使用website
作为我的网站容器的名称时,我的测试运行良好。
此链接中有关Google TLD的更多信息