Condividi:        

I.E. busy non funziona

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

I.E. busy non funziona

Postdi templare77 » 17/08/16 23:55

Ciao Anthony,
ho una nuova rogna...ti dò il link della pagina http://www.hot-odds.com/DroppingOdds

Una volta aperta, IE busy e IE readystate fanno all'inizio il loro lavoro, poi modifico il valore di "Event start date" e di "Select Sport", (cerco tutte le partite di calcio della data odierna), simulo il click sul pulsante Search e come mi avevi detto tempo fa, devo riattendere la busy ed il readystate....però una volta richiamato l'evento click, la pagina si aggiorna secondo i criteri di ricerca da me impostati, ma mi salta subito il controllo della busy e del readystate....in questo modo non riesco poi a scaricare i dati della pagina.

Qui serve proprio il tuo aiutooooo!!! :eeh:
templare77
Utente Senior
 
Post: 153
Iscritto il: 18/04/16 06:26

Sponsor
 

Re: la busy non funziona

Postdi Anthony47 » 18/08/16 01:26

Eh... il Search innesca un javascript che evidentemente non altera i due status di InternetExplorer...

Usa questa logica:
-prima del click conti quanti "TD" sono presenti nel document; esempio:
Codice: Seleziona tutto
curtd = ie.document.getElementsByTagName("TD").Length

-esegui il click, inserisci una wait di 1 secondo
-looppi (voce del verbo to loop) fino a che i TD presenti nel document cambiano di quantita'; nel loop metti una attesa di 1 sec.
-inserisci una ulteriore wait di 1 secondo, e se il numero di TD e' cambiato rimani in questo secondo loop
Quindi:
-looppi fino a che il numero di TD varia rispetto al valore di partenza prima del click
-looppi ancora fino a che che il numero di TD rimane fisso

In realta' nelle mie prove il TD rimane costante (sul vecchio valore) per circa 0.5 sec, poi cambia e rimane subito costante; quindi il secondo loop e' puramente conservativo.
Ovviamente questo funziona se tra una Search e la successiva cambia il numero di dati che vengono estratti, ma spero che questo sia statisticamente garantito.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19183
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: I.E. busy non funziona

Postdi templare77 » 18/08/16 09:29

Ti ringrazio come sempre Anthony! È un suggerimento prezioso che terrò a mente per il futuro. Ho deciso di tagliare la testa al toro ed eseguire la ricerca nella pagina principale, nella quale ci sono tutti gli avvenimenti sportivi della giornata. Farò una ricerca sport per sport da lì così almeno la busy funziona di sicuro. Grazie!!!
templare77
Utente Senior
 
Post: 153
Iscritto il: 18/04/16 06:26

Re: I.E. busy non funziona

Postdi templare77 » 19/08/16 17:34

Ciao Anthony, purtroppo sono costretto a disturbarti ancora. Devo realizzare quel ciclo di cui mi avevi scritto in precedenza. Ci ho provato da solo.... Però il primo loop lo salta subito perché il numero di TD è subito fisso.... Non lo vedo incrementare. Nel secondo si verifica un loop infinito.... Non è che mi puoi far vedere il codice che hai provato tu per cortesia?
templare77
Utente Senior
 
Post: 153
Iscritto il: 18/04/16 06:26

Re: I.E. busy non funziona

Postdi Anthony47 » 19/08/16 18:59

Per le prove avevo usato:
Codice: Seleziona tutto
'Stato iniziale: navigazione completata verso http://www.hot-odds.com/DroppingOdds
Stop      'Premere F5 per continuare
ie.document.getelementbyId("SportId").Value = "54094" '"6046"
ie.document.getelementbyId("form_submit").Click
'
Stop       'ATTENDERE CHE IE si aggiorni, poi premere F5
'
ie.document.getelementbyId("SportId").Value = "0"
td0 = ie.document.getElementsByTagName("TD").Length
ie.document.getelementbyId("form_submit").Click
Debug.Print Timer, "Search pressd; TD0= " & td0
reWait:
myWait (0.1)
myStart = Timer  'attesa addizionale con timeout 20 secs
Do
    DoEvents
    myWait (0.1)
    Set mydivs = ie.document.getElementsByTagName("TD")
    Debug.Print Timer, "TD= " & mydivs.Length
'    Debug.Print Timer, ie.Busy
'    Debug.Print Timer, ie.readyState
    If Timer > myStart + 20 Or Timer < myStart Then Exit Do
    If mydivs.Length <> td0 Then
        td0 = mydivs.Length
        Exit Do
    End If
