[RISOLTO] Elaborazione dati contenuti in una Pagina Web

di il
7 risposte

[RISOLTO] Elaborazione dati contenuti in una Pagina Web

Buongiorno,
ho creato una routine, all'interno di un pulsante, che serve per effettuare automaticamente delle operazioni su una pagina intranet (anche se fosse in internet il concetto non cambierebbe credo... ma non è questo il punto...).

La logica delle operazioni effettuate sono le seguenti:
  • - Apro pagina web; (OK)
    - La variabile "doc" contiene il documento caricato (o almeno credo che sia così) - (OK)
    - Seleziono un determinato valore in una combobox; (OK)
    - Forzo l'esecuzione dell'evento Onchange; (OK)
    - Aggiornare la variabile "doc" con il documento che, dopo l'effettuazione dell'evento onchange, ha cambiato il suo contenuto - NON OK
    - Operazioni di lettura e scrittura nel database (ancora da sviluppare); - NON CREDO RAPPRESENTI UN PROBLEMA;
    - Chiusura delle variabili - OK
codice:
Private Sub Comando0_Click()
    Dim ie As SHDocVw.InternetExplorer
    Dim doc As MSHTML.HTMLDocument
    Dim elements As MSHTML.IHTMLElementCollection
    Dim inputElement As Variant ' non so che tipo di variabile è... poi ci penso... intanto funziona
    Dim nr As Integer
    
    Set ie = New SHDocVw.InternetExplorer

    With ie
        .Navigate "sito INTRANET (o internet)"
       
        Do Until Not .Busy And .ReadyState = 4
            DoEvents
        Loop
    
        Set doc = .Document

        MsgBox ("Chiudi per avviare la routine")
        .Visible = True
                     
        Set elements = doc.getElementsByTagName("SELECT")
        nr = 1
        If Not elements Is Nothing Then
            For Each inputElement In elements
                If nr = 2 Then ' perchè mi interessa solo il secondo elemento
                    inputElement.Value = "Valore opzione della select"
                    inputElement.FireEvent ("onChange")
                    ' MsgBox (CStr(inputElement.Value)) ' mi visualizza il valore dell'elemento corrente
                End If
                nr = nr + 1
            Next inputElement
        End If
        'Debug.Print CStr(nr) ' mi scrive il numero di elementi processati
        
        Set doc = .Document ' pensavo mi aggiornasse la variabile con quanto visualizzato nel documento IE ma non è cosi!!!!!
        
        Set elements = doc.getElementsByTagName("TD")
        
	nr = 1
        If Not elements Is Nothing Then
            For Each inputElement In elements
                
                 Debug.Print "nr: " & CStr(nr) & " - " & CStr(inputElement.innerText) ' stampa il contenuto dei <TD>
                    
                 nr = nr + 1
            Next inputElement
        End If
    End With
  
    ie.Quit
    Set ie = Nothing
    Set doc = Nothing
    Set elements = Nothing
    Set inputElement = Nothing

End Sub
In pratica il problema è che non riesco ad aggiornare la variabile doc con il contenuto della pagina di internet Explorer dopo che è stata aggiornata...

