[英]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.