Rails SystemTest 中发生 Net::ReadTimeout

use*_*068 2 rspec capybara ruby-on-rails-5

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

目前,我们正在Ubuntu docker上构建rails 5.1.7的开发环境。在此基础上,为了进行包括js在内的视图测试,使用系统测试的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>
Run Code Online (Sandbox Code Playgroud)

规格/视图/hoges/index_spec.rb

<!DOCTYPE html>
<html>
  <head>

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

  <body>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

rails_helper.rb 的一部分

require 'rails_helper'

RSpec.feature 'MetaFramesIndex', type: :system, js: true do
  scenario 'sample' do
    visit hoges_index_path
  end
end
Run Code Online (Sandbox Code Playgroud)

错误日志

  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
Run Code Online (Sandbox Code Playgroud)

我希望响应能够早点返回,而不是超时。

我们将等待答案。

Tho*_*ole 6

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

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