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

誰でもそれを機能させる方法を知っていますか?

4

2 に答える 2

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 ステートメントにあるようです。

于 2012-04-06T21:47:48.217 に答える
0

execution expiredTimeout::timeoutのブロックを超えた場合に発生するエラーです。タイムアウトは、ブロック全体が指定された時間内に完了したことを確認していることに注意してください。行番号エラーを考えると、URL の読み込みに 10 秒近くかかり、テキスト チェックがタイムアウトしたと推測されます。

テスト全体が完了するのに 10 秒かかるのではなく、ページの読み込みに 10 秒以上かかる場合にのみタイムアウトが発生することを意味していると思います。そのため、if ステートメントを Timeout ブロックの外に移動する必要があります。

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
于 2012-04-07T13:43:10.420 に答える