我正在开发一个Rails 4应用程序。在应用程序中,有一个页面有一个模态形式,我试图测试其行为如下:
<li>
表单
<li>
表单
<li>
元素的正确数量用于计算<li>
元素数量的web_step使用了expect(all())
RSpec期望,如下所示:
Then(/^I should see the number of items equals "(.*?)"$/) do |number_of_ items |
expect(all(:xpath, xpath_items).length).to eq(number_of_ items.to_i)
end
xpath_items
正在正确收集元素。
问题
我正在进行断续的黄瓜测试失败。我认为Capybara在JS在DOM中更改它们之前,正在寻找要计数(和失败)的<li>
元素。我认为expect(all())
是罪魁祸首,但不确定重构或使其一致工作的最佳方式。
修复失败
我试图通过几种方法修复这种竞争条件,包括(1)增加Capybara.default_wait_time = 120
,(2)将sleep(10)
添加到web_steps(我认为是反模式),(3)在page.document.synchronize
中包装web_step功能,如图所示
How to use synchronize in Capybara exactly?
我知道wait_until
方法已从Capybara中删除,如here.
堆栈:rails 4.0.3,黄瓜1.5.15,capybara 2.2.1,selenium-webdriver 2.41.0,angular.js,jquery,bootstrap。 FWIW ......我的机器是Retina MacBook Pro i7,非常快。
任何想法都赞赏。谢谢!
答案 0 :(得分:1)
Capybara提供选项(:count,:minimum,:maxium,:between),用于指定要等待的元素数量。假设您使用的是最新版本的Capybara,现在可以在all
中使用它们。
通过指定:count
,您可以告诉all
方法等待显示特定数量的项目。这可以添加到您的步骤中:
Then(/^I should see the number of items equals "(.*?)"$/) do |number_of_ items|
expect(all(:xpath, xpath_items, count: number_of_ items.to_i).length).to eq(number_of_ items.to_i)
end
然而,这对我来说似乎有点难以理解。我建议切换到使用have_selector
,它确实支持这些选项。有了这个,您可以简化步骤:
Then(/^I should see the number of items equals "(.*?)"$/) do |number_of_ items|
expect(page).to have_selector(:xpath, xpath_items, count: number_of_ items.to_i)
end