2012-12-24 63 views
10

我有一個用於測試UI功能的Cucumber場景。有時由於幾個問題之一,網頁花了很多時間來回應,水豚超時出現以下錯誤。超時重試?

ruby-1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:146:in `rescue in rbuf_fill' 
ruby-1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:140:in `rbuf_fill' 
ruby-1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:122:in `readuntil' 
ruby-1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:132:in `readline' 
ruby-1.9.3-p327/lib/ruby/1.9.1/net/http.rb:2562:in `read_status_line' 
ruby-1.9.3-p327/lib/ruby/1.9.1/net/http.rb:2551:in `read_new' 

我的問題是 -

我可以以某種方式迫使黃瓜方案或Capybara分別重試(恆定的次數),整個場景或步,在超時錯誤?

回答

2

也許,你可以做這樣的:

Around do |scenario, block| 
    for i in 1..5 
    begin 
     block.call 
     break 
    rescue Timeout::Error 
     next 
    end 
    end 
end 

但我想不通,如果這個代碼工作,因爲錯誤(It's not possible to call block several times in Around hook

+0

感謝您的答覆。這篇文章的第二個答案適用於我,但我會牢記這一點。 –

+0

+1我換掉了Timeout :: Error for just Exception。不知道爲什麼Timeout :: Error不會爲我捕捉它。< – kikuchiyo

+0

出於某種原因,使用Timeout :: Error時,它仍未捕獲。放入放置語句,它只運行一次,並失敗一次......哦痛苦運行水豚/硒/ webkit在這個應用程序的痛苦! – kikuchiyo

1

The Cucumber book的:

添加一個eventually method不斷試圖運行一段代碼,直到它停止提高錯誤或達到時間限制。

下面是該方法的代碼:

module AsyncSupport 
    def eventually 
    timeout = 2 
    polling_interval = 0.1 
    time_limit = Time.now + timeout 
    loop do 
     begin 
     yield 
     rescue Exception => error 
     end 
     return if error.nil? 
     raise error if Time.now >= time_limit sleep polling_interval 
    end 
    end 
end 
World(AsyncSupport) 

稱爲被稱爲從step_definition如下的方法:

Then /^the balance of my account should be (#{CAPTURE_CASH_AMOUNT})$/ do |amount| 
    eventually { my_account.balance.should eq(amount) } 
end 
+0

謝謝!這可能解決了我的問題。不再有錯誤。 –

+0

很高興有幫助!如果答案已經幫助你,請將答案標記爲已接受。 –