2016-03-19 36 views
2

如何讓PhantomJS將頁面返回給水豚幾秒鐘以允許AJAX完成加載? HTML正文我得到的回覆是:如何讓poltergeist/PhantomJS延遲返回頁面到Capybara,直到加載AJAX?

<!--div class='loading'>PLEASE WAIT WHILE PAGE LOADS</div--> 

這是告訴我,PhantomJS返回頁面之前的頁面加載完成其AJAX資產。有什麼辦法可以減緩這種情況嗎?我試過使用rasterize.js解決方案,但它看起來好像我添加到poltergeist的「phantomjs_options」哈希中的任何腳本都被忽略了。

回答

3

使用等待你的Capybara方法,只有在AJAX完成後,斷言內容在頁面上應該存在於頁面上。例如,如果頁面應該顯示「Page loaded!」 AJAX已經完成後才和假設你使用RSpec的,這樣做:

expect(page).to have_content("Page loaded!") 

然後,您可以安全地測試頁面上的其他東西,取決於AJAX已經完成。

水豚方法在於等待指定的內容顯示包括findfind_*方法,withinhas_content?/has_no_content?has_css?/has_no_css?has_selector?/has_no_selector?click_*fill_incheckuncheckselectchoose。一些水豚方法不需要等待,包括current_path,visit,execute_script,evaluate_script和節點存取器如textvalueallfirst等待你給他們的選項,給他們一些特定的等待(:count,:minimum,:maximum,:between),否則他們不會。這是一個雷區。 (我把名單主要來自this blog post。)

還有其他的方式來等待(sleep(壞),輪詢數據庫中,直到引起AJAX出現的變化等),但使用水豚的方法是等待你的是通常和推薦的方式。

+0

好吧,我給了一個去,但我仍然得到空身體標籤。我正在看的網站是用Angular.js編寫的,似乎在「ng-cloak」標籤中被覆蓋,這意味着它不會渲染任何東西,直到它準備好呈現所有內容。有沒有辦法請求頁面,然後延遲幻像渲染幾秒鐘? – bkunzi01

+0

不是我所知道的。你可以在你的測試中「睡覺」,但是這可以保證一個慢速測試。我真的會試着找到一些你可以等待的內容。我用這種方式測試了很多Angular。此外,請確保poltergeist [配置爲重新引發Javascript錯誤](https://github.com/teampoltergeist/poltergeist#customization),以便您知道該頁面是否因某個原因而被渲染。 –

+0

當我做了一切事情,從「訪問」後的代碼沉睡到添加rasterize.js,但是,但似乎得到任何比機械化或Nokogiri會得到更多。只要喜歡的東西:

< -! - > 如果您有任何更多的建議我會非常感激它,因爲它已經兩天,我仍然< - -
!>在廣場一大聲。 – bkunzi01

0

不知道你實際上是在等待CSS明智加載的頁面上,但我會做到這一點的方法是:

Capybara.using_wait_time(x) { page.find('css_here') } 

其中x是你想要豚允許示數,如果之前的秒數它無法找到CSS。

0
expect(page).to have_content "Page loaded!", wait: x