2014-05-16 17 views
6

Sto lavorando a uno script AutoHotkey che esegue un processo ripetitivo in Google Chrome. Ogni volta che faccio clic su un collegamento dallo script, devo dire allo script di dormire mentre la pagina viene caricata.Come posso aspettare che Google Chrome carichi una pagina Web prima di continuare con AutoHotkey?

Mi chiedo se in AHK ci sia un modo per dire allo script di aspettare che il browser finisca di caricare la pagina piuttosto che dormire per un determinato periodo di tempo. È possibile?

+1

L'acceso probabilmente è per controllare se l'icona di caricamento della pagina è lì. Con una ricerca pixel puoi controllare il colore e se il colore non è il colore dell'icona di caricamento, allora viene caricato. http://www.autohotkey.com/board/topic/82884-how-to-determine-web-page-loaded-successfully/ –

+0

Sì, puoi farlo in un altro modo, ma ha bisogno di un userscript come lo hai visto, se vorresti determinare se la pagina è caricata, quindi gli sviluppatori dovrebbero creare un codice per ogni browser possibile, che non è il migliore, puoi provare anche lo usercript, ecco perché ti ho inviato il link, la prossima volta usa google . –

risposta

6

Mentre Karthik's answer è meglio di un comando di sonno, e può funzionare abbastanza bene per molti siti, ho trovato che ci sono alcuni problemi che può insinuarsi soprattutto se lo si usa abbastanza spesso.

Avevo bisogno di una soluzione affidabile anch'io, che credo di aver finalmente trovato. Accedi al Chrome Web Store e aggiungi l'estensione Google Chrome denominata Control Freak. Ciò consente di impostare facilmente blocchi di codice che possono essere attivati ​​su una singola pagina, un intero dominio o qualsiasi sito/pagina.

Control Freak Chrome Extension

Una volta che ce l'hai caricato, fare clic sul pulsante ingranaggio della ruota ora avete per l'estensione. Fare clic nella parte superiore della finestra a comparsa nel contesto/spazio appropriato per il rilevamento del caricamento della pagina. Ad esempio All

Ora è possibile fare clic sulla scheda Libs. Scorri fino a jQuery. Puoi scegliere qualsiasi versione dalla lista che ti piace, ma ho scelto l'ultima. Si noti che l'URL per il CDN è aggiunto in fondo. Ora, dopo aver fatto clic sul pulsante Save in fondo, avrai sempre jQuery disponibile in qualsiasi contesto.

tornare alla scheda Javascript e aggiungere questo codice, e modificare a come ti piace:

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

Una volta che si fa clic su Salva, questo codice verrà eseguito davanti all'evento jQuery pronto. Ora hai un modo affidabile per rilevare il caricamento della pagina, che AHK può usare!

Con questo in posizione, è possibile avere AutoHotkey in attesa di una finestra il cui titolo inizia dicendo "The page at" ...., che sarà indubbiamente il nostro prompt, precompilato con la nostra parola "caricato". Puoi dire ad AHK di inviare un Control + c per copiarlo, quindi controllarne il valore o presumere che dal momento in cui l'hai visto, probabilmente avrai quello che ti aspettavi. Il seguente codice AHK può attendere il prompt pop-up (che potrebbe essere fatto altrettanto facilmente con un avviso btw).

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 

Quindi cerchiamo di ottimizzare e metterlo in una funzione è possibile chiamare più e più volte:

Funzione Definizione:

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

Function Call:

waitForPageLoad() 

Altro pensieri ..

Ora ho notato che questo codice si attiva anche nei momenti in cui la pagina non viene realmente cambiata o ricaricata, ad esempio quando l'URL della pagina potrebbe cambiare, ma lo hanno codificato in modo specifico per non uscire dalla pagina e in genere viene visualizzato nuovo contenuto lì. Questo è perfetto per i miei scopi, ma potrebbe essere filtrato impostando una specie di variabile e controllando se fosse già stata impostata (all'interno del codice JavaScript che hai aggiunto in Control Freak).

+0

Devo aggiungere che ho cercato instancabilmente una soluzione robusta come questa, e nessuna è stata trovata. Non ho ritenuto che nessuna delle risposte a questo problema fosse adeguata in un modo costantemente affidabile. Questo mi ha portato a sviluppare questa soluzione. Ritengo che questo sia il modo migliore corretto per farlo. Se è possibile cambiare la risposta scelta qui in SO, e sei d'accordo, quindi seleziona la mia risposta, che aiuterà gli altri a trovarla e risparmia loro molta sofferenza. Grazie –

+0

Forse vale anche la pena ricordare che questo potrebbe essere adattato per utilizzare qualsiasi altro evento rilevabile come il cambiamento del cursore del mouse, in cui è possibile utilizzare il codice di rilevamento del cambiamento del cursore AHK che qualcuno aveva fornito nei forum AHK. –

+1

L'ho scelto come risposta perché lo stato del cursore del mouse non funziona per me ... – Questionmark

5

È possibile utilizzare lo stato cursore del mouse in questo modo:

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 

lo faccio due volte, solo per assicurarsi che una breve cambiamento di stato del cursore del mouse non sta dando i dati sbagliati indietro.

+0

Ho paura che il mio mouse non mostri l'icona di caricamento quando carico una pagina. Windows 8.1 con Chrome ... È davvero una buona idea anche se +1 – Questionmark

+0

Siamo spiacenti di sentire che Windows 8, non supporta più questo. Lo uso con Windows 7 e Chrome, ma questo non ti aiuterà in questo momento. –

6

Questo è il codice che uso per verificare se la pagina è stata caricata o meno. Controlla il colore in una particolare posizione di pixel definita da x, y. Se il colore del pixel corrisponde alla funzione, si esce dal loop indietro allo script principale. Definizione

Funzione:

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

Function Call:

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

È possibile aggiungere un tempo di attesa massimo per evitare che lo script si blocchi in un ciclo infinito? –

1

Ho modificato Karthik S's function per aggiungere un parametro opzionale seconds. Se specificato, questo imposterà un tempo di attesa massimo per evitare che la funzione si impigli in un loop infinito. Ho anche cambiato il confronto dei colori in RGB per compatibilità con Window Spy. (Precedentemente rispetto come BGR)

descrizione degli argomenti:

  • x, y: X e Y coordinate del pixel per aspettare.
  • colore: colore esadecimale RGB in attesa delle coordinate specificate. (Es: 0xBBCFE3)
  • secondi: Quanti secondi di attesa prima del timeout e l'impostazione ErrorLevel a 1.

Funzione Definizione:

; 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)