[英]How to verify that prevous step was a success before moving to next step -Cucumber
[英]Rails + Cucumber: How to wait for javascript to finish before moving on to next step?
我有使用jQuery和Ajax的形式。 表單的一部分依賴於jquery將某些輸入加載到表單中,但是,有時我的測試失敗,因為它們是如此之快以至於它們不等待javascript完成。 有沒有辦法包裝函數以等待javascript響應再繼續? 現在,我只使用sleep 1
:
When(/^I add a product to my collection$/) do
select(Product.first.name, from: "unassociated_product_ids[]")
click_link(">") #<-- uses ajax
sleep 1
end
您不應該嘗試明確地等待AJAX或Javascript完成-相反,您應該嘗試等待頁面更改。
想象一下,通過單擊鏈接運行的JS / AJAX會導致該產品的名稱現在列在頁面的UL / LI元素中。 因此,最初沒有帶有產品名稱文本的LI,但之后便有了。 您的步驟應等待:
...
click_link(">")
page.should have_css("li", :text => Product.first.name)
...
這將一直等到頁面上有帶有產品名稱的LI元素。 等待多長時間? Capybara的默認等待時間為Capybara.default_wait_time
。 您可以在env.rb
設置默認值, env.rb
Capybara.default_wait_time = 5
或類似的值。 當然,如果您知道需要更多時間,則可以臨時更改它。
default_wait_time = Capybara.default_wait_time
Capybara.default_wait_time = 10 # Really long request
# Do stuff
Capybara.default_wait_time = default_wait_time
或使用Capybara.using_wait_time
簡化該過程。
Capybara.using_wait_time(10) do
# Do stuff
end
有時,盡管實際上您可能必須等待AJAX,但等待頁面變得不同可能太困難或根本不可能,而這可能超出了您的控制范圍。 在這種情況下,您可以創建一個自定義方法來等待AJAX並從需要它的任何步驟調用它。
def wait_for_ajax
# See: https://gist.github.com/10c41024510ee9f235e0
# Linked from: http://techblog.fundinggates.com/blog/2012/08/capybara-2-0-upgrade-guide/
start = Time.now
while true
break if (page.evaluate_script("$.active") == 0)
if Time.now > start + Capybara.default_wait_time.seconds
fail "AJAX did not register as complete after #{Capybara.default_wait_time} seconds!"
end
sleep 0.1
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.