ruby-on-rails – 在控制器中运行水豚以测试一些东西,但只能运行一次

是的,我知道我不应该,但我只需要在控制器中运行一点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

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

最佳答案 Capybara的selenium驱动程序有一个
quit method.当Capybara启动浏览器时,它会注册at_exit钩子,它将调用quit.

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

>自己调用Capybara.page.driver.quit
> 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

点赞