0

ドキュメントの私の理解から、この一般的なアプローチはうまくいくはずです:

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

ただし、Watir-Webdriver ブラウザーを開こうとするたびに、2 番目の$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 を失敗させるために、存在しない X サーバーに事前に DISPLAY=:88 を意図的に設定したので、このエラーは問題ありません: 186: 60 秒で安定した firefox 接続を取得できません (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印刷されません。複数の s は異なる例外タイプ用です。そのような他のブロック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)

これにより、失敗しない最初のメソッドが選択されます。ただし、2 番目のオプションが失敗した場合に、最後のオプションがどのように成功するかはわかりません。ここでオプションを再考してください。

于 2012-03-21T17:31:02.103 に答える
0

複数のレスキューは、さまざまな例外タイプからレスキューするためのものです。あなたが持っているのは、資格のない救助がたくさんある単一のブロックなので、1つだけがトリガーされます. ネストされた開始/レスキュー/終了、またはまったく別のアプローチが必要です。

于 2012-03-21T17:31:32.570 に答える
0

最初のものrescueは任意のStandardError. 他のエラーも同様ですが、これらのエラーは最初の によってすでにキャッチされているrescueため、実際にStandardError.

于 2012-03-21T17:28:09.203 に答える