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