Ruby on rails 3 带黄瓜的waitForElement+;硒

Ruby on rails 3 带黄瓜的waitForElement+;硒,ruby-on-rails-3,testing,selenium,cucumber,Ruby On Rails 3,Testing,Selenium,Cucumber,嘿,大家好,我正在尝试修复我的许多场景,这些场景使用高级AJAX测试页面,并通过JQuery构建客户端屏幕,但有很多问题 主要是,我很难知道某些AJAX请求何时完成。我试过让睡眠延迟,但从长远来看这是个坏主意。我还尝试了一些我在网上找到的方法来检查AJAX调用是否都完成了,但是这些方法似乎不够稳定 我开始更多地探索Selenium,并找到了waitForXXX函数。我兴奋地把它们扔到我的黄瓜台阶上,但没有运气。我当前的测试用例是一个动态加载的网格,它通过AJAX获取数据。(Jquery数据网格插

嘿,大家好,我正在尝试修复我的许多场景,这些场景使用高级AJAX测试页面,并通过JQuery构建客户端屏幕,但有很多问题

主要是,我很难知道某些AJAX请求何时完成。我试过让睡眠延迟,但从长远来看这是个坏主意。我还尝试了一些我在网上找到的方法来检查AJAX调用是否都完成了,但是这些方法似乎不够稳定

我开始更多地探索Selenium,并找到了waitForXXX函数。我兴奋地把它们扔到我的黄瓜台阶上,但没有运气。我当前的测试用例是一个动态加载的网格,它通过AJAX获取数据。(Jquery数据网格插件)。我通过查找第一个非标题行来查找数据,然后单击它。单击元素的代码为:

page.all(:css, "#{arg1} tr")[1].click();
有时这样做是可行的,但通常不会,因为行尚未加载。所以我试着:

waitForElementPresent("css=#{arg1} tr:nth-child(1)")
在单击该行之前,但每当它到达该行代码时,我都会从ruby得到一个极好的错误:

stack level too deep (SystemStackError)
我做错了什么,有没有更好的方法来编写这些步骤以确保它们真正等待AJAX调用完成


请注意,应用程序本身工作正常-这只是为了让我的测试代码可靠地变为绿色。

我很幸运地完成了下面的步骤(我们从其他人那里获得了)。它是朝着敏捷性/敏捷性的方向发展的(我们曾经使用过),但对于普通黄瓜/水豚来说,它非常好:

When /^I wait for the AJAX call to finish$/ do
  keep_looping = true
  while keep_looping do
    sleep 0.10
    begin
      count = page.evaluate_script('window.running_ajax_calls')
      keep_looping = false if count.respond_to?(:to_i) && count.to_i == 0
    rescue => e
      raise e
    end
  end
  sleep 0.20
end

你可能需要调整循环睡眠和睡眠后。这些值对于同时运行12核测试的Mac Pro非常有用。在极少数情况下,我们增加了额外的1秒等待。

我倾向于在尝试与元素交互之前调用
has\u css?
方法,例如

page.should have_css("#{arg1} tr")

Capybara将重试,直到(可配置的)默认等待时间到期。一旦通过此步骤,您应该能够按预期单击该元素-或者,如果该元素在等待时间到期之前未出现,则该步骤将失败。

多亏了Alistar关于page.Where have_css的提示,我制作了一个通用示例。如果同时有多个AJAX,这可能不起作用,但对我来说它相当轻量级

在我的application.html.erb中,我包含了一个简单的空白div:

<div id="ready"/>
然后在Cucumber的常用步骤中,我有一个非常简单的“等待AJAX”步骤定义:

When /^I wait for AJAX$/ do
page.should have_css("#ready")
结束


在第一次测试中,这似乎是可行的。这是另一种剥猫皮的方法,所以它可能不会一直起作用,但在我的情况下,它又好又轻。

是的,这也是我使用过的方法,但最近它一直让我感到舒服。我将清理我的代码,并再次尝试。这可能仍然是首选方法。当我有机会的时候,我会再试一次,但就像我说的,出于某种原因,它似乎并不总是对我有效。很可能是程序错误。嗯,不错。我将尝试做一个通用版本的这个,并将其张贴在上面,如果它的工作。嗯,这没有工作,以及希望。仍然有很多地方,特别是远程加载的网格,似乎不能正常等待。回到下面Tihm的方法。
When /^I wait for AJAX$/ do
page.should have_css("#ready")