簡體   English   中英

如何兩次恢復水豚錯誤?

[英]How do I rescue a Capybara Error Twice?

我正在使用Capybara檢查頁面中的元素並返回其內容。 如果該元素不存在,我想尋找其他元素的內容並返回。 如果都找不到,我想返回一個空字符串。

這里的挑戰是,當#find失敗時,水豚會引發#find Capybara::ElementNotFound錯誤。

對於選擇大小寫是“返回元素還是空字符串”的情況,這很容易-我只需rescue並返回空字符串,如下所示:

def select_post_meta_name(page)
  selector = 'div.post-name'
  page.find(selector).text
rescue Capybara::ElementNotFound => e
  Rails.logger.warn('Could not get meta name: ' + e)
  ''
end

我將如何重構上面的代碼來處理以下偽代碼的意圖?

# FAKE EMBARRASSING PSEUDO CODE ....
def select_post_meta_name(page)
  selector = 'div.post-name'
  page.find(selector).text
rescue Capybara::ElementNotFound => e
  other_element_selector = 'div.post-title'
  page.find(other_element_selector).text

  rescue Capybara::ElementNotFound => e
    Rails.logger.warn('Could not find any elements: ' + e)
    ''
end
# /FAKE EMBARRASSING PSEUDO CODE ....

您可以在救援塊中使用retry ,也可以使用param再次“遞歸”調用該方法。

def select_post_meta_name(page, meta_name = 'div.post-name')
  re_try = false
  begin
    page.find(meta_name).text
  rescue Capybara::ElementNotFound => e
    if re_try
      Rails.logger.warn('Could not find any elements: ' + e)
    else
      meta_name = 'div.post-title'
      re_try = true
      retry
    end
  end
end

您可以使用一個標志再次調用該方法,該標志表明您正在第二次執行該方法:

def select_post_meta_name(page, selector = 'div.post-name', first_call_of_method = true)
  begin
    page.find(selector).text
  rescue Capybara::ElementNotFound => e
    if first_call_of_method
      select_post_meta_name(page, 'div.post-title', false)
    else
      Rails.logger.warn('Could not find any elements: ' + e)
    end
  end
end

為什么不試試這個,嵌套異常從我所做的事情開始起作用。 這應該可以正常工作,並且第二次引發異常,那么您可以肯定地說您正在做的事情確實被破壞了。

# FAKE EMBARRASSING PSEUDO CODE ....
def select_post_meta_name(page)
  selector = 'div.post-name'
  begin
    page.find(selector).text
  rescue Capybara::ElementNotFound => e
    begin
      other_element_selector = 'div.post-title'
      page.find(other_element_selector).text
    rescue Capybara::ElementNotFound => e
      Rails.logger.warn('Could not find any elements: ' + e)
      ''
    end
  end
end
# /FAKE EMBARRASSING PSEUDO CODE ....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM