2012-03-26 16 views
8

Ich benutze die Wattir-Webdriver Rubin Juwel. Es startet den Browser (Chrome) und beginnt mit dem Laden einer Seite. Die Seite wird zu langsam geladen und watir-webdriver löst einen Zeitüberschreitungsfehler aus. Wie kann ich verhindern, dass der Browser die Seite lädt?Lassen Headless-Browser aufhören zu laden Seite

Es sieht so aus, als ob der Browser vor dem Laden der Seite nicht auf andere Befehle reagiert. Wie kann ich den Browser zwingen, die Seite, die geladen wird, wegzuwerfen und den nächsten Befehl auszuführen?

AKTUALISIERT

Ich habe eine interessante Fähigkeit Flagge LoadAsync http://src.chromium.org/svn/trunk/src/chrome/test/webdriver/webdriver_capabilities_parser.cc Vielleicht kann es nützlich sein, zur Lösung dieses Problems gefunden? Ich verstehe noch nicht, wie man watir (webdriver) macht, um das beim Starten des Chromtreibers einzustellen. Diese Flagge wurde hier eingeführt http://codereview.chromium.org/7582005/

+0

An der Spitze meines Kopfes gibt es nur eine Erklärung für dieses Ding. Der Watir ist single-threaded. –

+0

Ich versuche nicht, es in mehreren Threads zu verwenden.Ich frage mich nur, warum nach einem Befehl und dessen Timeout der nächste Befehl nicht ausgeführt werden kann. – Molfar

+0

Wenn ich Singlethread sage ich meine, dass beim Senden eines Befehls an den Webdriver etwas tun Sie einen synchronen Aufruf und kann nichts tun, bis die Antwort von Webdriver bekommt. Die Sache, die Sie in diesem Szenario tun möchten, kann nicht durchgeführt werden, bis Sie den synchronen Aufruf in asynchron ändern. –

Antwort

4

Es gibt ein paar verschiedene Möglichkeiten zu tun, was Sie wollen, aber hier ist, was ich tun würde:

require 'watir-webdriver' 

client = Selenium::WebDriver::Remote::Http::Default.new 
client.timeout = 60 
@browser = Watir::Browser.new :firefox, :http_client => client 

begin 
    @browser.goto mySite 
rescue => e 
    puts "Browser timed out: #{e}" 
end 

next_command 

Wenn Sie viele Seiten haben Sie versuchen, Zum Laden für die Bestätigung der Zeitüberschreitung oder nicht, in ein Array:

mySites = [ 
      mySite1, 
      mySite2, 
      mySite3 
] 

mySites.each do |site| 
    begin 
     @browser.goto site 
    rescue 
     "Puts #{site} failed to load within the time allotted." 
    end 
end 

UPDATE für den Nachweis des Konzepts. Dieses Skript fährt immer mit Schritt 2 fort. Die Rettung ist nicht einmal für das zweite Goto notwendig, wird aber für eine klarere Ausgabe verwendet. Wie unterscheidet sich dein Skript davon?

require 'watir-webdriver' 

client = Selenium::WebDriver::Remote::Http::Default.new 
client.timeout = 1  #VERY low timeout to make most sites fail 
@browser = Watir::Browser.new :firefox, :http_client => client 


def testing 
    begin 
    @browser.goto "http://www.cnn.com" 
    rescue => e 
    puts "Browser timed out on the first example" 
    end 

    begin 
    @browser.goto "http://www.foxnews.com" 
    rescue => e 
    puts "Browser timed out on the second example" 
    end 
end 
+0

Das Problem ist, dass jeder "next_command" (wie ein @ browser.goto "http://another-site.com" oder @ browser.close) einen anderen Timeout-Fehler auslösen wird. Es sieht so aus, als wäre der Browser "eingefroren", nachdem Timeout zum ersten Mal erhöht wurde. – Molfar

+0

@Molfar Ich habe dies mehrmals versucht und kann Ihren Fehler nicht reproduzieren. Ich habe ein Codebeispiel hinzugefügt, um Ihnen zu zeigen, was ich versuche, und es funktioniert wie erwartet. –

+0

Hier ist mein Testcode http://pastebin.com/vNiKZ9tP Es bestätigt beschriebenes Verhalten. Ich frage mich, warum das Skript den zweiten Rettungsblock erreicht. Es unterscheidet sich von Ihrem Code, dass nur die erste Site das Timeout erreichen sollte. – Molfar

2

Sie können das Laden der Seite mit AutoIT stoppen, um die Escape-Taste zu senden Dies ist ähnlich dem, was Sie ursprünglich versucht haben, aber mit AutoIT direkt statt mit dem zerbrochenen Watir :: Browser-Objekt.

require 'watir-webdriver' 
require 'win32ole' 

client = Selenium::WebDriver::Remote::Http::Default.new 
client.timeout = 5 
@browser = Watir::Browser.new :chrome, :http_client => client 
begin 
    @browser.goto "http://www.nst.com.my/" 
rescue 
    autoit = WIN32OLE.new("AutoItX3.Control") 
    autoit.AutoItSetOption("WinTitleMatchMode", 2) 
    autoit.WinActivate("Google") 
    autoit.Send("{ESC}") 
end 
@browser.goto "http://www.google.ca" 

Hinweis: Ich habe versucht, autoit.ControlSend("Google", "", "", "{ESC}") zu bekommen, so zu arbeiten, dass es nicht den Browser benötigen würde das aktive Fenster zu sein. Während es funktionierte, wenn es von selbst ausgeführt wurde, konnte ich es aus irgendeinem Grund im obigen Skript nie zum Laufen bringen (dh der Schlüssel wurde gesendet, aber der Browser reagierte nicht wie erwartet).

+1

Alles läuft auf Linux-Maschine im Headless-Modus (Produktion). – Molfar

0

Ich habe mit diesem Problem für eine Weile gekämpft, ich weiß, dass dieser Beitrag von 2012 ist, aber ich habe immer noch nichts gefunden, das dieses Problem löst. So machte ich eine Arbeit herum.

Der zusätzliche Code, mit dem Sie Ihre Cookies speichern und wiederherstellen können, ermöglicht es Ihnen, bei den von Ihnen verwendeten Websites angemeldet zu bleiben. Das ist scheiße, aber es ist die einzige Arbeit, die ich mir vorstellen kann. Auch das war 2012. Wenn jemand etwas findet, das besser funktioniert, korrigiere mich bitte.

+0

Es löst das Problem nicht, weil Ihr @ browser.close nicht funktioniert. – Molfar

+0

Auf meinem Computer tut es. Ich verwende Linux debian 3.2.0-4-amd64 # 1 SMP Debian 3.2.57-3 + deb7u1 x86_64 GNU/Linux, mit Firefox 17.0.10, watir 5, watir-webdriver 0.6.4 – Duck1337

+0

rubin 1.9.3p484 (2013-11-22 Revision 43786) [x86_64-linux] – Duck1337

0

Ich hatte auch das Problem der Timeouts. Mein Verständnis von Online-Forschung ist, dass nach Selenium WebDriver ein Timeout auftritt, es in schlechte Form kommt und sich schlecht benimmt (Multithreading-Problem).

https://github.com/watir/watir-webdriver/issues/137

ich aktive Tötung umgesetzt (statt browser.close) und Neustarten des Watir::Browser nach einer Ausnahme Rettung: Ich habe die Ratschläge hier gefolgt.

Verwandte Themen