繁体   English   中英

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

[英]Rails, Capybara.using_session(...), visiting a page, and having ruby-debug causes rspec suite seem to hang after run even though all specs passing

轨道7.0.4

Rspec 3.11.0

水豚3.37.1

硒网络驱动程序(宝石)4.5.0

在 Gemfile 中使用 Ruby 调试( gem 'debug', platforms: %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 块内使用visit访问页面(如果我删除访问或 using_session,它会起作用)

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

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

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

Capy 挂看起来像: 在此处输入图像描述

我的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,它应该会立即解决您的问题。

从头开始复制

  1. 分叉StrangeCapyHangForward回购。
  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. bundle install && 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. 在 StrangeCapyHangForward 中将gem 'selenium-webdriver', '4.7.1'添加到您的Gemfile中。
  2. bundle install
  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

添加了工作selenium-webdriver gem 的示例 Gemfile

# 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 没有正确kill所有测试进程有关,尽管这很难确认。 在我们强制升级许多 gem(包括依赖项)之前,我们的测试套件和并发性也遇到了很大的麻烦。

例如,在升级之前运行rspec几次并 grep 你的进程: ps -ax | grep rspec ps -ax | grep rspec 你会在那里看到很多现有的。 我确实检查了selenium-webdrive 变更日志,看看是否有任何明显的原因会导致这种情况,但我没有看到任何东西。

无论如何,希望这会有所帮助! 祝你好运!

尝试删除调试 gem,因为它可能导致水豚出现问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM