如何让 poltergeist/PhantomJS 延迟将页面返回给 Capybara,直到 AJAX 加载完毕?

How to get poltergeist/PhantomJS to delay returning the page to Capybara until AJAX is loaded?

如何防止 PhantomJS 将页面返回给 Capybara 几秒钟以允许 AJAX 完成加载?我要返回的 HTML 正文是:

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

这告诉我 PhantomJS 在页面完成加载其 AJAX 资产之前返回了页面。有什么办法可以减慢速度吗?我试过使用 rasterize.js 解决方案,但看起来好像我添加到 poltergeist 的 "phantomjs_options" 哈希中的任何脚本都被忽略了。

使用等待您的 Capybara 方法,断言页面上的内容仅在 AJAX 完成后才应存在于页面上。例如,如果页面应该仅在 AJAX 完成后显示 "Page loaded!",并且假设您正在使用 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。一些 Capybara 方法 等待,包括 current_pathvisitexecute_scriptevaluate_script 和节点访问器,如 textvalueallfirst 等待,如果你给他们一些选项,让他们有特定的等待(:count:minimum:maximum:between) ,否则他们不会。这是一个雷区。 (我的列表主要来自 this blog post。)

还有其他方法可以等待(sleep(不好),轮询数据库直到出现由 AJAX 引起的更改,等等)但是通常使用等待你的 Capybara 方法和推荐方式。

不确定您实际上在等待什么 css 明智地在加载的页面上,但我会这样做的方式是:

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

其中 x 是您希望水豚在找不到 css 时出错前允许的秒数。

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