Come testare avvenuto caricamento pagina web nel controllo Webview2

di il
1 risposte

Come testare avvenuto caricamento pagina web nel controllo Webview2

Buonasera,

volevo chiedere aiuto sul come risolvere questo problema: nel mio programma uso un Webview2, carico un indirizzo e chiedo di navigare a tale pagina.. Non avendo proprieta da testare direttamente per sapere quando è caricata la pagina, prima di estrarne elementi con Javascript, uso l'evento asincrono “navigation completed” per impostare un flag booleano che viene testato dentro un loop.

Con un timer attendo massimo 30 sec prima di avere conferma dell'avvenuto caricamento pagina, oppure informo del problema se il timer scade.

Dentro il loop che controlla lo stato del flag impostato da “navigation completed” ho messo un msgbox:  se lo attivo, tutta la sequenza funziona e riesco a navigare alla pagina, impostare il flag caricamento avvenuto (ovviamente prima dei 30 sec), ed in seguito estraggo dati dalla pagina..

Ma se ometto la riga con msgbox, il tutto  si blocca in un loop infinito.. Non avendo esperienza sulla programmazione asincrona, e non avendo una proprietà di wv2 da testare per sapere se la pagina è caricata, ho provato con questa tecnica, che va a buon fine se c'e' la riga msgbox. In caso contrario si blocca tutto. Qualche suggerimento, anche alternativo a quanto pensato da me, per risolvere il problema? Non posso confermare a mano ogni volta..

C'e' da aggiungere da qualche parte qualcosa come DoEvents o simili per assicurare il navigation completed ed impedire il loop infinito?

Grazie!

*********************

dim tempo_scaduto as boolean = false                  ' flag 30 secondi passati

dim stato as boolean = false                                    ' flag di avvenuto caricamento pagina

Sub naviga_alla_pagina(pagina As String)
       
       'naviga
       wv2.Source = New Uri(pagina)

End Sub

   Private Async Sub wv2_NavigationCompleted(sender As Object, e As Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs) Handles wv2.NavigationCompleted

       'imposta il flag che dice se la pagina è stata caricata positivamente
       stato = True

       'resetta timer
       'timer_30sec.Enabled = False

   End Sub


   Sub attendi_caricamento_pagina()

       'attendo al massimo 30 secondi che la pagina venga caricata, e se non succede informo del problema
       timer_30sec.Enabled = True

       Do While tempo_scaduto = False

           'test only -- MsgBox(Now.Second)
           MsgBox(Now.Second) ' se ometto questa istruzione, il sistema va in loop indeterminato

'controllo che un flag di avvenuto caricamento pagina web sia stato impostato dall'evento Navigation completed del Webview2
           If stato = True Then
               timer_30sec.Enabled = False
               Exit Sub
           End If
       Loop

   End Sub
   
   
       Private Sub timer_30sec_Tick(sender As Object, e As EventArgs) Handles timer_30sec.Tick

       'se è scaduto il tempo di 30 secondi e non è stata caricata la pagina, imposto un flag errore
       tempo_scaduto = True

       MsgBox("tempo scaduto, il caricamento non è stato possibile!")
       timer_30sec.Enabled = False

   End Sub

1 Risposte

Devi accedere o registrarti per scrivere nel forum
1 risposte