【问题标题】:Why Is This Ruby While Statement Not Working为什么这个 Ruby While 语句不起作用
【发布时间】:2012-11-29 00:49:03
【问题描述】:

背景:这是使用页面对象和 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,我认为正在发生的事情,但我不确定。如果需要更多信息,请告诉我。

【问题讨论】:

    标签: ruby rspec page-object-gem


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2014-02-23
      • 1970-01-01
      相关资源
      最近更新 更多