2015-09-23 96 views
0

我有這樣一個RSpec的測試不再存在:RSpec的水豚元素在X在DOM

within all('tr')[1] do expect(page).to have_content 'Title' expect(page).to have_content 'Sub Title' end

而且它的失敗在expect(page).to have_content 'Title'與以下錯誤消息:

Element at 54 no longer present in the DOM

我一直無法找到這個錯誤信息意味着什麼的確切含義,而且這個測試是有問題的,有時會通過,有時不會。

回答

0

與其他水豚發現者不同,all並不真正等待元素出現在DOM中。所以如果你的表沒有被完全加載,那麼它會直接在該塊內預期並可能失敗。這很容易解釋爲什麼有時會失敗,有時會成功。

我建議在這個塊之前使用另一個期望值,並確保表格完全加載。我不知道您的DOM是什麼樣子,但你可以嘗試這樣的:在這一點上

expect(page).to have_css('tr td', :count => 15) 

所以,你已經移動到你的下一個步驟之前等待15排在DOM露面。希望有所幫助。

+1

#ALL默認情況下不等待自動重新載入,但是可以製成到 - 還有另一個巨大的缺點使用#all像這樣 - 請參閱我的回答 –

+0

感謝您的提示,湯姆! – Phil

0

作爲其他答案的詳細信息,#默認情況下不會等待元素出現,因此您可能實際上沒有獲得您認爲自己的元素。與其他答案中的解決方案不同,可以通過指定:count,:minimum,:maximum或between之間的選項來使#all等待元素出現。

within all('tr', minimum: 10)[1] do 
    ... 
end 

例如。這一切都假設您的測試中的#within之前的操作未觸發將其他行的表中的現有行替換爲其他行的ajax操作。如果行替換正在發生,那麼你可能會遇到使用#all最大的缺點之一 - 當使用#all時,如果返回的元素離開頁面並被替換,它們不能自動重新查詢,因爲它們的整個查詢可以'與它們一起存儲(沒有索引到結果中)。在這種情況下,你就要去更改代碼更好地

within find(:xpath, './/tr[2]') do 
    ... 
end 

這樣你中搜索該元素可以根據需要