Come testare avvenuto caricamento pagina web nel controllo Webview2

di il
6 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

6 Risposte

  • Re: Come testare avvenuto caricamento pagina web nel controllo Webview2

    Usa i tahlg CODE per formattare il codice come da Regolamento

    Metti il Doevents al posto del MsgBox

  • Re: Come testare avvenuto caricamento pagina web nel controllo Webview2

    Mi spiace se ho infranto regole del Forum riguardo il codice.. 

    Riguardo il doevents al posto di msgbox, avevo già provato ma senza successo.. Non risolve. 

  • Re: Come testare avvenuto caricamento pagina web nel controllo Webview2

    Qualche altro suggerimento?  Anche non necessariamente su mio approccio sopraindicato, ma un metodo affidabile per essere sicuri del caricamento pagina da parte del controllo Webview2 prima di effettuare altri script..

    Grazie! 

  • Re: Come testare avvenuto caricamento pagina web nel controllo Webview2


    Questo è un altro motivo per cui ho abbandonato quasi subito l'uso di WebView2, anche mettendo DoEvents in realtà l'oggetto non fa quello che dovrebbe fare, bisogna proprio terminare tutto e tornare in “idle mode".

    P.S.: Oregon ti ha detto di sistemare il post e inserire i tag CODE, modificalo, così il codice risulta più leggibile

  • Re: Come testare avvenuto caricamento pagina web nel controllo Webview2

    Grazie per il tuo commento, SirJo..

    Ho corretto il testo sopra come chiedeva Oregon, spero ora vada bene.

    Devo dire che ho avuto parecchie difficoltà con il webview2, ma per certi versi è apprezzabile.. Penso che MSFT non gli abbia dato la giusta diffusione, non fornendo molte (e chiare) spiegazioni ed esempi. Sono certo che si possa fare molto di più di quanto si capisca dalla documentazione “basica” fornita; se qualcuno scrivesse un libro dedicato al controllo specifico con i suoi vari (e semplici!) esempi d'uso, in molti di più lo userebbero. Altre soluzioni che necessitano un browser incorporato nell'applicazione sono comunque complesse e/o rimandano a Javascript -Json etc. 

    Poi c'è da dire che la programmazione asincrona è parecchio più complessa da comprendere ed utilizzare rispetto a  quella “tradizionale”, sequenziale e “monotasking”, sopratutto per un “programmatore saltuario”  come il sottoscritto..

    Grazie ad entrambi, sto risolvendo comunque in altro modo il mio problema.

  • Re: Come testare avvenuto caricamento pagina web nel controllo Webview2

    20/10/2024 - SwPlayer ha scritto:


    Grazie ad entrambi, sto risolvendo comunque in altro modo il mio problema.

    Ok, grazie del tuo feedback, poi facci comunque sapere come hai risolto, sono curioso

Devi accedere o registrarti per scrivere nel forum
6 risposte