2014-05-16 8 views
6

Ich arbeite an einem AutoHotkey-Skript, das eine sich wiederholende Arbeit in Google Chrome funktioniert. Jedes Mal, wenn ich auf einen Link aus dem Skript klicke, muss ich meinem Skript sagen, dass es schlafen soll, während die Seite geladen wird.Wie warte ich darauf, dass Google Chrome eine Webseite lädt, bevor AutoHotkey fortgesetzt wird?

Ich frage mich, ob es einen Weg in AHK für mich gibt, um das Skript zu warten, bis der Browser fertig ist, die Seite zu laden, anstatt für eine bestimmte Zeit zu schlafen. Ist das möglich?

+1

Die auf ly Möglichkeit ist wahrscheinlich zu prüfen, ob das Symbol zum Laden der Seite vorhanden ist. Bei einer Pixelsuche können Sie die Farbe überprüfen und wenn die Farbe nicht die Farbe des Ladesymbols hat, wird sie geladen. http://www.autohotkey.com/board/topic/82884-how-to-determine-web-page-loaded-successfully/ –

+0

Ja, Sie können es anders machen, aber es braucht ein Benutzer-Skript, wie Sie es gesehen haben, wenn Sie möchten feststellen, ob die Seite geladen ist, dann sollten die Entwickler einen Code für jeden möglichen Browser erstellen, der nicht der beste ist, Sie können das Userscript auch versuchen, deshalb habe ich Ihnen den Link geschickt, beim nächsten Mal google . –

Antwort

6

Während Karthik's answer ist besser als ein Schlafbefehl, und es kann ziemlich gut funktionieren für viele Websites, fand ich, dass es einige Probleme gibt was besonders dann schleicht, wenn Sie es häufig benutzen.

brauchte ich eine zuverlässige Lösung selbst, was ich glaube, ich endlich gefunden habe. Rufen Sie den Chrome Web Store auf und fügen Sie die Google Chrome-Erweiterung Control Freak hinzu. So können Sie auf einfache Weise Code-Blöcke einrichten, die auf einer einzelnen Seite, einer ganzen Domäne oder einer beliebigen Site/Seite ausgelöst werden können.

Control Freak Chrome Extension

Sobald Sie haben es geladen wird, klicken Sie auf das Zahnrad-Taste Sie nun für die Erweiterung haben. Klicken Sie oben im Popup-Fenster im entsprechenden Kontext/Speicherbereich auf die Seitenerkennung. das heißt All

Jetzt können Sie auf der Libs Registerkarte. Scrollen Sie nach unten zu jQuery. Sie können jede Version aus der Liste auswählen, die Sie möchten, aber ich wählte die neueste. Beachten Sie, dass die URL für das CDN unten hinzugefügt wird. Jetzt, nachdem Sie auf die Save Schaltfläche am unteren Rand Sie immer jQuery in zur Verfügung haben wird, was auch immer Kontext gewählt.

Schalter zurück auf die JavaScript Registerkarte und diesen Code hinzufügen und ändern, wie Sie mögen:

jQuery(function() { 
    prompt("Diagnostic: Page Status", "loaded"); 
}); 

Sobald Sie auf Speichern klicken, wird dieser Code ausgeführt werden, auf dem jQuery Bereit-Ereignis. Jetzt haben Sie eine zuverlässige Möglichkeit, die Seitenauslastung zu erkennen, die AHK verwenden kann!

Mit dieser Stelle können Sie AutoHotkey auf ein Fenster warten lassen, dessen Titel beginnt mit "Die Seite um" ...., was zweifellos unsere Eingabeaufforderung sein wird, die mit unserem Wort "loaded" ausgefüllt ist. Sie können AHK sagen, dass er ein Control + c senden soll, um das zu kopieren, dann überprüfen Sie seinen Wert, oder nehmen Sie einfach an, dass Sie wahrscheinlich haben, was Sie erwartet haben, seit Sie es gesehen haben. Der folgende AHK-Code kann auf das Aufforderungs-Pop-up warten (was genauso gut mit einer Warnung btw geschehen könnte).

clipboard= 
WinWait, The page at 
WinWaitActive 
Send ^c 
ClipWait 
WinClose 
; The rest here is entirely optional tooltip code, but can be useful. 
tooltip, The diagnostic data provided was: %clipboard%,0,0 
sleep, 1000 
tooltip 

So machen wir es optimieren und es in eine Funktion setzen Sie rufen über können und immer wieder:

Funktion Definition:

waitForPageLoad() 
{ 
    WinWait, The page at 
    WinWaitActive 
    WinClose 
} 

Call Function:

waitForPageLoad() 

Andere Gedanken ..

