4

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

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

因此,例如,如果我运行类似:

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

浏览器和会话仍保持打开状态。

如果我关闭浏览器并重新运行测试,它会抛出“连接被拒绝 - 连接(2)”异常。

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

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

像这样的假设会很好:

Capybara.new do
    #the tests...
end

或者这个在最后……Capybara.shutdown

我似乎在文档中找不到任何东西。

4

2 回答 2

4

Capybara 的 selenium 驱动程序有一个quit方法。当 Capybara 启动浏览器时,它会注册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
    

这是一个 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

于 2013-08-19T22:27:07.447 回答
-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 是否也在启动未关闭的线程。

无论哪种情况,我都不知道这些选项是否会对您有所帮助,但可以尝试一下。

于 2013-08-18T10:36:56.590 回答