在Capybara有更好的替代方案吗?

时间:2013-01-16 22:24:01

标签: ruby-on-rails cucumber capybara

在我的测试中,我有一个步骤,我填写一个字段,然后按回车键。然后,该字段将在下一页返回结果集。

这是我的助手方法:

def search(term)
  fill_in('query-text', :with => term)
  click_button('search-button')
end

之后我有一个简单的说法:

page.should have_content(tutor)

然而,问题在于,即使我的页面加载了结果后的页面,即使它应该为假,它也会通过。我在步骤中设置了一个调试器,当我手动检查它时,断言失败,因为我也期望它。我的假设是下一步是在页面重新加载之前检查。我在搜索方法结束时进行了一次睡眠,使其看起来像:

def search(term)
  fill_in('query-text', :with => term)
  click_button('search-button')
  sleep 5
end

但我觉得使用睡眠是解决这个问题的一种黑客方法。我正在使用Capybara 2,因此删除了wait_until的使用。有没有更好的方法来处理这个问题而不是依赖睡眠?

3 个答案:

答案 0 :(得分:5)

您的HTML页面中隐藏了tutor个文字吗?对于html中存在的任何文本,has_content?都会返回true,包括不可见的隐藏文字。所以我宁愿用expect(page).to have_text(tutor)替换它,它只检查页面上的可见文本。 .text也是一种非常慢的方法,所以这些额外的分秒可能对你很方便。

另一种方法是在规范助手中恢复wait_until方法,因为在大多数情况下它非常方便:

def wait_until(timeout = DEFAULT_WAIT_TIME)
  Timeout.timeout(timeout) do
    sleep(0.1) until value = yield
    value
  end
end

在任何情况下,每次等待固定超时都会好一些。

答案 1 :(得分:1)

此测试在页面上已存在tutor时通过。

因此,您应该检查不是tutor,而是检查其他内容,例如对于文本tutor的元素,仅在页面重新加载后才会出现。

答案 2 :(得分:0)

是的,你是对的wait_until被删除,新方法是#synchronize,但我现在还不知道如何使用它:)

了解

http://www.elabs.se/blog/53-why-wait_until-was-removed-from-capybara

https://github.com/jnicklas/capybara/blob/master/lib/capybara/node/base.rb#L44