我的规格有问题,没有超时。我的一些规范已经到了一定程度,然后就挂起来了。我确定其中一个规范出了问题,导致它被破坏,我不明白的是,当我定义了超时时,它们为什么会无限期地挂起……
# frozen-string-literal: true
require 'rspec'
require 'capybara/rspec'
require 'capybara/dsl'
require 'selenium-webdriver'
require 'site_prism'
Dir[File.dirname(__FILE__) + '/page_objects/*/*.rb'].each do |page_object|
require page_object
end
def wait_for_ajax
Timeout.timeout(Capybara.default_max_wait_time) do
loop until page.evaluate_script('jQuery.active').zero? && page.has_no_css?(".k-loading-color")
end
end
def whole_page
Capybara.current_session
end
Capybara.register_driver :selenium do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome)
end
Capybara.default_driver = :selenium
Capybara.app_host = #REDACTED
Capybara.default_max_wait_time = 20
RSpec.configure do |config|
config.before(:each) do
config.include Capybara::DSL
end
config.after(:each) do
Capybara.reset_sessions!
end
end
发布于 2018-05-08 06:25:06
您没有提到它挂起的是什么命令,但我会猜测它在您的wait_for_ajax
方法中。如果是这样的话,那是因为您正在使用Timeout.timeout
,这是使用Ruby提供的方法最危险的。它的工作方式是启动第二个线程,当超时发生时,该线程将在原始线程中引发异常。这样做的问题是,异常可能发生在原始线程的任何地方,这意味着如果timeout
调用中的块正在做一些非常重要的事情,它可能会以完全不可恢复的状态结束(网络通信等)。基本上,只有在对其代码块中发生的每一件小事都有非常详细的了解的情况下,才能安全地使用Timeout.timeout
,这意味着不应该在调用第三方库时有效地使用它。相反,如果你需要超时,你应该只使用计时器和睡眠。就像这样
def wait_for_ajax
start = Time.now
until page.evaluate_script('jQuery.active').zero? && page.has_no_css?(".k-loading-color", wait: false) do
sleep 0.1
raise <Some Error> if (Time.now - start) > Capybara.default_max_wait_time
end
end
也就是说,你真的不应该需要具有可用的UI和正确编写的测试的wait_for_ajax
。
此外,通过包含capybara/rspec
,您已经设置了在每次测试后调用reset_sessions
,并将Capybara::DSL
包含在应该包含在https://github.com/teamcapybara/capybara/blob/master/lib/capybara/rspec.rb#L9中的测试类型中。因此,通过添加您自己的after
块,您最终只能在每次测试后调用reset_sessions
两次,这只是浪费时间。
https://stackoverflow.com/questions/50222543
复制相似问题