11

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

这是我的辅助方法:

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

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

4

3 回答 3

5

tutor的 HTML 页面中是否隐藏了文本?has_content?返回truehtml 中存在的任何文本,包括不可见的隐藏文本。所以我宁愿用 替换它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

无论如何,这比每次都等待固定的超时要好。

于 2017-01-10T21:32:05.457 回答
1

此测试通过,因为tutor页面上已经存在。

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

于 2013-10-30T09:35:46.507 回答
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

于 2013-01-30T15:28:37.780 回答