是的,我知道我不应该,但我只需要在控制器中运行一点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
我似乎无法在文档中找到任何内容。
答案 0 :(得分:4)
Capybara的硒司机有一个quit
method。当Capybara启动浏览器时,它会注册将调用quit的at_exit
挂钩。
但是,当你想要退出它时,你应该做两件事:
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
答案 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是否正在启动未关闭的线程。
在任何一种情况下,我都不知道这些选项是否会对您有所帮助,但这是值得尝试的。