在控制器中运行capybara来测试一些东西,但只能运行一次

时间:2013-08-17 21:00:04

标签: ruby-on-rails ruby unit-testing cucumber capybara

是的,我知道我不应该,但我只需要在控制器中运行一点Capybara脚本。

问题是它打开了浏览器和所有内容,但我想完成关闭测试或单独运行它。

例如,如果我运行类似:

Capybara.current_driver = :selenium
Capybara.app_host = 'https://www.google.com'
Capybara.visit("/")
Capybara.has_content?('foo')
Capybara.reset_sessions!

浏览器和会话仍处于打开状态。

如果我关闭浏览器并重新运行测试,则会抛出“Connection refused - connect(2)”异常。

我必须重新启动整个rails应用才能重新运行测试。

有一种方法可以一次又一次地运行并重新运行几个Capybara测试,而无需重新启动任何东西?

像这样假设的东西会很好:

Capybara.new do
    #the tests...
end

或最后...... Capybara.shutdown

我似乎无法在文档中找到任何内容。

2 个答案:

答案 0 :(得分:4)

Capybara的硒司机有一个quit method。当Capybara启动浏览器时,它会注册将调用quit的at_exit挂钩。

但是,当你想要退出它时,你应该做两件事:

  1. 自己调用Capybara.page.driver.quit
  2. Monkeypatch Capybara,以便当Capybara在您关闭浏览器时尝试关闭浏览器时不会出现错误:

    # from https://github.com/jnicklas/capybara/blob/master/lib/capybara/selenium/driver.rb#L9
    # code inside at_exit hook is removed
    class Capybara::Selenium::Driver
      def browser
        unless @browser
          @browser = Selenium::WebDriver.for(options[:browser], options.reject { |key,val| SPECIAL_OPTIONS.include?(key) })
        end
        @browser
      end
    end
    
  3. 这是一个POC代码 - https://gist.github.com/abotalov/6274926


    如果您只需要“一些Capybara命令”,您还可以根据需要编写辅助方法:

    def with_capybara(&block)
      Capybara.app_host = 'http://www.stackoverflow.com'
      session = Capybara::Session.new(:selenium)
      block.call(session)
      session.driver.browser.quit
    end
    

    这也是POC代码 - https://gist.github.com/abotalov/6274999

答案 1 :(得分:-2)

我不能说我理解你为什么要这样做......但是这里有几件事要尝试。

来自:https://github.com/jnicklas/capybara

  

交易和数据库设置

     

一些Capybara司机需要跑    针对实际的HTTP服务器。 Capybara负责这件事并开始    在与测试相同的过程中为您提供一个,但在另一个线程上。    Selenium是其中一个驱动程序,而RackTest则不是。

鉴于此,在使用Selenium时,Capybara需要启动实际的HTTP服务器,您应该尝试使用RackTest等替代驱动程序。 Capybara可能不明白您需要关闭HTTP服务器。

另外,从同一部分:

  

也可以强制您的ORM使用相同的事务   所有线程。这可能会导致线程安全问题,并可能导致   奇怪的失败,所以要谨慎使用这种方法。有可能   通过以下猴子补丁在ActiveRecord中实现:

class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil

  def self.connection
    @@shared_connection || retrieve_connection
  end
end
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection

您可以尝试使用提供的补丁来查看Capybara是否正在启动未关闭的线程。

在任何一种情况下,我都不知道这些选项是否会对您有所帮助,但这是值得尝试的。