Ruby 循环时出错

Ruby 循环时出错,ruby,watir,Ruby,Watir,我正在编写一些代码,将从文本文件中提取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.

我正在编写一些代码,将从文本文件中提取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

有人知道如何让它工作吗?

您可以使用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语句中。

执行过期
是超出
超时::超时
的块时发生的错误。请注意,超时是检查其整个块是否在指定的时间内完成。考虑到行号错误,我猜加载的URL花费了将近10秒,然后文本检查超时

我假设您真正的意思是,如果页面加载时间超过10秒,而不是整个测试完成时间超过10秒,那么才会出现超时。因此,您应该将if语句移出超时块:

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

如果您只想检查仍然有效的URL,那么您可能应该使用
Net::HTTP
并发出
HEAD
请求。检查站点正文中的“服务器”一词将排除许多确实正确加载的站点。是的,我试过了,但有些站点服务器已关闭,脚本最后抛出了一个错误。如果您所要做的只是使用net/http或类似gem的http方检查URL,则会更快、更简单,因为您只需获取http状态码,如果是2xx或3xx(重定向),则很可能是好的,如果是4xx或5xx,则会出现某种错误。Watir更适合于实际的功能测试Tanks bro,我最终选择了net/http,但你教了我一两件事,不知道超时的事情,只是检查了网站,就这样。