Jetzt habe ich festgestellt, dass dieser Code auch dann ausgelöst wird, wenn die Seite nicht wirklich geändert oder neu geladen wird, z. B. wenn sich die Seiten-URL ändert, aber sie speziell codiert, um die Seite nicht zu verlassen Inhalt dort. Das ist perfekt für meine Zwecke, aber das könnte herausgefiltert werden, indem man irgendeine Art von Variable setzt und prüft, ob sie bereits gesetzt wurde (innerhalb des JavaScript-Codes, den du in Control Freak hinzugefügt hast).

+0

Ich sollte hinzufügen, dass ich unermüdlich nach einer Lösung gesucht habe, die so robust ist, und keine gefunden wurde. Ich war der Meinung, dass keine der Antworten auf dieses Problem auf eine konsequent zuverlässige Weise adäquat war. Dies hat mich dazu gebracht, diese Lösung zu entwickeln. Ich fühle, dass dies der richtige Weg ist, um es zu tun. Wenn es möglich ist, die gewählte Antwort hier bei SO zu ändern, und Sie stimmen zu, dann wählen Sie bitte meine Antwort, die anderen helfen wird, sie zu finden und ihnen viel Elend zu ersparen. Dank –

+0

Vielleicht ist es auch erwähnenswert, dass dies nachgerüstet werden könnte, um jedes andere erkennbare Ereignis wie eine Mauscursoränderung zu verwenden, in der Sie den AHK Cursor Change Detect Code verwenden können, den jemand in den AHK Foren gegeben hatte. –

+1

Ich wähle das als Antwort, weil der Mauszeigerstatus für mich nicht funktioniert ... – Questionmark

5

Sie können den Mauszeiger Status wie folgt verwenden:

Sleep, 200 
while (A_Cursor = "AppStarting" or A_Cursor = "Wait") ; Wait for browser to be ready (page loaded) 
    continue 
Sleep, 200 
while (A_Cursor = "AppStarting" or A_Cursor = "Wait") ; Wait for browser to be ready (page loaded) 
    continue 

Ich tue dies zweimal, nur um sicher zu stellen, dass eine kurze Statusänderung des Mauszeigers nicht zurück die falschen Daten zu geben.

+0

Ich befürchte, dass meine Maus das Ladesymbol nicht anzeigt, wenn ich eine Seite lade. Windows 8.1 mit Chrome ... Es ist eine wirklich gute Idee, obwohl +1 – Questionmark

+0

Sorry zu hören, dass Windows 8, dies nicht mehr unterstützt. Ich benutze dies mit Windows 7 und Chrome, aber das wird dir jetzt nicht helfen. –

6

Dies ist der Code, den ich, wenn die Seite zu überprüfen, verwenden geladen ist oder nicht. Er prüft die Farbe an einer bestimmten Pixelposition, die durch x, y definiert ist. Wenn die Pixelfarbe mit der Funktion übereinstimmt, wird von der Schleife zurück zum Hauptscript gewechselt. Definition

Funktion:

waitForPageLoad(x, y, color) 
{ 
    Loop 
    { 
    PixelGetColor, Loaded, %x%, %y% 
    if Loaded = %color% 
     break 
    } 
} 

Function Call:

waitForPageLoad(399, 265, "0xE4C2A2") 
+1

Kann eine maximale Wartezeit hinzugefügt werden, um zu verhindern, dass das Skript in einer Endlosschleife stecken bleibt? –

1

Ich habe Karthik S's function geändert, um einen optionalen seconds Parameter hinzuzufügen. Wenn angegeben, wird dadurch eine maximale Wartezeit eingestellt, um zu verhindern, dass die Funktion in einer Endlosschleife gefangen wird. Ich habe auch den Farbvergleich auf RGB umgestellt, um die Kompatibilität mit Window Spy zu gewährleisten. (Früher Vergleich als BGR)

Argument Beschreibungen:

  • x, y: Die X- und Y-Koordinaten des Pixels zu warten.
  • Farbe: RGB-Hexadezimalfarbe, auf die an angegebenen Koordinaten gewartet werden soll. (Ex: 0xBBCFE3)
  • Sekunden: Wie viele Sekunden vor warten, Timing und Einstellung ErrorLevel bis 1.

Funktion Definition:

; Wait for page to load by checking pixel color at specified x,y coordinates 
WaitForPageLoadByColor(x, y, color, seconds:=-1) 
{ 
    start := A_TickCount 
    while ((seconds = -1) || (A_TickCount-start <= seconds*1000)) 
    { 
     PixelGetColor, Loaded, %x%, %y%, RGB 
     if Loaded = %color% 
     return 
    } 
    ErrorLevel := 1 ; Page failed to load 
} 

Function Call:

waitForPageLoad(399, 265, "0xBBCFE3", 10) 
Verwandte Themen