0

watir-webdriver を使用して Chrome の一連の Web サイトをループしようとしていますが、特定の Web サイトで常にエラーが発生します。最近、http://adage.comでこの問題が発生しました。ループはhttp://adage.comに到達するまで完全に実行され、次のエラーが表示されるまでハングします。

/Users/default/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/net/protocol.rb:146:in `rescue in rbuf_fill': Timeout::Error (Timeout::Error)
from /Users/default/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/net/protocol.rb:140:in `rbuf_fill'
from /Users/default/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/net/protocol.rb:122:in `readuntil'
from /Users/default/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/net/protocol.rb:132:in `readline'
from /Users/default/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/net/http.rb:2562:in `read_status_line'
from /Users/default/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/net/http.rb:2551:in `read_new'
from /Users/default/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/net/http.rb:1319:in `block in transport_request'
from /Users/default/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/net/http.rb:1316:in `catch'
from /Users/default/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/net/http.rb:1316:in `transport_request'
from /Users/default/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/net/http.rb:1293:in `request'
from /Users/default/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/net/http.rb:1286:in `block in request'
from /Users/default/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/net/http.rb:745:in `start'
from /Users/default/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/net/http.rb:1284:in `request'
from /Users/default/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/remote/http/default.rb:82:in `response_for'
from /Users/default/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/remote/http/default.rb:38:in `request'
from /Users/default/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/remote/http/common.rb:40:in `call'
from /Users/default/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/remote/bridge.rb:598:in `raw_execute'
from /Users/default/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/remote/bridge.rb:576:in `execute'
from /Users/default/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/remote/bridge.rb:536:in `getActiveElement'
from /Users/default/.rvm/gems/ruby-1.9.3-p125/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/common/target_locator.rb:60:in `active_element'
from /Users/default/.rvm/gems/ruby-1.9.3-p125/gems/watir-webdriver-0.6.1/lib/watir-webdriver/browser.rb:136:in `send_keys'
from /Users/default/Dropbox/beta_scripts/loop_test.rb:16:in `rescue in <main>'
from /Users/default/Dropbox/beta_scripts/loop_test.rb:11:in `<main>'

これを回避する方法がわかりません。タイムアウトを設定し、ESCレスキュー中にキーを送信してChromeがページをロードしないようにしましたが、成功しませんでした. 最終的には、500 以上の Web サイトの配列を連続して確実にロードできるようにしたいと考えていますが、Web サイトの 1 つがハングする可能性があることを考えると、これは不可能に思えます。遅いページの読み込みを止めて、配列内の次の要素に移動する方法はありますか?

以下は、問題を切り分ける私のコードの短縮版です。

#!/usr/bin/env ruby

require 'watir-webdriver'

b = Watir::Browser.new :chrome

sites = ["twitter.com", "cars.com", "autotrader.com", "rolex.com", "newyorker.com", "adage.com", "theatlantic.com", "pcmag.com"]

sites.each do |uri|
  begin
    Timeout::timeout(10) do
      b.goto uri
    end
  rescue Timeout::Error => e_time
    sleep 5
    b.send_keys :escape
    p "#{uri} is taking forever to load (#{e_time})"
  rescue Exception => e_exception
    p e_exception
  end
end

b.close
4

1 に答える 1

0

Selenium Webdriverを扱っているときに同じことに遭遇したので、あなたの欲求不満の仲間を理解できます。ここでは、スクリプトが 500 以上の Web サイトで最後まで完璧かつ堅牢に実行されることを 100% 確実にするために必要なことを説明します。

    sites.each do |uri|    
!30.times { if ((b.goto uri)rescue false)then break else sleep 1; end }     
    end    

上記のコードは、各 Web サイトに最大 30 秒間アクセスを試みてから、次の Web サイトに移動します。

于 2012-08-02T09:28:04.380 に答える