2012-11-29 95 views
-1

背景:這是使用頁面對象和Rspec。頁面,對象設置正確。基本上,它發生的是跳過while語句並直接檢查頁面上存在的變量label爲什麼這個Ruby雖然聲明不起作用

它應該做的是檢查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

我提出如下假設:

  • 您所看到的行爲是在頁面第一次加載時,labels_filter_element被點擊,標籤不是在頁面上,測試立即失敗,而無需刷新頁。
  • label是一個字符串

根據這些假設,問題是if語句:

if current_page.text.should include label 

當執行if語句,它會斷言,頁面包括標記:

  • 如果頁面有標籤,if中的代碼將被執行(即它會立即返回並斷言check_label將會是通過)。
  • 在頁面沒有標籤的情況下,斷言將拋出異常導致測試立即失敗(即其他代碼不會被執行)。因此,該測試在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 
+0

這是正確的,謝謝。 –