oppure...
in alternativa pensavo ad un eventuale comando esplicito che ad esempio mi permetta di settare una variabile dello stesso tipo, con quanto attualmente visualizzato in internet Explorer (quindi intercettare l'istanza già aperta)

qualcuno sa come fare?

grazie.

7 Risposte

  • Re: [RISOLTO] Elaborazione dati contenuti in una Pagina Web

    Angelo_Tbp ha scritto:


    ...
    - Aggiornare la variabile "doc" con il documento che, dopo l'effettuazione dell'evento onchange, ha cambiato il suo contenuto - NON OK
    Occhio che non ho mai fatto una cosa del genere (ed in generale con gli oggetti di Internet Explorer) e proprio per questo... il thread mi stuzzicava.
    Ad intuito, secondo quanto ho letto in giro, partendo da qui credo che si faccia con un refresh, pensando a cosa di deve fare "a mano" per aggiornare il contenuto visualizzato della pagina
    
        With ie
            .Navigate "sito INTRANET (o internet)"
    ...
            End If
            'Debug.Print CStr(nr) ' mi scrive il numero di elementi processati
            
            .Refresh
            Do Until Not .Busy And .ReadyState = 4
                DoEvents
            Loop
            Set doc = .Document '
  • Re: [RISOLTO] Elaborazione dati contenuti in una Pagina Web

    Non so se questo può avere lo stesso concetto di ragionamento...:
    https://www.experts-exchange.com/questions/22125109/Refresh-InternetExplorer-Object-after-document-form-submit.html
  • Re: [RISOLTO] Elaborazione dati contenuti in una Pagina Web

    Grazie per la risposta Phil

    Ho testato il refresh e in effetti corrisponde esattamente al refresh fatto "a mano" in IE.
    Tuttavia ho motivo di supporre che forse il problema sia nel fatto che lo scraping inizia immediatamente dopo lo scatenarsi dell'evento onchange e immediatamente prima dell'aggiornamento della pagina. Ne deriva che l'importazione dati avviene quando la pagina non é stata ancora completamente caricata e quindi anche se a video vedo i dati "nuovi" in realtà ho importato quelli "vecchi"... Se così fosse non servirebbe neanche inserire il refresh ma basterebbe attendere il caricamento della pagina scaturito dall'evento onchange prima di effettuare lo scraping...

    L'ispirazione l'ho avuta accedendo al seguente http://stackoverflow.com/questions/27814073/use-vba-to-click-html-button-and-then-scrape-refreshed-data ... Speriamo funzioni


    Non ho modo di testarlo ora ma appena avrò aggiornamenti faccio sapere ?
  • Re: [RISOLTO] Elaborazione dati contenuti in una Pagina Web

    @Alex ha scritto:


    Non so se questo può avere lo stesso concetto di ragionamento...:
    https://www.experts-exchange.com/questions/22125109/Refresh-InternetExplorer-Object-after-document-form-submit.html
    Eravamo quindi giunti alle medesime conclusioni in effetti il link che hai proposto suggerisce di temporeggiare dopo l'aggiornamento e prima dello scraping.

    Attendo speranzoso il test.

    Grazie.
  • Re: [RISOLTO] Elaborazione dati contenuti in una Pagina Web

    Concludo il 3D dicendo che l'aggiornamento dell'oggetto document è sincronizzato con quanto visualizzato in internet explorer quindi non necessita di refresh. Il codice nei collegamenti è stato determinante per la risoluzione.
  • Re: [RISOLTO] Elaborazione dati contenuti in una Pagina Web

    Angelo_Tbp ha scritto:


    Concludo il 3D dicendo che l'aggiornamento dell'oggetto document è sincronizzato con quanto visualizzato in internet explorer quindi non necessita di refresh. Il codice nei collegamenti è stato determinante per la risoluzione.
    Potresti quindi pubblicare il codice funzionante con le modifiche apportate? Così magari mi oriento meglio in quei link per ora un po' oscuri. Grazie.
  • Re: [RISOLTO] Elaborazione dati contenuti in una Pagina Web

    Posto il codice così come da me modificato in base alle mie esigenze:
    Public Function Scraping()
    'by Angelo_tbp
    
     'Riferimenti richiesti:
        'Microsoft Internet Controls
        'Microsoft HTML Object Library
        
        Dim ie As SHDocVw.InternetExplorer
        Dim doc As MSHTML.HTMLDocument
        Dim elements As MSHTML.IHTMLElementCollection
        Dim inputElement As MSHTML.IHTMLElementCollection
      
        
        Set ie = New SHDocVw.InternetExplorer
    
        With ie
            .Navigate "Inserisci URL"
           
            Do Until Not .Busy And .ReadyState = 4
                DoEvents
            Loop
        
            Set doc = .Document
            .Visible = True
     
            'Non sono pienamente convinto che la routine parta a caricamento completo quindi blocco esecuzione script con un msgbox
            'sto studiando il modo di temporizzare mediante ontimer della maschera per lanciare un sendkeys "INVIO" dopo 5 secondi
            'così il msgbox mi si chiude da solo e la finestra sarà già caricata...(5 secondi nel mio caso sono sufficienti)
            MsgBox ("Chiudi per avviare la routine")
            
            .Document.getElementById("IFramE_numero1").contentWindow.Document.getElementById("IFramE_numero2 che si trovadentro IFramE_numero1").contentWindow.Document.getElementById("ComboBoxUNOcontenutaNel IFramE_numero1").Value = "valoredaselezionare"
            .Document.getElementById("IFramE_numero1").contentWindow.Document.getElementById("IFramE_numero2 che si trovadentro IFramE_numero1").contentWindow.Document.getElementById("ComboBoxDUEcontenutaNel IFramE_numero1").Value = "valoredaselezionare"
            .Document.getElementById("IFramE_numero1").contentWindow.Document.getElementById("IFramE_numero2 che si trovadentro IFramE_numero1").contentWindow.Document.getElementById("Pulsante in IFramE_numero1 che esegue azione aggiornamento IFramE_numero3 ").Click
            
            Set elements = .Document.getElementById("IFramE_numero1").contentWindow.Document.getElementById("IFRAME_numero3 che si trovadentro IFramE_numero1").contentWindow.Document.getElementsByTagName("TD")
        
            If Not elements Is Nothing Then
                For Each inputElement In elements
                        Debug.Print inputElement.innerText ' mi scrive il testo presente in ogni TD
                Next
            End If
        End With
        
    
        ie.Quit
        Set ie = Nothing
        Set doc = Nothing
        Set elements = Nothing
        Set inputElement = Nothing
    
    End Function
    
    Considera che il codice è specifico per la URL che ho processato.. URL differenti richiederanno codice differente..
    inoltre ci sono da considerare anche le impostazioni di protezione del browser.. l'utilizzo di IEmedium (goooooooooogle .... sono troppi link da postare... dovrei ricercarli di nuovo... non li ho trascritti...)

    -Nel esempio la pagina web che ho processato è un HTML che contiene un IFRAME che a sua volta ne contiene altri 2;
    -nell' IFRAME 2 (che si trova nel IFRAME1) ci sono 2 combobox e un pulsante che premuto aggiorna IFRAME3;
    -l'IFRAME 3 contiene una tabella che in HTML...ese ha <TABLE> <TR> e <TD> .... io ho preso l'inner text dei TD per memorizzarlo nel DB...

    spero possa essere d'aiuto.

    saluti.
Devi accedere o registrarti per scrivere nel forum
7 risposte