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 回答