使用#all时如何在Capybara等待

时间:2016-03-22 13:11:06

标签: ruby capybara

我知道wait_until由于某种原因被从Capybara移除。 Capybara擅长等待,在使用find时等待正常,但在处理AJAX应用程序时,有时我必须使用all方法。例如,我正在处理一个HTML表,我可以通过单击列名来对其进行排序。当我对列名称应用排序然后调用all(td, text: column_name)时,它会返回排序前存在的值,因为all方法不会像find方法那样等待。我目前正在使用定制助手wait_for_ajax来处理这种情况。我不想传递额外的:wait参数。有没有更好的方法来处理它?<​​/ p>

3 个答案:

答案 0 :(得分:1)

如果您正在测试应用程序,那么这相对容易,因为您知道测试数据,因此您可以执行类似

的操作
expect(page).to have_css('table tr:first-child', text 'text first in order when sorted')

一旦排序发生,它将等待表的第一行具有应首先出现在排序顺序中的文本。

如果您正在进行屏幕抓取或测试应用程序,而您在某种程度上不知道测试数据,则会变得更加困难。当您对列进行排序时,除了行的顺序之外,页面上的任何内容都会发生变化吗?是否有排序指示器,排序列标题突出显示等?如果是这样,你可以等待它,假设在更新列之前它实际上没有更新(如果它在点击后立即更新,那么这将不起作用,并且可能实际上是一个糟糕的UI,因为你可以结束数据不一致)。例如,如果列标题获得“已排序”类,则可以执行类似

的操作
expect(page).to have_css('table th td.sorted', text: 'text of the column header you sorted by')

将等待正确的标题指示它已被排序。

如果确实没有任何变化表明排序已经完成,那么你运气不好而且你已经遇到了应该使用wait_for_ajax之类的极少数情况之一。

注意:在这种情况下,传递:wait选项根本不会对您有所帮助。这是因为等待找到匹配元素的最大时间量,#all有效匹配0个元素 - 它仍会立即返回(没有任何计数选项)在另一个答案中提到,正如你所指出的那样,无论如何都不会帮助你。)

答案 1 :(得分:1)

我使用它来加载所有HTML内容,然后才触发事件。只要您想指定等待

,就可以调用此方法
def wait_for_ajax
  Timeout.timeout(Capybara.default_wait_time) do
    loop do
      active = page.evaluate_script('jQuery.active')
      break if active == 0
    end
  end
end

答案 2 :(得分:0)

这是 char * strA = "00000000000000", * strB = "-", strC[50]; int x = 4; strncpy(strC,strA,x); strC[x]= '\0'; strcat(strC,strB); strcat(strC,strA+x); printf("%s\n",strC); return 0; 方法实际上是正确选择的边缘情况之一。继承我的实现,不使用Tom提出的wait_for_ajax会导致错误。

Timeout