rails 7.0.4
Rspec 3.11.0
capybara 3.37.1
selenium-webdriver (gem) 4.5.0
在 Gemfile 中使用 Ruby 调试(gem 'debug',平台:%i[ mri mingw x64_mingw ]
)
每当我尝试添加 Capybara.using_session
调用时,我的套件就会挂起。
它在完成所有规范后挂起,即使通过。
我的驱动程序设置为:
Capybara.default_driver = :selenium_chrome_headless
但我注意到如果我将驱动程序更改为 Capybara.default_driver = :selenium_chrome
也会发生这种情况
这是重现它的规范:
require 'rails_helper'
describe "client app", type: :feature do
describe "when starting the experience", type: :feature do
# TODO: figure out why capy is hanging here
it "can load the home page" do
# THIS CAUSES AFTER-RSPEC HANG even though all specs pass
Capybara.using_session("client session") do
visit "/"
end
end
it "loads with a client id" do
visit '/'
end
end
end
我已将它隔离到这三个条件:
使用 Capybara.using_session 并在 using_session block 内使用
visit
访问页面(如果我删除 visit 或 using_session,它会起作用)在同一套件的另一项测试中,使用
visit
访问任何其他页面(如果我删除了其他规范中的visit
调用,它会起作用)debug
gem (ruby-debug)(如果我从 Gemfile 中删除gem 'debug', platforms: %i[ mri mingw x64_mingw ]
)
这是一个非常奇怪的错误。
我的 spec/rails_helper.rb
文件是
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require_relative '../config/environment'
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
require 'capybara/rails'
require 'capybara/rspec'
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }
RSpec.configure do |config|
config.use_transactional_fixtures = true
config.infer_spec_type_from_file_location!
config.filter_rails_from_backtrace!
end
Capybara.default_driver = :selenium_chrome_headless
重要提示:尽管到目前为止我已经将它隔离开来,但奇怪的是我无法进一步隔离它,甚至无法在新的 Rails 应用程序中重现它,即使这个 Rails 应用程序只有一个月的历史。
在这里,我已将应用程序损坏的地方取出并删除了所有其他内容(真的,我删除了所有内容但挂起仍然发生)。
我已将剩余代码与新生成的应用程序仔细比较,奇怪的是我无法在新应用程序中重现相同的错误(使用完全相同的规范和设置),因此它必须涉及我还看不到的第四个未知变量。
再生产
这里是简单的复制应用程序: https://github.com/jasonfb/StrangeCapybaraHang
此应用程序是作为我的应用程序的 FORK 创建的,然后我删除了所有非必要的内容。请注意,它几乎不包含任何内容,并且仅包含 1 个规范。
当我在此应用程序上运行 rspec(已损坏)时,请参阅“调试器:在进程 77726 后附加到子进程 77733”并且该套件在运行后挂起
在这里,在第二次尝试重现问题时,我尝试前进以创建错误:https://github.com/jasonfb/StrangeCapyHangForward
我设置了一个新的 Rails 应用程序,然后尝试重新创建上述所有条件以产生错误...但是...我无法在这个新应用程序中重现该错误!!
所以这意味着即使我已经确定了 bug 的 3 个元素,也必须有一个我还没有看到的第 4 个元素。
请注意,在此应用程序中,它与出现错误的其他存储库具有完全相同的规范(请参阅 spec/system/test_capy_hand_spec.rb)、完全相同的 rails_helper 文件、完全相同的 Gems 等。
但是,在这个应用程序上,我从来没有看到“调试器:在进程 77726 之后附加到子进程......”,即使 debug
Gem 在 Gemfile 中也是如此。 这是为什么?
我也没有看到挂起。
2022-12-15 已解决!
最佳答案
长话短说
问题出在 selenium-webdriver
gem 中。从您的 StrangeCapybaraHang 项目中的 4.5.0 升级到 4.7.1,它应该会立即解决您的问题。
从头开始复制
- 叉StrangeCapyHangForward repo 。
- 运行
./bin/setup && yarn build
。请注意,如果 esbuild 未全局安装,您需要使用yarn add esbuild
添加它,因为 package.json 中缺少它。 - 将
selenium-webdriver
gem 降级到与 StrangeCapybaraHang 中相同的版本.例如,在您的 Gemfile 的:test
组中:gem 'selenium-webdriver', '4.5.0'
捆绑安装 && rspec
。它挂了。
添加了 selenium-webdriver
gem 的 Gemfile 示例
# Gemfile of StrangeCapyHangForward
group :development, :test do
gem 'debug', platforms: %i[ mri mingw x64_mingw ]
gem 'rspec-rails'
# add the older version of the gem
gem 'selenium-webdriver', '4.5.0'
end
修复步骤
- 将
gem 'selenium-webdriver', '4.7.1'
添加到 StrangeCapyHangForward 中的 Gemfile . 捆绑安装
- 运行
rspec
。别再挂了!
注意:您可能需要 grep 并终止现有的 rspec 进程。例如:
ps -ax | grep rspec
# take process ids for all the above and run (substituting 71529 for your pids):
kill -9 71529
示例 Gemfile 添加了工作 selenium-webdriver
gem
# Example Gemfile with working version of selenium-webdriver
group :development, :test do
gem 'debug', platforms: %i[ mri mingw x64_mingw ]
gem 'rspec-rails'
# add selenium-webdrive gem coded to 4.7.1
gem 'selenium-webdriver', '4.7.1'
end
我认为这个问题与并发性和 rspec 没有正确杀死
所有测试进程有关,尽管这很难确认。在我们强行升级许多 gem(包括依赖项)之前,我们的测试套件和并发性也遇到了很大的麻烦。
例如,在升级之前运行 rspec
几次并 grep 您的进程:ps -ax | grep rspec
.你会在那里看到很多现有的。我确实检查了 selenium-webdrive changelog看看是否有任何明显的原因会导致这种情况,但我什么也没看到。
无论如何,希望这对您有所帮助!祝你好运!
关于ruby-on-rails - Rails、Capybara.using_session(...)、访问页面和进行 ruby-debug 导致 rspec 套件在运行后似乎挂起,即使所有规范都通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74722080/