2014-02-13 36 views
0
visit "/whatever" 
expect(page).to have_no_content "This is loaded in asynchronously" 

這應該失敗,但通過。爲什麼?當頁面第一次加載時,內容不存在,並且Capybara合理地不等待它。水豚:驗證ajax加載的內容不存在

什麼是等待這個內容的幸運方式,現在水豚2.0宣佈了wait_until壞消息?

回答

1
visit "/whatever" 
wait_for_ajax do 
    expect(page).to have_no_content "This is loaded in asynchronously" 
end 

然後,在spec_helper

def wait_for_ajax 
    page.evaluate_script("jQuery.active") == 0 
    yield 
end 

這將評估腳本,直到它是真實的,那麼運行斷言。

1
visit "/whatever" 
wait_for_ajax do 
    expect(page).to have_no_content "This is loaded in asynchronously" 
end 

然後,在spec_helper

def wait_for_ajax 
    sleep(Capybara.default_wait_time) 
    yield 
end 

請注意,此等待每次運行該規範時水豚的default_wait_time結束。但我不確定你會如何檢查這樣的事情。如果你的ajax執行得很快,你可以通過將default_wait_time設置爲1秒來彌補這一點。

+0

此頁面解釋了爲什麼wait_until被折舊:http://www.elabs.se/blog/53-why-wait_until-was-removed-from-capybara所以說那個page.should not_have方法現在將使用水豚等待時間有效。 chadoh的第一個例子是我的投票處理ajax也加載,第二個 - 我的規則是永遠不會使用睡眠方法。它是一種可靠的方法,可以讓你的測試變得緩慢。 – Dono

+0

如果內容當前存在,並且您斷言不應存在,或者存在您宣稱應該存在的內容,則網頁將等待。但是,如果你斷言內容不存在,並且不存在,它就會停止在那裏等待。它不會等待檢查內容是否最終沒有通過ajax加載。但在這種情況下,我需要它。 – chadoh

+1

啊,我現在得到你想要實現的。試試這個鏈接http://www.natontesting.com/2012/02/27/a-solution-to-ajax-errors-with-capybara-against-a-jquery-site/。根據您的水豚版本,您可能需要刪除wait_until。這樣你的步驟可以等待ajax完成然後斷言。 – Dono