ruby-on-rails - Rails、Capybara.using_session(...)、访问页面和进行 ruby​​-debug 导致 rspec 套件在运行后似乎挂起,即使所有规范都通过

标签 ruby-on-rails capybara ruby-debug

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

我已将它隔离到这三个条件:

  1. 使用 Capybara.using_session 并在 using_session block 内使用 visit 访问页面(如果我删除 visit 或 using_session,它会起作用)

  2. 在同一套件的另一项测试中,使用 visit 访问任何其他页面(如果我删除了其他规范中的 visit 调用,它会起作用)

  3. debug gem (ruby-debug)(如果我从 Gemfile 中删除 gem 'debug', platforms: %i[ mri mingw x64_mingw ])

这是一个非常奇怪的错误。

Capy hang 看起来像: enter image description here

我的 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”并且该套件在运行后挂起 enter image description here

在这里,在第二次尝试重现问题时,我尝试前进以创建错误:https://github.com/jasonfb/StrangeCapyHangForward

我设置了一个新的 Rails 应用程序,然后尝试重新创建上述所有条件以产生错误...但是...我无法在这个新应用程序中重现该错误!!

所以这意味着即使我已经确定了 bug 的 3 个元素,也必须有一个我还没有看到的第 4 个元素。

请注意,在此应用程序中,它与出现错误的其他存储库具有完全相同的规范(请参阅 spec/system/test_capy_hand_spec.rb)、完全相同的 rails_helper 文件、完全相同的 Gems 等。

但是,在这个应用程序上,我从来没有看到“调试器:在进程 77726 之后附加到子进程......”,即使 debug Gem 在 Gemfile 中也是如此。 这是为什么?

没有看到挂起。

enter image description here

2022-12-15 已解决!

最佳答案

长话短说

问题出在 selenium-webdriver gem 中。从您的 StrangeCapybaraHang 项目中的 4.5.0 升级到 4.7.1,它应该会立即解决您的问题。

从头开始复制

  1. StrangeCapyHangForward repo 。
  2. 运行 ./bin/setup && yarn build。请注意,如果 esbuild 未全局安装,您需要使用 yarn add esbuild 添加它,因为 package.json 中缺少它。
  3. selenium-webdriver gem 降级到与 StrangeCapybaraHang 中相同的版本.例如,在您的 Gemfile 的 :test 组中:gem 'selenium-webdriver', '4.5.0'
  4. 捆绑安装 && 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

修复步骤

  1. gem 'selenium-webdriver', '4.7.1' 添加到 StrangeCapyHangForward 中的 Gemfile .
  2. 捆绑安装
  3. 运行 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/

相关文章:

ruby-on-rails - Capybara + Selenium + RSpec —将JS设置为true时发生LoadError

ruby-on-rails - 可以安装gem ruby​​-debug,但是rails server找不到

ruby-on-rails - 如何使用 around_action 包装每个 Rails ActiveRecord 查询

ruby-on-rails - rspec/capybara : how to simulate incoming POST requests?(机架测试不起作用)

ruby-on-rails - Rails 3 中图像路径的完整 url

ruby-on-rails - 当 Guard 在监视文件中运行规范时,Rspec/Capybara "feature"方法未定义,手动运行时有效

ruby - 确定程序是否在 Debug模式下运行

ruby - 如何使用 Ruby 1.9.3 在 Aptana 3 中获得调试支持?

ruby-on-rails - validate_presence_of 无法按预期使用增量计数器

ruby-on-rails - devise.en.yml 文件内的变量