2012-04-06 6 views
0

私は、テキストファイルからURLを取得し、ロードするかどうかを確認するコードを書いています。私が持っているコードは次のとおりです。私はエラーを取得するのにループ時にエラーを取得する

require 'rubygems' 
require 'watir' 
require 'timeout' 

Watir::Browser.default = "firefox" 
browser = Watir::Browser.new 

File.open('pl.txt').each_line do |urls| 
    begin 
    Timeout::timeout(10) do 
     browser.goto(urls.chomp) 
     if browser.text.include? "server" 
     puts 'here the page didnt' 
     else 
     puts 'here site was found' 
     File.open('works.txt', 'a') { |f| f.puts urls } 
     end 
    end 
    rescue Timeout::Error => e 
    puts e 
    end 
end 

browser.close 

事がある:

execution expired 
/Library/Ruby/Gems/1.8/gems/firewatir-1.9.4/lib/firewatir/jssh_socket.rb:19:in `const_get': wrong number of arguments (2 for 1) (ArgumentError) 
    from /Library/Ruby/Gems/1.8/gems/firewatir-1.9.4/lib/firewatir/jssh_socket.rb:19:in `js_eval' 
    from /Library/Ruby/Gems/1.8/gems/firewatir-1.9.4/lib/firewatir/firefox.rb:303:in `open_window' 
    from /Library/Ruby/Gems/1.8/gems/firewatir-1.9.4/lib/firewatir/firefox.rb:94:in `get_window_number' 
    from /Library/Ruby/Gems/1.8/gems/firewatir-1.9.4/lib/firewatir/firefox.rb:103:in `goto' 
    from samplecodestack.rb:17 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/timeout.rb:62:in `timeout' 
    from samplecodestack.rb:16 
    from samplecodestack.rb:13:in `each_line' 
    from samplecodestack.rb:13 

誰もが、それは働いて取得する方法を知っていますか?

+0

:だから、タイムアウト・ブロックのうちif文を移動する必要があります。サイトの本文にある "server"という単語を確認すると、実際に正しく読み込まれたサイトが数多く除外されます。 –

+0

ええ、私はそれを試しましたが、サーバがダウンしているサイトのいくつかがあり、スクリプトがエラーを投げ捨てるだけです。 –

答えて

1

net/httpを使用してタイムアウトを処理することもできます。

require "net/http" 
require "uri" 
File.open('pl.txt').each_line do |urls| 
    uri = URI.parse(urls.chomp) 
    begin 
     response = Net::HTTP.get_response(uri) 
    rescue Exception=> e 
     puts e.message 
     puts "did not load!" 
    end 
end 

スタックトレースには問題がありましたが、gotoステートメントにあるようです。

+0

あなたがしようとしているのは、HTTP/HTTPを使用しているURLをチェックするか、httpパーティーのような宝石が2xxまたは3xx(リダイレクト)の場合はHTTPステータスコードを取得できるので、 4xxまたは5xxの場合、エラーが発生する可能性があります。 Watirは実際の機能テストにもっと適しています –

+0

これは私が最後に行ったことです、ありがとう。 –

0

execution expiredは、Timeout::timeoutのブロックを超えたときに発生するエラーです。タイムアウトは、ブロック全体が指定された時間内に完了したことを確認することです。行番号のエラーがあると、ロードされているURLに10秒がかかり、テキストチェックがタイムアウトしたと推測しています。

テスト全体が終了するのに10秒かかるのではなく、ページの読み込みに10秒以上かかる場合は、実際にタイムアウトが発生することを意味します。やりたいことがまだ有効なURLをチェックし、あなたはおそらくちょうど `ネット:: HTTP`を使用すると` HEAD`要求を発行する必要がある場合には

File.open('pl.txt').each_line do |urls| 
    begin 
    Timeout::timeout(10) do 
     browser.goto(urls.chomp) 
    end 
    if browser.text.include? "server" 
     puts 'here the page didnt' 
    else 
     puts 'here site was found' 
     File.open('works.txt', 'a') { |f| f.puts urls } 
    end 
    rescue Timeout::Error => e 
    puts 'here the page took too long to load' 
    puts e 
    end 
end 
+0

ありがとうございました。私は最後にnet/httpのものを持ってきましたが、あなたは1つまたは2つのことを教えてくれました。ブロック全体をやっているTimeoutのことを知らず、ちょうどサイトをチェックしたと思っていました。 –

関連する問題