Capybara似乎没有等待(因为它应该做!?)(Async ajax事件)

时间:2013-11-02 08:56:12

标签: rspec capybara

我们有一个后台进程,当处理(从另一台服务器,UNIX进程)完成时,我们轮询并重新加载图表。

我不能让Capybrara正确等待(尽管普遍认为应该这样做)

它是一个AJAX事件,它轮询数据库,然后在完成后刷新页面内容。时间,即使是测试,也是多种多样的 - sleep n.seconds有时会起作用,但并非总是如此。

  • 我尝试过expect(page.has_content)assert page.has_textfindhas_content。 似乎没有人真正等待。
  • 我将超时设置为90秒。一般来说,后台进程超过20秒。
  • 我尝试了不同的default_wait_time

我发现很多文章声称它应该在默认的轮询/超时内等待。我们应该检查一下吗?请注意,我们通过Poltergeist无头。

在显示器上没有更改的CSS对象,它只是一个字符串(这是从puts page.html获取以调试测试)

从此

            <div class="bill-summary-strap-line">
              Calculating your bill costs
              <br/>
            </div>

到此

<div class="bill-summary-strap-line">
                 Calculating finished
              <br/>
            </div>

我们缺少什么?

下面的RSpec代码,真的希望有人有一些指导解决了这类问题。 干杯 本

       puts page.html  # test
       #assert page.has_text?('Calculating your bill costs')
       expect(page).to have_content 'Calculating your bill costs'
       page.driver.render("#{LOGDIR}/output1.png", :full => true)
       sleep 30.seconds  # would like to remove this
       puts page.html # test output
       #page.should have_content("Calculating finished")
       #expect(page.has_content? "Calculating finished").to be_true
       assert page.has_text?("Calculating finished") 
       page.driver.render("#{LOGDIR}/output2.png", :full => true)

2 个答案:

答案 0 :(得分:5)

spec_helper中,您有以下代码:

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, {debug: false, :default_wait_time => 30, :timeout => 90})
end

我的猜测是这个超时基本上被忽略了,因为Capybara本身会根据Capybara.default_wait_time设置超时。这可以解释为什么你的时间在规范中设置为2。

poltergeist docs建议您在spec_helper

中使用此功能
require 'capybara/poltergeist'
Capybara.javascript_driver = :poltergeist

您不需要注册或重新注册驱动程序。

答案 1 :(得分:0)

Gabe Berke-Williams写了一篇关于:)的文章 你可以编写自己的助手让Capyabara等待ajax 见http://robots.thoughtbot.com/automatically-wait-for-ajax-with-capybara