如何在水豚场景中添加等待条件?

时间:2011-11-17 06:08:44

标签: ruby-on-rails cucumber capybara

我正在使用capybara来测试我的rails应用程序以进行集成测试。 在我的应用程序中,有许多Lightbox和Ajax和js调用。

 @javascript   
  Scenario: I agree functionatilty
   Given I go to the create account page
   When I click on button which is given as image "lnkTerms2"
   And I follow "i_agree"
   Then I go to the create account page

在上面的代码中,lnkTerms2是和id,它将帮助调用js函数来打开灯箱。 我收到错误

   Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotDisplayedError)
      [remote server] resource://fxdriver/modules/atoms.js:9519:in `unknown'
      [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/fxdriver@googlecode.com/components/nsCommandProcessor.js:256:in `unknown'
      [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/fxdriver@googlecode.com/components/nsCommandProcessor.js:305:in `unknown'
      [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/fxdriver@googlecode.com/components/nsCommandProcessor.js:320:in `unknown'
      [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/fxdriver@googlecode.com/components/nsCommandProcessor.js:197:in `unknown'
      (eval):2:in `send'
      (eval):2:in `click_link'
      ./features/step_definitions/web_steps.rb:300:in `/^I click on button which is given as image "([^"]*)"$/'
      features/Sign_up_process.feature:61:in `When I click on button which is given as image "lnkTerms2"'

问题是在webdriver中调用此函数,没有时间加载javascript和ajax调用。 灯箱没有打开。 所以请建议我任何解决方案。

如果我想写一行

When I click on button which is given as image "lnkTerms2"

在4到5个语句之后,它正常工作,因为它有时间加载js。

3 个答案:

答案 0 :(得分:12)

通常固定的睡眠/等待是一件坏事。它们是一种蛮力的方法,要么导致脚本脆弱,脚本速度慢,要么两者兼而有之。如果你没有将它们设置得足够长,那么偶尔测试会中断,如果你将它们设置得太长,那么测试永远不会中断但是它们很慢,因为所有固定的拇指都在缩短时间。

大多数自动化工具要么自动处理等待,要么提供更优雅的方式来将脚本与应用程序同步

A recent blog posting by JNicklas解释了Capybara在这方面最近的一些变化,提供了一些为一些特殊情况做某些特定等待条件类型代码的方法的例子,并且通常建议更多地了解工具以及它如何处理等待的东西,ajax动作和同步。

答案 1 :(得分:3)

在等待ajax的步骤之后暂停尝试:

And I wait 5 seconds

您必须添加到web_steps.rb下一个代码:

When /^I wait (\d+) seconds?$/ do |seconds|
  sleep seconds.to_i
end

答案 2 :(得分:1)

等待固定的秒数,希望您的方案足够快,这不是最好的策略,因为它可能会导致随机测试失败。我建议你等到满足某些条件:

And I wait until '#meow' is visible

#...
When /^I wait until '([^']+)' is visible$/ do |selector|
  wait_until do # you can also specify timeout here
    find(selector).visible?
  end
end