3

为了简单起见,我省略了大部分测试,只包含了有问题的代码。这是:

click_button('Search')  
page.select 'Preferred', :from => 'ticket_service_type'  

当我运行它时,我收到以下信息:

Failure/Error: page.select 'Preferred', :from => 'ticket_service_type'
Capybara::ElementNotFound:
  cannot select option, no select box with id, name, or label 'ticket_service_type' found`

此按钮单击事件触发的 AJAX 请求与 select 标签没有任何关系,因此在测试中颠倒顺序会导致测试通过。我知道 Capybara 的默认等待时间是 2 秒,所以我将其更改为 10:

Capybara.default_wait_time = 10

这不会导致测试通过。我怎样才能让这两种方法相互配合,并按照用户操作网页的顺序工作?

(如果我发布了规范中的代码,我敢打赌这会很快解决。)

4

2 回答 2

1

来自黄瓜书(重点是我的):

幸运的是,Capybara 知道如何以简单的方式处理这种情况。如果我们添加一个显式调用 find,为页面上尚不存在的 DOM 元素传递一个 CSS 选择器,Capybara 将稍等片刻(50 毫秒)并重试,直到该元素出现。如果它在一段时间后没有出现(默认为两秒,尽管这是可配置的),它将引发异常,导致步骤定义失败。

因此,让您的 AJAX 向 DOM 写入一些内容,然后在您的步骤定义中找到()它。这并不理想。就我而言,我引入了一个(隐藏的)DOM 元素只是为了方便测试,但我还没有找到另一种方法。

于 2012-01-09T22:18:42.540 回答
1

确保添加:js => true到依赖于 JavaScript 的集成测试。

于 2013-12-30T21:43:06.937 回答