我有一系列使用Ruby和Watir gem開發的腳本。那些被Spinach包裹着,但那是我要問的。在超時的情況下向Watir添加重試機制
這些腳本的目的是做一些功能抽查或簡單地減輕一些非常重複的任務。
他們已經運行良好一段時間了,但最近,由於Chromedriver/Geckodriver(嘗試了兩種瀏覽器)和腳本之間的超時,我開始發現很多故障。當然,我可以簡單地重新啓動腳本,但是當成功率低於70%時,它確實開始惡化。
我最終做的是將所有打給Watir的電話都打包在一個Proc中,然後開始救援,在超時的情況下重試。
這是醜陋的,違反了很多規則,我幾乎慚愧不得不訴諸於此解決方案,但至少使用這個我的腳本現在正在完成。
這裏是我工作圍繞這一問題:
# takes a proc and wraps it around a series of rescue
def execute_block_and_rety_if_needed
yield
rescue Net::ReadTimeout
puts 'Read Timeout detected, retrying operation'
retry
rescue Net::HTTPRequestTimeOut
puts 'Http Request Timeout detected, retrying operation'
retry
rescue Errno::ETIMEDOUT
puts 'Errno::ETIMEDOUT detected, retrying operation'
retry
end
樣本使用是這樣的:
execute_block_and_rety_if_needed { @browser.link(name: 'OK').wait_until_present.click } # click the 'OK' button
正如你所看到的,這明顯違反了DRY原則,因爲我需要每次調用這個過程。
我的問題是:如何將其作爲Watir的模塊/功能移動,以便它自動進行拾取。 (理想情況下,我會添加最大數量的重試來防止無限循環)。
版本信息: - Chromedriver => 2.29.461585 - GeckoDriver => 0.16.1 - 火狐=> ESR 52 - 鍍鉻=> 58 - 的Watir => 6.2.1
就作爲DRY評論,我提到了必須將所有Watir調用與proc包裝在一起的事實,如果不清楚,則表示抱歉。
execute_block_and_rety_if_needed { @browser.link(name: 'User').wait_until_present.click } # click the 'Edit' button
execute_block_and_rety_if_needed { @browser.link(name: 'Cancel').wait_until_present.click } # click the 'Cancel' button
execute_block_and_rety_if_needed { @browser.link(name: 'OK').wait_until_present.click } # click the 'OK' button
以上只是一個例子,如果我想使用重試機制必須發生。
請問您可以編輯您的問題,包括'chromedriver'和'geckodriver'版本以及各自的瀏覽器版本嗎?你運行最新的? – orde