0

根据我对文档的理解,这种通用方法应该有效:

begin
 try1
rescue
 try2
rescue
 try3
.
.
.
rescue
 puts "Everybody failed, sorry man!"
end

但是,每当我尝试打开 Watir-Webdriver 浏览器时,它似乎永远不会尝试超过第二个$browser = Watir::Browser.new,在第 189 行结束脚本, 连接被拒绝 - connect(2) (Errno::ECONNREFUSED )

代码.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: unable to get stable firefox connection in 60 seconds (127.0.0.1:7055)

我在哪里出错了,还是有更好的方法来做到这一点?这是 Selenium 或 Watir 特有的东西吗?

4

3 回答 3

2

你的假设是错误的,这不像你期望的那样工作:

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不打印。多个rescues 用于不同的异常类型,您不能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)

这将选择第一个不会失败的方法。但是,如果第二个失败,我看不出最后一个如何成功,您可能会在这里重新考虑您的选择。

于 2012-03-21T17:31:02.103 回答
0

第一个rescue将捕获任何StandardError. 其他人也会如此,但由于这些错误已经被第一个捕获rescue,他们将永远没有机会真正遇到任何错误StandardError

于 2012-03-21T17:28:09.203 回答
0

多个救援用于从不同的异常类型中救援;您所拥有的是一个带有一堆不合格救援的单个块,因此只有一个会触发。您想要嵌套的开始/救援/结束,或完全不同的方法。

于 2012-03-21T17:31:32.570 回答