簡體   English   中英

Rails + Cucumber:在繼續下一步之前,如何等待javascript完成?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM