WebView2 : come accedere ai documenti?

di il
69 risposte

WebView2 : come accedere ai documenti?

A seguito di un mio precedente argomento su Webbrowser, mi (ci) è stato suggerito di passare a WebView ,che offriva una migliore  visualizzazione delle pagine a fronte di una maggiore difficoltà.

Ho cercato di convertire il mio piccolo codice webbrowser (che prevedeva lo spostamento tra le pagine, la gestione di pagine di default, i preferiti,ecc) ,ma mi sono totalmente bloccato quando ho cercato di accedere al documento html per leggere il titolo e per poter gestire la cronologia.

Chiedo il vs. aiuto per sapere (nel modo più semplice possibile) come leggere il documento corrente.

Ho trovato questo codice, ma non so dove collocarlo. errore :

    Async Sub InitializeSyncroComponent()
       Await WebView21.ExecuteScriptAsync("document.documentElement.outerHTML;")
       Dim html As String
       ' The Html comes back with unicode character codes, other escaped characters, and
       ' wrapped in double quotes, so I'm using this code to clean it up for what I'm doing.
       html = Regex.Unescape(html)
       html = html.Remove(0, 1)
       html = html.Remove(html.Length - 1, 1)
   End Sub

Nell'evento load (dopo aver letto : InitializeSyncroComponent()) mi restituisce il seguente:

'The instance of CoreWebView2 is uninitialized and unable to complete this operation. See EnsureCoreWebView2Async.'