Loop
myWait (0.1)
Set mydivs = ie.document.getElementsByTagName("TD")
If mydivs.Length <> td0 Then
    Debug.Print Timer, "> reWait"
    td0 = mydivs.Length
    GoTo reWait
End If
Debug.Print Timer, "Term: ", ie.Busy
Debug.Print Timer, "Term: ", ie.readyState
'Stato finale: Document stabilizzato

Esempio di trace ottenuto:
Codice: Seleziona tutto
 69553,11     Search pressd; TD0= 606
 69553,33     TD= 606
 69553,44     TD= 606
 69553,55     TD= 606
 69553,66     TD= 606
 69555,09     TD= 1412
 69555,2      Term:         Falso
 69555,2      Term:          4


Ma in molti casi il passaggio da TD0 al nuovo TD e' molto piu' rapido.
Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19183
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: I.E. busy non funziona

Postdi templare77 » 19/08/16 22:26

Stai troppo avanti per uno come me.....
templare77
Utente Senior
 
Post: 153
Iscritto il: 18/04/16 06:26

Re: I.E. busy non funziona

Postdi templare77 » 20/08/16 14:08

Ciao Anthony, quindi il fatto che il numero dei TD non cambi fra una ricerca e l'altra implica che siamo fregati? Infatti alla pagina http://www.hot-odds.com/DroppingOdds, in basso c'è una menù orizzontale di navigazione, che io dovrei scorrere (e questo lo saprei fare) per cercare l'incontro fra le varie pagine. Ma fra una pagina e l'altra, la struttura tabellare rimane inalterata.... e quindi non c'è verso di capire quando la pagina si sia caricata tutta vero?
templare77
Utente Senior
 
Post: 153
Iscritto il: 18/04/16 06:26

Re: I.E. busy non funziona

Postdi templare77 » 20/08/16 16:07

Anthony stavo pensando...è possibile inserire nel codice VBA, uno script Java che non faccia eseguire il resto del codice VBA in attesa del caricamento della pagina?
templare77
Utente Senior
 
Post: 153
Iscritto il: 18/04/16 06:26

Re: I.E. busy non funziona

Postdi Anthony47 » 20/08/16 19:16

Il concetto della proposta era di cercare la prova che il nuovo document era pronto; il conteggio dei TD era un possibile metodo basato sul fatto che cambiando sport ragionevolmente cambiava il numero di dati da restituire.
Ma si puo' usare qualsiasi altro criterio...
Alla peggio si misura la lunghezza dell'InnerText del Body; se anche quello non cambia tra una selezione e la successiva allora sei sfigato e devi cambiare sport.
Ad esempio:
Codice: Seleziona tutto
'Stato iniziale: navigazione completata verso http://www.hot-odds.com/DroppingOdds
Set mysel = ie.document.getElementsByTagName("nav")
Set mysel2 = mysel(2).getElementsByTagName("a")
mycit = ie.document.getElementsByTagName("Body")(0).innerText
Debug.Print "Iniziale:", Len(mycit), "N° clicks: " & mysel2.Length
For i = 1 To mysel2.Length
    Set mysel = ie.document.getElementsByTagName("nav")
    Set mysel2 = mysel(2).getElementsByTagName("a")
'    Debug.Print "Click su: " & mysel2(i - 1).innerText & ", ----> " & mysel2(i - 1).outerHTML
    mysel2(i - 1).Click
Stop    'ATTENDERE STABILIZZAZIONE PAGINA
    mycit = ie.document.getElementsByTagName("Body")(0).innerText
    Debug.Print i, Len(mycit), vbCrLf
Next i
Stop


Il log restituito (lunghezza del Body InnerText):
Codice: Seleziona tutto
Iniziale:      92630        N° clicks: 6
 1             92681       

 2             92476       

 3             92991       

 4             92463       

 5             92402       

 6             92600


Quanto all'altra domanda la risposta e' No; una macro si esegue fino al suo completamento, quindi e' dentro il suo codice che devi spiegare cosa fare e quando smettere

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19183
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: I.E. busy non funziona

Postdi templare77 » 21/08/16 00:19

Anthony, ti chiedo umilmente la cortesia di spiegarmi un pò il codice che mi hai fornito. :oops: :oops: :oops: Quel log io non lo ottengo, io ho questo

Iniziale: 77888 N° clicks: 0

noto che il valore di
Codice: Seleziona tutto
mysel2.Length
è sempre 0, in questo modo salto sempre il ciclo

non ho capito come dovrei usare la lunghezza dell'InnerText del Body per assicurarmi che la pagina sia completa. Ti posto un estratto del codice che ho fatto io. gRAZIE 1000!!

A) apro la pagina http://www.hot-odds.com/DroppingOdds per la prima volta
B) seleziono lo sport CALCIO e simulo il click sul pulsante Search >>
C) vado alla ricerca dell'incontro

