检查capybara中多个文本节点的内容时的时间问题

时间:2012-01-31 17:31:44

标签: ruby selenium capybara

我们在页面上有一个快速搜索字段,可以通过AJAX调用过滤上一次搜索的结果列表。

我们尝试了几种检查更改列表内容的方法。

一开始,有一个列表,例如这样:

<div class="search-list">
  <div class="entry">
    <div class="job-title">Manager</div>
    ...
  </div>
  <div class="entry">
    <div class="job-title">Slave</div>
    ...
  </div>
</div>

快速搜索后,整个搜索search-list将被替换为AJAX响应,并删除第二个entry div。

我们尝试使用以下语句检查此情况:

page.find('.search-list .job-title').map(&:text) =~ ['Manager']

但它只能在AJAX请求发出之前看到状态。这可能是由于在不等待完成AJAX请求的情况下立即检查条件。我们尝试了几种方法,比如设置Selenium驱动程序的resynchronize选项。

在上面的线前面放一个睡眠10确实有效,但这是一个不干净的解决方案。目前我们还不知道如何让这个工作,还有其他人吗?

1 个答案:

答案 0 :(得分:6)

我使用wait_until的辅助方法等待ajax完成,然后进行测试。

或许类似于:

page.wait_until { page.evaluate_script "jQuery.active == 0" }
page.find('.search-list .job-title').map(&:text) =~ ['Manager']

wait_until等待块返回true(尽管稍后会超时)。您还可以传递超时值wait_until(5),以便在分配的时间后退出。

你也可以提升你的Capybara等待时间。

Capybara.default_wait_time = 10

Angular.js的更新

angular.element.active == 0以同样的方式运作。

jQuery.active == 0 stil在Angular.js中工作,但不确定是否因为我将jQuery作为我的javascript库的一部分。