为什么这个Ruby而声明不起作用

时间:2012-11-29 00:49:04

标签: ruby rspec page-object-gem

背景:这是使用page-object和Rspec。页面,对象设置正确。基本上发生的事情是它跳过while语句并直接检查页面上存在的变量label

它应该做的是检查label变量是否在页面上,如果没有,则等待20秒并刷新页面,然后再次检查最多30次,如果它在第30次失败,那么它应该一起失败。如果找到它,那么它应该再次检查并传递它。

def check_label(label, current_page)
  labels_filter_element.click
  check_label_sla(label, current_page)
  current_page.text.should include label
end

def check_label_sla(label, current_page)
  t = 30
  i = 0
  while i < t
    if current_page.text.should include label
      return
    else
      sleep(20)
      current_page.refresh
      i += 1
    end
  end
end

我认为发生的事情是current_page.text.should include label总是返回TRUE,但我不确定。如果需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

我做出以下假设:

  • 您看到的行为是首次加载页面,单击labels_filter_element,标签不在页面上,测试会立即失败而不刷新页面。
  • label是一个字符串

鉴于这些假设,问题在于if语句:

if current_page.text.should include label

执行if语句时,它会断言该页面包含标签:

  • 如果页面有标签,则if中的代码将被执行(即它将立即返回并且check_label中的断言将通过)。
  • 如果页面没有标签,断言将抛出异常,导致测试立即失败(即else代码不会被执行)。因此,测试在check_label_sla方法中失败,而不是在check_label method的末尾(这使得看起来像while循环不起作用)。

您希望if语句检查文本是否包含在内,而不进行断言。因此,你想要:

if current_page.text.include? label

因此,您的check_label_sla方法将成为:

def check_label_sla(label, current_page)
  t = 30
  i = 0
  while i < t
    if current_page.text.include? label
      return
    else
      sleep(20)
      current_page.refresh
      i += 1
    end
  end
end

或者你可以把它减少到:

def check_label_sla(label, current_page)
  30.times do
    return if current_page.text.include? label
    sleep(20)
    current_page.refresh
  end
end