Codice: Seleziona tutto
Set ie = CreateObject("InternetExplorer.Application")

'APRO LA PAGINA "DroppingOdds" PER LA PRIMA VOLTA: .BUSY E READYSTATE FUNZIONANO
With ie
    .navigate "http://www.hot-odds.com/DroppingOdds"
    .Visible = True
    Do While .busy: DoEvents: Loop
    Do While .readyState <> 4: DoEvents: Loop
End With

myStart = Timer
Do
    DoEvents
    If Timer > myStart + 2 Or Timer < myStart Then Exit Do
Loop

If sport = "calcio" And flag = True Then
    ie.document.getelementbyid("SportId").Value = 6046
    ie.document.getelementbyid("Date").Value = CStr(Date + 1)
    ie.document.getelementbyid("form_submit").Click
       
ElseIf sport = "calcio" And flag = False Then
    ie.document.getelementbyid("SportId").Value = 6046
    ie.document.getelementbyid("Date").Value = CStr(Date)
    ie.document.getelementbyid("form_submit").Click
       
ElseIf sport = "basket" And flag = True Then
    ie.document.getelementbyid("SportId").Value = 48242
    ie.document.getelementbyid("Date").Value = CStr(Date + 1)
    ie.document.getelementbyid("form_submit").Click

ElseIf sport = "basket" And flag = False Then
    ie.document.getelementbyid("SportId").Value = 48242
    ie.document.getelementbyid("Date").Value = CStr(Date)
    ie.document.getelementbyid("form_submit").Click

ElseIf sport = "hockey" And flag = True Then
    ie.document.getelementbyid("SportId").Value = 35232
    ie.document.getelementbyid("Date").Value = CStr(Date + 1)
    ie.document.getelementbyid("form_submit").Click

ElseIf sport = "hockey" And flag = False Then
    ie.document.getelementbyid("SportId").Value = 35232
    ie.document.getelementbyid("Date").Value = CStr(Date)
    ie.document.getelementbyid("form_submit").Click

ElseIf sport = "tennis" And flag = True Then
    ie.document.getelementbyid("SportId").Value = 54094
    ie.document.getelementbyid("Date").Value = CStr(Date + 1)
    ie.document.getelementbyid("form_submit").Click

ElseIf sport = "tennis" And flag = False Then
    ie.document.getelementbyid("SportId").Value = 54094
    ie.document.getelementbyid("Date").Value = CStr(Date)
    ie.document.getelementbyid("form_submit").Click

ElseIf sport = "ippica" And flag = True Then
    ie.document.getelementbyid("SportId").Value = 687888
    ie.document.getelementbyid("Date").Value = CStr(Date + 1)
    ie.document.getelementbyid("form_submit").Click

ElseIf sport = "ippica" And flag = False Then
    ie.document.getelementbyid("SportId").Value = 687888
    ie.document.getelementbyid("Date").Value = CStr(Date)
    ie.document.getelementbyid("form_submit").Click

End If

 **** QUI DOVREI METTERE IL CODICE CHE DOPO IL CLICK, MI FA ATTENDERE IL CARICAMENTO DELL PAGINA ***

num_pages = 0

'CALCOLO IL NUMERO DELLE PAGINE DEL MENU ORIZZONTALE
Set tag_menu = ie.document.getElementsByTagName("nav")
For Each Item In tag_menu
    If Item.classname = "bottompager" Then
        Set last = Item.getElementsByTagName("a")
        For Each element In last
            If element.innerText <> "Last »" And element.innerText <> "Next »" And element.innerText <> "« First" And element.innerText <> "« Previous" Then
                num_pages = num_pages + 1
            End If
        Next element
    End If
Next Item

'NAVIGO FRA LE VARIE PAGINE ALLA RICERCA DELL'INCONTRO
For Each Item In tag_menu
    If Item.classname = "bottompager" Then
        Set link_pages = Item.getElementsByTagName("a")
        For Each element In link_pages
            If element.innerText <> "Last »" And element.innerText <> "Next »" And element.innerText <> "« First" And element.innerText <> "1" And element.innerText <> "« Previous" Then
                element.Click
               
                **** QUI DOVREI METTERE IL CODICE CHE DOPO IL CLICK, MI FA ATTENDERE IL CARICAMENTO DELL PAGINA ***

            End If
           
           
        Next element
   
    End If
Next Item
templare77
Utente Senior
 
Post: 153
Iscritto il: 18/04/16 06:26

Re: I.E. busy non funziona

Postdi templare77 » 22/08/16 06:47

