2012-04-06 7 views
0

Ich schreibe einen Code, der URLs aus einer Textdatei zieht und dann prüft, ob sie geladen werden oder nicht. Der Code, den ich habe, ist:Fehler beim Loopen

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 

Die Sache ist, wenn ich den Fehler:

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 

Wer weiß, wie um es zu arbeiten?

+0

Wenn alles, was Sie tun wollen Check für noch gültige URLs ist, sollten Sie wahrscheinlich verwenden nur 'Net :: HTTP' und geben Sie eine' HEAD' Anfrage . Wenn Sie im Hauptteil der Site nach dem Wort "Server" suchen, werden viele Websites ausgeschlossen, die tatsächlich korrekt geladen wurden. –

+0

Ja, ich habe das versucht, aber auf einigen der Seiten sind die Server nicht erreichbar, und das Skript gibt nur einen Fehler aus. –

Antwort

1

Sie können net/http verwenden und die Timeouts auch behandeln.

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 

Ich hatte Schwierigkeiten, Ihrem Stack-Trace zu folgen, aber es scheint auf Ihrer goto-Anweisung zu sein.

+0

Wenn alles, was Sie versuchen zu tun ist, überprüfen Sie die URL mit net/http oder ein Juwel wie http-Party wäre viel schneller und einfacher, da Sie nur den HTTP-Statuscode, wenn es 2xx oder 3xx (eine Weiterleitung) ist dann es ist wahrscheinlich gut, wenn es 4xx oder 5xx ist, dann haben Sie eine Art von Fehler. Watir wäre besser geeignet für tatsächliche Funktionstests –

+0

Dies ist, was ich am Ende ging, danke Mann. –

0

execution expired ist der Fehler, der auftritt, wenn der Block für Timeout::timeout überschritten wird. Beachten Sie, dass das Zeitlimit überprüft, dass der gesamte Block in der angegebenen Zeit abgeschlossen ist. Angesichts der Zeilennummernfehler vermute ich, dass die URL, die geladen wird, fast 10 Sekunden dauerte und dann die Textüberprüfung abgelaufen ist.

Ich nehme an, dass Sie wirklich nur meinen, dass die Zeitüberschreitung auftritt, wenn die Seite länger als 10 Sekunden zum Laden braucht, anstatt dass der gesamte Test 10 Sekunden dauert. So sollten Sie die if-Anweisung aus dem Timeout Block verschieben:

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

Dank Bruder, ging ich mit dem net/http-Ding am Ende, aber Sie brachten mir ein oder zwei Dinge, wussten nicht über die Timeout-Sache den ganzen Block, dachte, es überprüft nur die Website und das war es. –