【问题标题】:Starting a new capybara session for every test为每次测试开始一个新的 capybara 会话
【发布时间】:2020-09-10 20:00:42
【问题描述】:

我正在尝试为我们的每个 rspec 测试启动一个新的 Capybara 会话,但无法弄清楚如何在完成后正确退出/关闭会话。

这是我的 spec_helper.rb 文件。

RSpec.configure do |config|
  config.include Capybara::DSL

  config.before :each do
      @session = Capybara::Session.new(:selenium)
  end

 config.after :each do
     @session.driver.browser.quit
 end

end

@session.driver.browser.quit 语句会正确关闭浏览器,但对于最后运行的测试,我会收到一条错误消息:

/Users/lpc/.rvm/gems/ruby-1.9.3-p448@capybara/gems/selenium-webdriver-2.37.0/lib/selenium/webdriver/common/file_reaper.rb:32:in `reap': file not added for reaping: "/var/folders/5l/kw4vv8bj7rvc4xv6yfyspkwh0000gn/T/webdriver-profile20131107-96496-cx4x5r" (Selenium::WebDriver::Error::WebDriverError)
from /Users/lpc/.rvm/gems/ruby-1.9.3-p448@capybara/gems/selenium-webdriver-2.37.0/lib/selenium/webdriver/firefox/launcher.rb:45:in `quit'
from /Users/lpc/.rvm/gems/ruby-1.9.3-p448@capybara/gems/selenium-webdriver-2.37.0/lib/selenium/webdriver/firefox/bridge.rb:58:in `ensure in quit'
from /Users/lpc/.rvm/gems/ruby-1.9.3-p448@capybara/gems/selenium-webdriver-2.37.0/lib/selenium/webdriver/firefox/bridge.rb:58:in `quit'
from /Users/lpc/.rvm/gems/ruby-1.9.3-p448@capybara/gems/selenium-webdriver-2.37.0/lib/selenium/webdriver/common/driver.rb:168:in `quit'
from /Users/lpc/.rvm/gems/ruby-1.9.3-p448@capybara/gems/capybara-2.1.0/lib/capybara/selenium/driver.rb:140:in `quit'
from /Users/lpc/.rvm/gems/ruby-1.9.3-p448@capybara/gems/capybara-2.1.0/lib/capybara/selenium/driver.rb:17:in `block in browser'

我认为问题是因为 Capybara 在所有测试结束时也退出了浏览器。有谁知道执行此操作的正确方法以及如何使此错误消息静音?感谢您的帮助。

====更新=====

为了结束这个循环,我发布到 Capybara 谷歌组,我的问题已修复并合并到 master 中。

https://groups.google.com/forum/#!topic/ruby-capybara/tZi2F306Fvo

【问题讨论】:

  • 为什么每次测试都需要一个新会话?通常只删除 cookie 就足够了 - 例如使用 @session.reset! 或使用 capybara/rspec。
  • 我可能想错了,但我们使用的是 capybara + webdriver/sauce。 Sauce 会记录您的测试视频。每个驱动程序实例有一个视频,所以我试图让每个测试有一个驱动程序,而不是简单地为驱动程序清除 cookie。这样,每个测试都会有自己的视频,并具有独立的结果。
  • 我遇到了同样的问题。试试这个:groups.google.com/d/msg/ruby-capybara/RYkpdB6uUTA/7q8VxTMmN0QJ

标签: rspec capybara


【解决方案1】:

试试Capybara.reset_session!

feature "my test" do    
  after { Capybara.reset_sessions! }
  
  scenario "my scenario" do
    # your assertions
  end
end

【讨论】:

    【解决方案2】:

    老问题,但我刚遇到这个问题。如果您有 Capybara::Session,则浏览器在每个 SPEC 之后保持打开状态,从而在您运行多个 SPEC 文件时产生多个浏览器。没有Capybara:Session的退出方法,所以需要先获取驱动对象再退出。我通常在每个 SPEC 文件的末尾添加:

    after :all do
      @capybara_session.driver.quit()
    end
    

    @capybara_session 是 Capybara::Session 对象。

    【讨论】:

      【解决方案3】:

      也许您可以使用一种调味方法来剪辑录音,然后在您的after 中调用它?

      不是在每次测试后退出,也许您可​​以在每次测试之前退出?如果您在尝试退出之前遇到错误,那么也许有一种方法可以查看一个是否已经在运行?如果没有,你可以做一个可怕的、讨厌的 hack:在 after 中设置一个全局变量,让你知道有一个可以退出的驱动程序。

      【讨论】:

      • 我尝试在每次测试前退出。聪明的主意。但是,我仍然收到 reap 错误。我认为对于我打开的每个驱动程序,它都会在结束钩子中退出该驱动程序,所以无论我何时运行它,我都会得到那个 reap 错误(这只是一个猜测)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      相关资源
      最近更新 更多