Buon giorno Anthony! Il codice poi con un pò di pazienza l'ho capito, ed ho capito perchè
Codice: Seleziona tutto
mysel2.Length
a volte è zero (sfido...non c'è il menu di navigazione :D a fondo pagina)

Resta solo un grande quesito....qual'è il codice necessario dopo il click che mi faccia attendere il caricamento della pagina, sfruttando la lunghezza dell'InnerText del Body? :aaah :aaah :aaah
templare77
Utente Senior
 
Post: 153
Iscritto il: 18/04/16 06:26

Re: I.E. busy non funziona

Postdi Anthony47 » 22/08/16 16:52

Avrai certamente capito che non esiste "il codice" per tutte le situazioni, ma "un codice" per ogni specifica situazione.

Per attendere il caricamento della pagina lavorando sull'InnerText del Body la logica e' la stessa che avevamo descritto per la tecnica del il conteggio dei TD: vedi viewtopic.php?f=26&t=107319&p=629203#p629110 per il concetto e viewtopic.php?f=26&t=107319&p=629203#p629150 per un esempio di macro.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19183
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: I.E. busy non funziona

Postdi templare77 » 22/08/16 17:10

Grazie Anthony. Un'ultima domanda. Al raggiungimento dell'istruzione di STOP, la macro mi apre il Debugger.... Non voglio che questo accada.... La dovrei sostituire con qualcosa di appropriato un wait o non saprei cosa....
templare77
Utente Senior
 
Post: 153
Iscritto il: 18/04/16 06:26

Re: I.E. busy non funziona

Postdi templare77 » 22/08/16 18:31

Un' ultimissima domanda :-p Spero di non abusare della tua infinita pazienza con una testa dura come me. Per il conteggio dei TD dell'innerText del body bisogna usare innerHtml del body giusto?
templare77
Utente Senior
 
Post: 153
Iscritto il: 18/04/16 06:26

Re: I.E. busy non funziona

Postdi Anthony47 » 22/08/16 23:33

Al posto dello Stop ci va il codice di cui parliamo da 3 giorni.
Un esempio, basato pero' sul conteggio dei tag TD, e' nel messaggio che ti ho gia' linkato.
Avatar utente
Anthony47
Moderatore
 
Post: 19183
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: I.E. busy non funziona

Postdi templare77 » 23/08/16 10:06

Ti ringrazio! Allora adatteró il codice "conta TD" all'innerText del body, in modo tale da "looppare" fintantoché la lunghezza dell'innerText cambia lunghezza e così dovremmo risolvere..... Grazie mille ancora!
templare77
Utente Senior
 
Post: 153
Iscritto il: 18/04/16 06:26

Re: I.E. busy non funziona

Postdi templare77 » 23/08/16 15:48

Ciao Anthony, scusa per la petulanza :P :P .... forse ho trovato anche un'alternativa. Quando si esegue una ricerca nel sito in questione, compare un'immagine gif di caricamento in corso. Questa immagine è contenuta nel div con id "waitmodal". Ispezionando con Chrome ho notato che mentre la gif è in sovraimpressione, lo style di questo div è impostato su "block;", mentre quando il caricamento è stato completato, lo style cambia su "none;".

Allora con questo codice che sembra funzionare, intercetto il cambiamento di stile del div interessato e riesco a simulare una sorta di readyState... che ne pensi potrebbe andare?

Codice: Seleziona tutto
Set wait_div = ie.document.getelementbyid("waitmodal")
ie.document.getelementbyid("form_submit").Click
'
    Debug.Print wait_div.getAttribute("style")
    Do While wait_div.getAttribute("style") = "display: block;"
        Debug.Print wait_div.getAttribute("style")
        'Application.Wait TimeSerial(Hour(Now), Minute(Now), Second(Now + TimeValue("00:00:01")))
    Loop
   
    Debug.Print wait_div.getAttribute("style")
templare77
Utente Senior
 
Post: 153
Iscritto il: 18/04/16 06:26

Re: I.E. busy non funziona

Postdi Anthony47 » 24/08/16 23:27

Quello che hai fatto risponde al suggerimento generale che ti avevo dato: cerca e monitorizza una condizione che puo' dimostrare che l'operazione e' avvenuta e si e' conclusa.
Io comunque inserirei una attesa iniziale prima del Do While (per essere certi che lo script abbia gia' modificato il contenuto della pagina) e un'altra alla fine (per essere certi che il nuovo contenuto sia stabilizzato).
Puoi semplificare l'attesa in Application.Wait (Now + TimeValue("0:00:01"))

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19183
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "I.E. busy non funziona":


Chi c’è in linea

Visitano il forum: Nessuno e 54 ospiti