69 Risposte

  • Re: WebView2 : come accedere ai documenti?

    Nell'evento Form_Load devi aggiungere prima di tutto

    Await WebView21.EnsureCoreWebView2Async()
  • Re: WebView2 : come accedere ai documenti?

    31/08/2023 - SirJo ha scritto:


    Nell'evento Form_Load devi aggiungere prima di tutto

    Await WebView21.EnsureCoreWebView2Async()

    SirJo,grazie sempre per la tua cortesissima attenzione ai problemi di noi "sfigati"!
    Allora: await WebView21.EnsureCoreWebView2Async ,collocato nell'evento load ,genera un errore (rosso).

    Ho provato così :

     Sub Form39_Load(sender As Object, e As EventArgs) Handles MyBase.Load
           WebView21.Source = New Uri(My.Computer.FileSystem.ReadAllText(Application.StartupPath & "\pagina_default.txt"))
           EnsureCoreWebView2Async()
       End Sub
       Async Sub EnsureCoreWebView2Async()
           Await WebView21.EnsureCoreWebView2Async()
       End Sub
       Async Sub InitializeSyncroComponent()
           Await WebView21.ExecuteScriptAsync("document.documentElement.outerHTML;")
           Dim html As String
           html = Regex.Unescape(html)
           html = html.Remove(0, 1)
           html = html.Remove(html.Length - 1, 1)
       End Sub

    e nell'evento Private Sub WebView21_NavigationCompleted(sender As Object, e As Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs) Handles WebView21.NavigationCompleted ho inserito

    InitializeSyncroComponent()

    Il risultato finale è che html risula nothing.

    Grazie ancora.

  • Re: WebView2 : come accedere ai documenti?

    Await puoi usarlo solo dentro a Sub che sono Async, per cui:

        Private Async Sub Form39_Load(sender As Object, e As EventArgs) Handles Me.Load
            Await WebView21.EnsureCoreWebView2Async()
        End Sub
  • Re: WebView2 : come accedere ai documenti?

    01/09/2023 - SirJo ha scritto:


    Await puoi usarlo sono dentro a Sub che sono Async, per cui:

        Private Async Sub Form39_Load(sender As Object, e As EventArgs) Handles Me.Load
            Await WebView21.EnsureCoreWebView2Async()
        End Sub

    Fatto, ma html è sempre nothing.

  • Re: WebView2 : come accedere ai documenti?

    Fai un nuovo progetto, metti sul Form1 un oggetto WebView2 e chiamalo WV, e poi prova questo

    
    Imports System.Text.RegularExpressions
    Imports Microsoft.Web.WebView2.Core
    
    Public Class Form1
    
        Dim isBusy As Boolean
    
        Private Async Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Await WV.EnsureCoreWebView2Async()
        End Sub
    
        Private Async Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    
            isBusy = True
            WV.Source = New Uri("https://www.sirjo.com")
    
            Do While isBusy
                Application.DoEvents()
                Threading.Thread.Sleep(100)
            Loop
    
            Dim html As String
            html = Await WV.ExecuteScriptAsync("document.documentElement.outerHTML;")
            html = Regex.Unescape(html)
            html = html.Remove(0, 1)
            html = html.Remove(html.Length - 1, 1)
    
            Stop
    
        End Sub
    
        Private Sub WV_NavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs) Handles WV.NavigationCompleted
            isBusy = False
        End Sub
    End Class
    
  • Re: WebView2 : come accedere ai documenti?

    SirJo, che dire? sei un mago! Grandi ringraziamenti e consolidata stima.

  • Re: WebView2 : come accedere ai documenti?

    Questa libreria potrebbe essere utile https://html-agility-pack.net/ 

  • Re: WebView2 : come accedere ai documenti?

    Con Webview2 come si fa a passare una stringa di una textbox a  webview2 per visualizzarla in un punto della pagina htlm ?

    Per es : scrivo “ciao” in una casella di testo e voglio che compaia nella casella di ricerca di google…

    inoltre vorrei che quando ho inserito “ciao” nella casella di testo ,compaia nella ricerca di google e il pulsante cerca venga premuto  in automatico per effettuare la ricerca…

    se qualcuno puo' aiutarmi….sulla rete non ho trovato nessun esempio….

  • Re: WebView2 : come accedere ai documenti?

    Non uso Webview2 proprio per la sua complessità, preferisco di gran lunga utilizzare altri sistemi,
    comunque mi sembra di ricordare che si può accedere al DOM solamente tramite codice JavaScript

    Devi quindi utilizzare un “javascript injection” per fare tutto quello che vuoi (lettura e scrittura) degli oggetti presenti nel codice HTML

    Se analizzi la pagina di ricerca di google vedi che la casella di ricerca ha name="q" per cui potresti ad esempio usare questo codice JS:

    document.getElementsByName('q')[0].value='testo da cercare';

  • Re: WebView2 : come accedere ai documenti?

    Grazie per il suggerimento

    Ho visto un esempio di quello che dici fatto con

    Il vecchio controllo web browser 

    Webbrowser1.document ecc

    Ma  non riesco a fare Webview2.document ecc

    Come posso fare?

  • Re: WebView2 : come accedere ai documenti?

    
    Imports Microsoft.Web.WebView2.Core
    
    Public Class Form1
    
        Dim isBusy As Boolean
    
        Private Async Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Await WV.EnsureCoreWebView2Async()
        End Sub
    
        Private Async Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    
            isBusy = True
            WV.Source = New Uri("https://www.google.it")
    
            Do While isBusy
                Application.DoEvents()
                Threading.Thread.Sleep(100)
            Loop
    
            Await WV.ExecuteScriptAsync("document.getElementsByName('q')[0].value='testo da cercare';")
    
        End Sub
    
        Private Sub WV_NavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs) Handles WV.NavigationCompleted
            isBusy = False
        End Sub
    End Class
    
  • Re: WebView2 : come accedere ai documenti?

    Ho provato a compilare il tuo codice con visual studio 2022

    Imports Microsoft.Web.WebView2.Core

    Public Class Form1
       Dim isBusy As Boolean

       Private Async Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
           Await WV.EnsureCoreWebView2Async()
       End Sub

       Private Async Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown

           isBusy = True
           WV.Source = New Uri("https://www.google.it")

           Do While isBusy
               Application.DoEvents()
               Threading.Thread.Sleep(100)
           Loop

           Await WV.ExecuteScriptAsync("document.getElementsByName('q')[0].value='testo da cercare';")

       End Sub
       Private Sub WV_NavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs) Handles      WV.NavigationCompleted


           isBusy = False
       End Sub

    End Class

    mi da i seguenti errori che non comprendo :


    Errore    BC30506    La clausola Handles richiede una variabile WithEvents definita nel tipo che la contiene o in uno dei suoi tipi di base.    WebView21_prova    C:\Users\Stefano Bonardi\source\repos\WebView21_prova\Form1.vb    23    Attivo
    Errore    BC30451    'WV' non è dichiarato. Potrebbe essere inaccessibile a causa del livello di protezione.    WebView21_prova    C:\Users\Stefano Bonardi\source\repos\WebView21_prova\Form1.vb    7    Attivo
    Errore    BC30451    'WV' non è dichiarato. Potrebbe essere inaccessibile a causa del livello di protezione.    WebView21_prova    C:\Users\Stefano Bonardi\source\repos\WebView21_prova\Form1.vb    13    Attivo
    Errore    BC30451    'WV' non è dichiarato. Potrebbe essere inaccessibile a causa del livello di protezione.    WebView21_prova    C:\Users\Stefano Bonardi\source\repos\WebView21_prova\Form1.vb    20    Attivo

  • Re: WebView2 : come accedere ai documenti?

    Scusa se non te l'ho specificato, ma guardando il sorgente dovevi capire che WV è l'oggetto WebView2 che hai nel tuo form.
    Sostituisci WV con il nome del tuo oggetto (ad esempio WebView21)

  • Re: WebView2 : come accedere ai documenti?

    Si ho provato , ma mi da ancora errore 

    il problema é che WebView21  viene visto solo a livello Public Class Form1…

    se sposto per esempio WebView21.Source = New Uri("https://www.google.it") sotto  Public Class Form1

    non mi da errore…

Devi accedere o registrarti per scrivere nel forum
69 risposte