我们有一个使用
的标准黄瓜整合测试堆栈我们最近遇到了一个问题,其中涉及多个连续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搜索表并按列对其进行排序,因此我们正在测试在排序时搜索是否仍然存在,在此示例中。
如果我们能提供更多信息,请告知我们,并提前感谢您的帮助!
答案 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请求等待来自控制器的响应,那么它应该工作