Ваше предположение неверно, это не работает так, как вы ожидаете:
irb(main):062:0> begin
irb(main):063:1* raise StandardError
irb(main):064:1> rescue
irb(main):065:1> puts "test1"
irb(main):066:1> raise StandardError
irb(main):067:1> rescue
irb(main):068:1> puts "test2"
irb(main):069:1> end
test1
StandardError: StandardError
from (irb):66:in `rescue in irb_binding'
from (irb):62
from /usr/bin/irb:12:in `<main>'
test2
не печатается.Несколько rescue
для разных типов исключений, вы не можете перехватывать ошибки в других rescue
блоках.Вы могли бы вместо этого использовать вложенные begin/rescue
блоки, но этот случай кажется достаточно сложным, чтобы использовать более общий подход:
methods = [
lambda { Watir::Browser.new(:firefox, :profile => "botmode") },
lambda { Watir::Browser.new(:remote, :url => "http://127.0.0.1:4444/wd/hub", :desired_capabilities => :firefox) },
lambda { Watir::Browser.new(:remote, :url => "http://127.0.0.1:4444/wd/hub", :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.htmlunit(:javascript_enabled => true, :cssSelectorsEnabled=>true, :nativeEvents=>false) ) },
lambda { Watir::Browser.new(:remote, :url => "http://5.19.111.226:4444/wd/hub", :desired_capabilities => :firefox) },
]
def get_first_successful(methods)
methods.each do |m|
begin
return m.call
rescue
end
end
nil
end
$browser = get_first_successful(methods)
Это выберет первый метод, который не потерпит неудачу.Однако я не понимаю, как последний может быть успешным, если второй не удался, вы можете переосмыслить свои варианты здесь.