Net :: ReadTimeout 发生在 Rails SystemTest

Net :: ReadTimeout occurs in Rails SystemTest

执行rspec时,长时间没有反应,然后出现Net::ReadTimeout:,测试失败。

目前,我们正在 Ubuntu docker 上为 rails 5.1.7 构建开发环境。 并且在这上面,为了做包含js的view测试,测试环境搭建了系统测试selenium_chrome_headless

我删除了 application.html.erb 的来源以确定错误发生的位置。 结果发现<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>会超时。 下面是一些代码。

application.html.erb

<!DOCTYPE html>
<html>
  <head>

    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
  </body>
</html>

spec/views/hoges/index_spec.rb

require 'rails_helper'

RSpec.feature 'MetaFramesIndex', type: :system, js: true do
  scenario 'sample' do
    visit hoges_index_path
  end
end

rails_helper.rb

的一部分
  Capybara.register_driver :selenium_chrome_headless do |app|
    browser_options = ::Selenium::WebDriver::Chrome::Options.new
    browser_options.args << '--headless'
    browser_options.args << '--no-sandbox'
    browser_options.args << '--disable-gpu'
    Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
  end

  config.before(:each) do |example|
    if example.metadata[:type] == :system
      driven_by :selenium_chrome_headless, screen_size: [1400, 1400]
    end
  end

错误日志

     Failure/Error: visit hoges_index_path

     Net::ReadTimeout:
       Net::ReadTimeout

     [Screenshot]: tmp/screenshots/failures_r_spec_example_groups_hoges_index_sample_529.png

~~~~

     # /usr/local/bundle/gems/selenium-webdriver-3.142.3/lib/selenium/webdriver/remote/http/default.rb:129:in `response_for'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.3/lib/selenium/webdriver/remote/http/default.rb:82:in `request'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.3/lib/selenium/webdriver/remote/http/common.rb:64:in `call'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.3/lib/selenium/webdriver/remote/bridge.rb:167:in `execute'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.3/lib/selenium/webdriver/remote/w3c/bridge.rb:567:in `execute'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.3/lib/selenium/webdriver/remote/w3c/bridge.rb:59:in `get'
     # /usr/local/bundle/gems/selenium-webdriver-3.142.3/lib/selenium/webdriver/common/navigation.rb:32:in `to'
     # /usr/local/bundle/gems/capybara-2.18.0/lib/capybara/selenium/driver.rb:49:in `visit'
     # /usr/local/bundle/gems/capybara-2.18.0/lib/capybara/session.rb:274:in `visit'
     # /usr/local/bundle/gems/capybara-2.18.0/lib/capybara/dsl.rb:50:in `block (2 levels) in <module:DSL>'
     # ./spec/views/hoges/index_spec.rb:7:in `block (2 levels) in <top (required)>'

我希望响应早点回来,不要超时。

我们将等待答案。

如果响应仅在第一次测试时超时,则可能是构建资产管道花费的时间太长。一种解决方案是在 运行 测试之前为测试环境预编译资产。另一个潜在的问题是,如果您安装的 chromedriver 与您 运行 的 Chrome 版本不匹配。您可以通过使用 webdrivers gem 来解决这个问题(首先完全删除 chromedriver-helper gem - 包括它已安装的任何二进制垫片)。

你logs/code提出的其他问题是你运行的水豚版本是18个月前发布的,是时候更新了(在当前版本中你可以增加通讯超时通过将 :timeout 选项传递给 Capybara::Selenium::Driver.new - https://github.com/teamcapybara/capybara/blob/master/lib/capybara/selenium/driver.rb#L42)。此外,您还不清楚为什么要编写实际上是系统规范的视图规范。