为什么Ruby While语句不起作用

为什么Ruby While语句不起作用,ruby,rspec,page-object-gem,Ruby,Rspec,Page Object Gem,背景:这是使用页面对象和Rspec。页面中的对象设置正确。基本上是跳过while语句,直接检查页面上存在的变量标签 它应该做的是检查标签变量是否在页面上,如果没有,则等待20秒并刷新页面,然后再次检查多达30次,如果在第30次失败,则应一起失败。如果它找到它,那么它应该再次检查并通过它 def check_label(label, current_page) labels_filter_element.click check_label_sla(label, current_page)

背景:这是使用页面对象和Rspec。页面中的对象设置正确。基本上是跳过while语句,直接检查页面上存在的变量
标签

它应该做的是检查
标签
变量是否在页面上,如果没有,则等待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
def检查标签(标签,当前页面)
标签\过滤器\元素。单击
检查\u标签\u sla(标签,当前页面)
当前_page.text.应包括标签
结束
def检查标签sla(标签,当前页面)
t=30
i=0
而我
如果当前_page.text.应包含标签
返回
其他的
睡眠(20)
当前页面。刷新
i+=1
结束
结束
结束

我认为如果
current\u page.text.should include label
总是返回TRUE,那么就会发生什么,但我不确定。如果需要更多信息,请告诉我。

我正在做以下假设:

  • 您看到的行为是,首先加载页面,单击labels\u filter\u元素,标签不在页面上,测试立即失败,而不刷新页面
  • 标签
    是一个字符串
鉴于这些假设,问题在于if语句:

if current_page.text.should include label
执行if语句时,它将断言页面包含以下标签:

  • 如果页面有标签,将执行If中的代码(即它将立即返回,并且
    check\u label
    中的断言将通过)
  • 在页面没有标签的情况下,断言将抛出异常,导致测试立即失败(即else代码将不会执行)。因此,测试在
    check\u label\u sla
    方法中失败,而不是在
    check\u label方法的末尾失败(这使得while循环似乎不起作用)
您希望if语句检查文本是否包含在内,而不进行断言。因此,您需要:

if current_page.text.include? label
因此,您的
检查标签\u 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