Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby没有超越第一个救援代码?_Ruby_Exception Handling_Selenium_Watir Webdriver_Rescue - Fatal编程技术网

ruby没有超越第一个救援代码?

ruby没有超越第一个救援代码?,ruby,exception-handling,selenium,watir-webdriver,rescue,Ruby,Exception Handling,Selenium,Watir Webdriver,Rescue,根据我对文件的理解,该一般性原则应适用于: begin try1 rescue try2 rescue try3 . . . rescue puts "Everybody failed, sorry man!" end 但是,每当我尝试打开Watir Webdriver浏览器时,它似乎从未尝试过第二个$browser=Watir::browser.new,在第189行结束脚本,连接被拒绝-connect(2)(Errno::ECONNREFUSED) Code.rb: begin $

根据我对文件的理解,该一般性原则应适用于:

begin
 try1
rescue
 try2
rescue
 try3
.
.
.
rescue
 puts "Everybody failed, sorry man!"
end
但是,每当我尝试打开Watir Webdriver浏览器时,它似乎从未尝试过第二个$browser=Watir::browser.new,在第189行结束脚本,连接被拒绝-connect(2)(Errno::ECONNREFUSED)

Code.rb:

begin
 $browser = Watir::Browser.new(:firefox, :profile => "botmode") # **line 186**

rescue
 $browser = Watir::Browser.new(:remote, :url => "http://127.0.0.1:4444/wd/hub", :desired_capabilities => :firefox)   # **line 189**

rescue  # local selenium htmlunit
  puts __LINE__.to_s + ": #{$!}"    
#  $browser = Watir::Browser.new(:remote, :url => "http://127.0.0.1:4444/wd/hub", :desired_capabilities => :htmlunit)  # but needs Javascript for AJAX support...
  $browser = 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) ) 

rescue # Try to use VentanaPC if still failing..  
 $browser = Watir::Browser.new(:remote, :url => "http://5.19.111.226:4444/wd/hub", :desired_capabilities => :firefox)  

rescue  # no browser left to failover to
  puts __LINE__.to_s + ": #{$@.to_s}"
end

# ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [i686-linux]
为了使第186行失败,我特意提前将DISPLAY=:88设置为一个不存在的Xserver,所以这个错误是可以的:186:无法在60秒内获得稳定的firefox连接(127.0.0.1:7055)


我哪里做错了,还是有更好的方法?这是Selenium或Watir特有的吗?

第一次
救援
将捕获任何
标准错误
。其他人也会这样,但由于这些错误已经被第一次
救援
捕获,他们将永远没有机会实际遇到任何
标准错误

您的假设是错误的,这并不像您预期的那样起作用:

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>'

这将选择第一个不会失败的方法。但是,我不知道如果第二个失败了,最后一个怎么可能成功,您可以在这里重新考虑您的选择。

多个救援用于从不同的异常类型中进行救援;你所拥有的只是一个街区,有一堆不合格的救援,所以只有一个街区会触发。您需要嵌套的begin/rescue/ends,或者完全不同的方法。

我已经编写了嵌套,它可以工作,但很快就变得非常混乱,当时我只需要不断尝试代码块,直到一个代码块工作为止。我不知道有哪种方法是精益的——除非有一种方法可以在每次
救援后重置异常类型处理?@Marcos看到Niklas的答案,尽管我可能只是将参数保存在地图或其他东西中,而不是使用lambdas——这并不重要。谢谢!我在脚本中广泛使用这种重试故障切换,代码块通常有几行长。在我的个人库中添加了
get\u first\u successful
。这里的最后一个/4个方法使用了另一个主机,我确认它在
irb
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)