连续Ajax请求的非确定性黄瓜测试失败

时间:2013-08-06 20:50:47

标签: ruby-on-rails ajax ruby-on-rails-3 cucumber integration-testing

我们有一个使用

的标准黄瓜整合测试堆栈
  • Ruby v.1.9.3,
  • Rails v.3.2.13
  • Capybara v.2.1.0
  • Capybara-Webkit v.1.0.0
  • FactoryGirl v.4.2.1

我们最近遇到了一个问题,其中涉及多个连续ajax请求的方案集合偶尔会失败并出现以下错误:

    Capybara::Webkit::NodeNotAttachedError (Capybara::Webkit::NodeNotAttachedError)
    ./features/step_definitions/patient_steps.rb:133:in `/^I should see the followin
    g patient names in this order:$/'
    features\searching_patients_index.feature:39:in `Then I should see the following
    patient names in this order:'

有趣的是,这个错误只会在Windows机器上抛出。

对此问题的最典型回应是:

  • 强制执行某种睡眠或wait_until(尽管它已被弃用,我们还是继续使用Capybara v.1.1.3进行尝试)但这没有帮助。

  • 我们尝试增加默认的Capybara等待时间

  • 我们通过检查DOM的特定部分是否可见来尝试“等到 _ 可见”

    When(/^I wait until "(.*?)" is visible$/) do |selector|
      page.has_css?("#{selector}", :visible => true)
    end
    

以下是其中一个失败功能的示例:

    Scenario: Searching and then sorting patients
      When I search for "J"
      And I click on the "Name" header in the "patients" table
      And I wait until ".patient.odd" is visible
      Then I should see the following patient names in this order:
        | names       |
        | Smith, John |
        | Schmo, Jill |
      Then the result content should not include "Drapper, Don"

我们使用Ajax搜索表并按列对其进行排序,因此我们正在测试在排序时搜索是否仍然存在,在此示例中。

如果我们能提供更多信息,请告知我们,并提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

尝试在每个ajax请求开始后添加此内容

 And I wait for the ajax request to finish

 Given /^I wait for the ajax request to finish$/ do
   start_time = Time.now
   result = false
   while result ==  false do
     result = page.evaluate_script('jQuery.active === 0')
     if Time.now >= start_time + 5.seconds
       result = true
     else
       sleep 0.5
     end
   end
   sleep 0.5
 end

这适用于我正在做的事情。我没有用它来排序页面上的列。只要ajax请求等待来自控制器的响应,那么它应该工作