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)。此外,您还不清楚为什么要编写实际上是系统规范的视图规范。
执行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)。此外,您还不清楚为什么要编写实际上是系统规范的视图规范。