黄瓜Capybara Selenium种族状况与期待(全部())

时间:2014-06-19 21:49:32

标签: javascript ruby-on-rails selenium cucumber capybara

我正在开发一个Rails 4应用程序。在应用程序中,有一个页面有一个模态形式,我试图测试其行为如下:

  1. 单击链接以打开模式,
  2. 点击链接,通过JS
  3. 添加<li>表单
  4. 输入一些字段数据,通过JS提交
  5. 查看已填充的表单项目
  6. 点击链接,通过JS
  7. 添加另一个<li>表单
  8. 输入更多字段数据,通过JS提交
  9. 查看已填充的表单项目
  10. 确认<li>元素的正确数量
  11. 用于计算<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,非常快。

    任何想法都赞赏。谢谢!

1 个答案:

答案 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