Condividi:        

Usare IE

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

Usare IE

Postdi Raffaele53 » 09/01/25 12:59

In riferimento a viewtopic.php?f=26&t=113467
Nuovo aggiornamento del sito ed il codice OLD-AGCOM non funziona più.

Premessa: non posso installare "Selenium" sù computer aziendali, W10 termina nel 2025 e IE (non più supportato da tempo), però funzionante ancora sul mio PC.

Ho provato con altri siti che visualizzo correttamente
(Ex https://it.wikipedia.org/wiki/Pagina_principale), invece sù
(https://datiroc.agcom.it/numerazionicallcenter) non visualizzo nulla (schermata bianca).Per cortesia potete controllare sul Vostro PC.
Come dovrò procedere in futuro? Desiderei una Vostra opinione in merito (non conosco altri metodi).

Ps. Mi sembra che l'ID della cella d'immissione numero si chiami "e-0" ???
Codice: Seleziona tutto
Option Explicit
Sub Telefoni_Agcom()
Dim Ur As Long, x As Long, c As Long, Num As String
    Dim ie As Object
    Dim Doc As Object
    Dim HTMLtr As Object
    Dim HTMLTable As Object
    Dim HTMLtd As Object
    Dim HTMLTables  As Object
    Dim oHTML_Element As IHTMLElement
    Const myURL As String = "https://datiroc.agcom.it/numerazionicallcenter"
    'Const myURL As String = "https://it.wikipedia.org/wiki/Pagina_principale"
    Ur = Range("F" & Rows.Count).End(xlUp).Row
        Set ie = CreateObject("InternetExplorer.Application")
        With ie
            .navigate myURL
            .Visible = True
            Do While .Busy: DoEvents: Loop
            Do While .readyState <> 4: DoEvents: Loop
        End With
        Set Doc = ie.document

'For x = 2 To Ur
    c = 7
    Num = "0682950305" 'Num = Cells(x, 6)
        Doc.getElementById("e-0").Value = Num '<<<<ERRORE
        For Each oHTML_Element In Doc.getElementsByTagName("input")
            If oHTML_Element.Type = "submit" Then oHTML_Element.Click:  Exit For ' circa 10 Each
        Next
        ''''''''''''''''''' Aggiunto perchè mi copiava il valore della ricerca precente
        With ie
            Do While .Busy: DoEvents: Loop
            Do While .readyState <> 4: DoEvents: Loop
        End With
        Set Doc = ie.document
        '''''''''''''''''
        Set HTMLTables = Doc.getElementsByClassName("tab-telefonia-fissa")
            For Each HTMLTable In HTMLTables ' qui salta se la ricerrca non da esito
                For Each HTMLtr In HTMLTable.getElementsByTagName("tr")
                    For Each HTMLtd In HTMLtr.getElementsByTagName("td")
                        Cells(x, c) = HTMLtd.innerText
                        c = c + 1
                    Next HTMLtd
                Next HTMLtr
            Next HTMLTable
            If Cells(x, 7) = "" Then Cells(x, 7) = "Non esiste"
'Next
    ie.Quit
    MsgBox "Finito" ', fatto in "
    Set ie = Nothing
    Set Doc = Nothing
End Sub
Raffaele53
Utente Junior
 
Post: 44
Iscritto il: 03/10/24 13:06

Sponsor
 

Re: Usare IE

Postdi Anthony47 » 09/01/25 19:07

Anche sul mio pc riesco ancora ad eseguire sessioni di InternetExplorer, però a quell’url poi non corrisponde nessuna pagina
Se guardi il “sorgente” della pagina, il “body” contiene solo 2 script:
Codice: Seleziona tutto
<body>
  <app-root></app-root>
<script src="polyfills-6EAL64PA.js" type="module"></script><script src="main-7SKJPZOL.js" type="module"></script></body>
Evidentemente quegli scripts quando si accorgono che il client e’ di tipo I.E. “vanno in sciopero”; in altre parole quel browser non e’ supportato.

Consigli? Se la ricerca e’ da fare per lavoro, dimostra a chi si occupa di IT nella tua azienda che Selenium potrebbe far risparmiare tempo e fornire un risultato più affidabile rispetto alla ricerca fatta a mano
So che non e' proprio originale, ma....
Avatar utente
Anthony47
Moderatore
 
Post: 19496
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Usare IE

Postdi Raffaele53 » 09/01/25 21:02

Grazie Anthony, in pratica ogni sito decide se le proprie pagine possono essere visualizzate da I.E. oppure negarle.

Alla Società dove lavora mio figlio, farò sapere che non ci sono altri metodi. Usando "Selenium & Edge", metto il numero nella casella mà non riesco a premere il bottone "Cerca", i risultati dovrebbero appartenere ad >>>td _ngcontent-ng-c61977633 (1/6)<<<
Se riesci ad aiutarmi Ti sarò grato.

Codice: Seleziona tutto
Option Explicit 'USARE BROWSER ................. EDGE
    Sub Telefoni_Agcom_Selenium()
        Dim Cd As New Selenium.EdgeDriver
       ' Dim Tb As Selenium.WebElements
        Dim El As Selenium.WebElement
        Dim eTr As Selenium.WebElement
        Const myURL As String = "https://datiroc.agcom.it/numerazionicallcenter"
        Dim Ur As Long, x As Long, n As Long, Col As Long, Num As String 'String per ex 02.123456789
        Ur = Range("F" & Rows.Count).End(xlUp).Row
        If x = 1 Then Exit Sub
        With Cd
            .Start
            .SetCapability "ms:edgeOptions", "{""args"":[""--headless""]}"
            .Get myURL
            .Wait 750
           ' .FindElementsByCss("button.agree-button")(1).Click    ' NON ESISTE cookies
            '.SwitchToFrame .FindElementsByTag("iframe")(1)        ' mi sposto nel frame
            '.activeElement.WaitEnabled
            x = 2 'For x = 2 To Ur
            Col = 7
            Num = "0682950306" '    Num = Cells(x, 6)
                .FindElementById("e-0").SendKeys (Chr$(127) & Num) ' inserisco il numero di telefono
                On Error Resume Next
                Do
                'QUI DOVREI PREMERE IL BOTTONE "Cerca"
                    '.FindElementsByClass("_ngcontent-ng-c1252000173").Click
                    '.FindElementsByClass("btn btn-primary").Click
                    '.FindElementsByClass("_ngcontent-ng-c1252000173").Click
                    If Err = 0 Then Exit Do
                    Err.Clear
                Loop
                On Error GoTo 0
            'QUI DOVREI ESTRARE I DATI, TUTTI NELLA STESSA RIGA PARTENDO DA COLONNA G
            Set Tb = .FindElementsByCss(".......")
            n = Tb.Count
                For Each eTr In .FindElementsByCss(".......")
                    If eTr.FindElementsByCss(".......").Count Then
                    ''  Range("G" & X).Value = .FindElementsByClass("ng-binding")(3).Attribute("innerText")
                        Cells(x, Col).Value = eTr.FindElementsByCss(".......")(6).Text: Col = Col + 1
                        Cells(x, Col).Value = eTr.FindElementsByCss(".......")(1).Text: Col = Col + 1
                        Cells(x, Col).Value = eTr.FindElementsByCss(".......")(2).Text: Col = Col + 1
                        Cells(x, Col).Value = eTr.FindElementsByCss(".......") '????  : Col = Col + 1
                        Cells(x, Col).Value = eTr.FindElementsByCss(".......") '????  : Col = Col + 1
                        Cells(x, Col).Value = eTr.FindElementsByCss(".......") '????  : Col = Col + 1
                        'DATO CHE CI SONO DUE RISULTATI, DEVE ESTRARNE 12 <td _ngcontent-ng-c61977633 (6x2)
                    End If
                Next eTr
           ' Next x
            .SwitchToParentFrame                                  ' ritorno al chiamante
 End With
'MsgBox "Fatto"
End Sub
Raffaele53
Utente Junior
 
Post: 44
Iscritto il: 03/10/24 13:06

Re: Usare IE

Postdi Anthony47 » 10/01/25 00:22

Quel sito e' un disastro... Tempi di attesa per avere una risposta 5-10-15-25! secondi...

Ho ottenuto buoni risultati con il seguente codice:
Codice: Seleziona tutto
Sub Telefoni_Agcom_Selenium()
    Dim Cd As New Selenium.EdgeDriver
   ' Dim Tb As Selenium.WebElements
    Dim El As Selenium.WebElement
    Dim eTr As Selenium.WebElement
    Dim noOne As Boolean, CollA As Object, XX As Long, MaxXX As Long
'
    Const myURL As String = "https://datiroc.agcom.it/numerazionicallcenter"
    Dim Ur As Long, x As Long, n As Long, Col As Long, Num As String 'String per ex 02.123456789
    Ur = Range("F" & Rows.Count).End(xlUp).Row
'    If x = 1 Then Exit Sub
    MaxXX = 40
    With Cd
         .Start
'            .SetCapability "ms:edgeOptions", "{""args"":[""--headless""]}"
         .Get myURL
         .Wait 750
        For x = 2 To Ur                 'loop sulle righe da esaminare
           Col = 7
           ''Num = "0682950306" '
           Num = Cells(x, 6)
               .FindElementById("e-0").SendKeys (Chr$(127) & Num) ' inserisco il numero di telefono
               On Error Resume Next
           For XX = 1 To 10             'Cerco la disponibilita' del bottone Cerca
                .Wait 300
                    'QUI DOVREI PREMERE IL BOTTONE "Cerca"
                Set CollA = .FindElementsByClass("btn-primary")
                If CollA.Count > 0 Then
                    CollA(1).Click
                    Exit For
                End If
            Next XX
            Debug.Print "X=" & x, "Wait=" & XX
            DoEvents
            noOne = False
            For XX = 1 To MaxXX         'Cerco che una risposta sia disponibile
'                Debug.Print String(XX, ".")
                .Wait 800
                Set CollA = .FindElementsByTag("td")
                If CollA.Count > 3 Then Exit For        'se >3 TD risultato pronto
                If InStr(1, CollA(1).Text, "Nessun risultato", vbTextCompare) > 0 Then      'Nessun risultato?
                    noOne = True
                    Exit For
                End If
                DoEvents
            Next XX
            Debug.Print "X=" & x, "noOne=" & noOne, "Wait=" & XX, "TD-Count=" & CollA.Count
            If noOne = False And XX < MaxXX Then
                'Se risultati disponibili, li copio:
                For XX = 1 To CollA.Count
                    Cells(x, XX + 7) = "'" & CollA(XX).Text
                    If XX >= 6 Then Exit For
                    DoEvents
                Next XX
            Else
                Cells(x, 8) = "Nessun Riscontro"
            End If
        Next x
    End With
MsgBox "Fatto"
End Sub

C'e' qualche commento che ti da l'idea di come ho ragionato per convivere con i tempi di reazione del sito

Ho messo i numeri telefonici in colonna F, e ho scritto i risultati da colonna H a M
Sulla "finestra Immediata" del vba vengono restituite informazioni sulla tempistica di elaborazione

Quanto alla disponibilita' di altri metodi, io non posso escludere che ce ne siano, ma non ne conosco perche' a me basta quello che ottengo con Selenium
Avatar utente
Anthony47
Moderatore
 
Post: 19496
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Usare IE

Postdi Raffaele53 » 10/01/25 18:26

Grazie mille Anthony47, solo alcune domande per imparare...
1) Ho pensato ad EDGE perchè di norma è installato in ogni PC, nel caso usassi Chrome i tempi di risposta sarebbero senpre uguali (con I.E. era circa 5/10 secondi per ogni numero)? Il codice sarebbe/funzionerebbe meglio?

2) For XX = 1 To 10, scrivendo solo ....
Set CollA = .FindElementsByClass("btn-primary")
CollA(1).Click
Mà alcune volte non funziona, per questo fai 10 tentativi?

3) For XX = 1 To MaxXX, 40 volte non riesco proprio a capirlo, in teoria "Nessun risultato" dovrebbe risultare subito a monitor

4) Chiederò per quale motivo i numeri dal xxxxxxx300 al xxxxxxx349 appartengono tutti della stessa S.P.A.
Ieri ho sbagliato numero col xxxxxxx305 finale il sito fornisce due risposte e togliendo ...If XX >= 6 Then Exit For... riesco ad estrapolare pure i "secondi-dati". Non credo sia un'errore togliere la riga.

Di nuovo grazie mille (molto complesso questo codice)
Raffaele53
Utente Junior
 
Post: 44
Iscritto il: 03/10/24 13:06

Re: Usare IE

Postdi Anthony47 » 10/01/25 19:51

Come hai avuto potuto constatare, i tempi di risposta del sito sono aleatori; quei For XX = 1 To NNN servono a inserire un tot di cicli di attesa e verifica di avere disponibile l’oggetto cercato.
In particolare il MaxXX=40 inserisce fino a 40 cicli di “attesa e verifica” di avere il risultato della query. Visto che ogni ciclo inserisce una wait di 800 msec, significa che ho previsto un’attesa fino a circa 32 secondi; e infatti io ho avuto situazioni con ritardo fino a 25 secondi prima di avere la risposta positiva o negativa. Comunque l’attesa viene interrotta in caso di risposta positiva (N° di TD maggiore di 3) o negativa (risposta che contiene “Nessun risultato”), quindi non dovremmo mai toccare i 32 sec max previsti.

Edge e Chrome usano lo stesso “engine”, le loro performance sono analoghe (al netto di eventuali addin installati); quindi l'uno o l'altro pari saranno. E comunque e’ il server agcom che ha una risposta da terzo mondo

Ho inserito quel If XX >= 6 Then Exit For per uscire dall’importazione al completamento di una informazione completa, non sapendo se potevano esserci altri “TD” con informazioni ausiliari e non sapendo che potevano essere restituiti anche piu’ righe di risultati. Hai fatto bene a eliminare quell’istruzione per importare ulteriori set di informazioni

La presunta complessità del codice deriva dalla necessita’ di gestire tempi di risposta variabili da pochi secondi a decine di secondi; di base il codice comprende:
-la compilazione del textbox (che avevi gia’ risolto tu)
-la ricerca e il click del pulsante
-la lettura del risultato in caso di risposta positiva o la gestione dell’esito negativo
Avatar utente
Anthony47
Moderatore
 
Post: 19496
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Usare IE

Postdi Raffaele53 » 11/01/25 10:22

Grazie delle info, ultime due domande...

1) Esiste un comando che interrompe il codice finchè la pagina non sia del tutto aggiornata? Possiamo solo usare comandi tipo ...Wait 750
Se non sbaglio con I.E, questo comando "Do While .ReadyState <> 4" aspettava che fosse aggiornata?

2) Visto in rete mà non ricordo dove. Hai un codice che estrapolava i nomi di tutti gli elementi di una pagina Web?

>>>complesso questo codice
Ps. Intendevo causa latenza inventarsi dei cicli FOR per ottenere una risposta
Raffaele53
Utente Junior
 
Post: 44
Iscritto il: 03/10/24 13:06

Re: Usare IE

Postdi Anthony47 » 11/01/25 16:52

Tutto dipende da come le pagine si aggiornano; questa si completa subito all'interrogazione (con la "rotella" che comincia a girare) ma si aggiorna poi quando la query sul server ha la risposta.
Per intenderci, il ReadyState <> 4 terminerebbe l'attesa appena la rotella comincia a girare.
Sapendo quello che fa la pagina, il nostro trucco e' guardare i "TD", e quando ce ne sono piu' di tre (all'inizio ce n'e' uno solo) capiamo che il risultato e' pronto; con IE avremmo dovuto fare lo stesso

Cosa intendi con "elementi di una pagina web"?
Avatar utente
Anthony47
Moderatore
 
Post: 19496
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Usare IE":


Chi c’è in linea

Visitano il forum: Nessuno e 17 ospiti