0

我们有一个标准的黄瓜集成测试堆栈,使用

  • 红宝石 v.1.9.3,
  • 导轨 v.3.2.13
  • 水豚 v.2.1.0
  • Capybara-Webkit v.1.0.0
  • 工厂女孩 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 机器上抛出。

对这个问题最典型的反应是:

  • 强制执行某种 sleep 或 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 来搜索表格并按列对其进行排序,因此在此示例中,我们正在测试排序时搜索是否仍然存在。

如果我们可以提供任何进一步的背景信息,请告诉我们,并提前感谢您的帮助!

4

1 回答 1

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 请求正在等待控制器的响应,它就应该可以工作

于 2013-08-13T19:10:03.333 回答