Errore nella classe WebBrowser

di il
12 risposte

Errore nella classe WebBrowser

Buongiorno,

ho creato questa routine per leggere, all'interno di una pagina web, l'indirizzo di uno specifico link, ho scritto il seguente codice con Visual Studio community 2019:

Private Sub TSBImportaMonografia()
        Static wb As WebBrowser, readText As String()
        Dim dgv As DataGridView = ElencoTAFDataGridView
        Dim selectedRowCount As Integer = dgv.Rows.GetRowCount(DataGridViewElementStates.Selected)

        If selectedRowCount = 1 Then
            If IsNothing(wb) Then
                wb = New WebBrowser
                AddHandler wb.DocumentCompleted, AddressOf Wb_DocumentCompleted
            End If
            If IsNothing(readText) Then
                readText = File.ReadAllLines(dirApplicationData & "\Preferenze.tfm")
            End If



            Dim comune As String = ComuneToolStripComboBox.ComboBox.SelectedItem(1).ToString.ToUpper
            Dim firstSlashPos As Integer = comune.IndexOf(" ")
            If firstSlashPos > 0 Then comune = comune.Substring(0, firstSlashPos)
            Dim rigaSelez As Integer = dgv.CurrentRow.Index
            Dim codComune As String = dgv.Rows(rigaSelez).Cells(0).Value.ToString.Substring(0, 4)
            Dim foglioFile As String = dgv.Rows(rigaSelez).Cells(1).Value.ToString

            Dim linkM As String = String.Format("{0}{1}&comune={2}&co={3}&foglio={4}",
                        readText(6),
                        Replace(ProvincieToolStripComboBox.ComboBox.SelectedItem(1), "'", ""),
                        comune,
                        codComune,
                        Integer.Parse(foglioFile.ToString.Substring(0, 3)))

            wb.Navigate(linkM, False)
        Else
            MessageBox.Show("Non è stato selezionato nessun punto fiduciale (max 1)", "Download monografia PF", MessageBoxButtons.OK)
        End If

    End Sub

il valore della variabile linkM, per esempio, è: https://www1.agenziaentrate.gov.it/servizi/Monografie/risultato.php?provincia=ORISTANO&comune=ABBASANTA&co=A007&foglio=4

L'errore si verifica sulla riga:  wb.Navigate(linkM, False)

Cliccando sul tasto Si prosegue con il Sub sotto e completa la procedura senza problemi, ma non capisco dov'è l'errore di sintassi. Tengo a precisare che questo errore si è verificato da qualche giorno, prima funzionava perfettamente.


   Private Sub Wb_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs)

        Static readText As String()
        If IsNothing(readText) Then
            readText = File.ReadAllLines(dirApplicationData & "\Preferenze.tfm")
        End If
        Dim cartMono As String = readText(16)

        Dim wb As WebBrowser = DirectCast(sender, WebBrowser)
        Dim dgv As DataGridView = ElencoTAFDataGridView

        Dim rigaSelez As Integer = dgv.CurrentRow.Index
        Dim codComune As String = dgv.Rows(rigaSelez).Cells(0).Value.ToString
        Dim foglioFile As String = dgv.Rows(rigaSelez).Cells(1).Value.ToString
        Dim numPF As String = dgv.Rows(rigaSelez).Cells(2).Value.ToString.Substring(2, 2)
        Dim filePF As String = codComune & "-" & foglioFile & "-" & numPF
        Dim comune As String = ComuneToolStripComboBox.ComboBox.SelectedItem(1)
        Dim noMono As Boolean = True


        For Each he As HtmlElement In wb.Document.Links
            Dim linkMonografia As String = he.GetAttribute("href")
            If linkMonografia.Contains("namefile=" & filePF) Then
                noMono = False ' no mono
                Using SFD As New SaveFileDialog
                    With SFD
                        .Title = "Salvataggio monografia PF" & numPF & "/" & foglioFile & "/" & codComune
                        .DefaultExt = "PDF"
                        .AddExtension = True
                        .InitialDirectory = cartMono
                        .Filter = "file pdf|*.pdf"
                        .FileName = codComune & "-" & foglioFile & "-" & numPF
                        .OverwritePrompt = True
                        If Not .ShowDialog = Windows.Forms.DialogResult.OK Then Exit For
                        Try
                            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
                            My.Computer.Network.DownloadFile(linkMonografia, .FileName, "", "", False, 25000, True)
                            Process.Start(.FileName)
                            Exit For
                        Catch ex As Exception
                            Dim msgBoxResult = MsgBox(ex.Message, MsgBoxStyle.RetryCancel)
                            'Exit For
                            TSBImportaMonografia()
                        End Try
                    End With
                End Using
            End If
        Next
        If noMono Then
            If ComuneToolStripComboBox.ComboBox.SelectedItem(1) = "Intera provincia" Then
                MessageBox.Show("Il PF" & numPF & " del foglio " & foglioFile &
                                " del Comune con codice " & codComune & " è senza monografia",
                                "Download monografia PF", MessageBoxButtons.OK)
            Else
                MessageBox.Show("Il PF" & numPF & " del foglio " & foglioFile &
                                " del Comune di " & comune & " è senza monografia",
                                "Download monografia PF", MessageBoxButtons.OK)
            End If
        End If
    End Sub

12 Risposte

  • Re: Errore nella classe WebBrowser

    È un errore dello script  Javascript

  • Re: Errore nella classe WebBrowser

    Quindi non dipende dal mio codice, ma dall'aggiornamento che ho fatto qualche giorno fa di Java?

  • Re: Errore nella classe WebBrowser

    Java? Io parlo di Javascript

  • Re: Errore nella classe WebBrowser

    01/08/2024 - Giorgio ha scritto:


    Quindi non dipende dal mio codice, ma dall'aggiornamento che ho fatto qualche giorno fa di Java?

    “Java” sta a “JavaScript” come “cane” sta a “canestro”: non sono la stessa cosa!

  • Re: Errore nella classe WebBrowser

    Ciao Giorgio,
    dopo la riga

    wb = New WebBrowser

    devi aggiungere la riga

    wb.ScriptErrorsSuppressed = True
  • Re: Errore nella classe WebBrowser

    C'è quasi sicuramente anche un altro problema: se il motore utilizzato è quello di Internet Explorer, è lecito aspettarsi che la maggior parte dei siti generi errori e difetti di visualizzazione, in quanto il browser è obsoleto e non supporta la quasi totalità delle feature moderne, in particolare di JavaScript e CSS.

    Conviene effettuare una migrazione del motore utilizzato a Edge (WebView).

  • Re: Errore nella classe WebBrowser

    Infatti, mi sembra strano che ci sia un “errore di sintassi” in codice delle Agenzie delle Entrate (sebbene non impossibile).

    E' più facile che, come dice Alka, il motore del browser (obsoleto) non riesca a comprendere codice più recente.

    Evitare l'emissione di ogni messaggio di errore dagli script Javascript può essere efficace ma anche “pericoloso”. Sarebbe meglio non utilizzare il WebBrowser.

  • Re: Errore nella classe WebBrowser

    Esatto, il codice come lo hai fatto tu (se non hai già modificato il registro di window) fa partire Internet Explorer versione 7, che quindi crea un sacco di problemi.

    eccoti un pezzo di codice della mia libreria per la gestione del WebBrowser, dopo aver creato l'oggetto webbrowser chiama questa routine:

        <System.Runtime.CompilerServices.Extension()> _
        Public Function InitIE11(WB As System.Windows.Forms.WebBrowser) As String
    
            WB.ScriptErrorsSuppressed = True
    
            Try
                ' Computer\HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
                Dim VersionCode = 11001 ' IE11
                Dim Root As String = "HKEY_CURRENT_USER\"
                Dim AppName = My.Application.Info.AssemblyName
                Dim Key As String = "Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION"
    
                Dim SubKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(Key)
                If SubKey Is Nothing Then
                    ' chiave non trovata, tento di crearla
                    SubKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(Key)
                    If SubKey Is Nothing Then
                        Return "Impossibile creare la voce di registro per il WebBrowser"
                    End If
                End If
    
                Dim CurrentSetting As String = CStr(SubKey.GetValue(AppName & ".exe"))
                If CurrentSetting Is Nothing OrElse CInt(CurrentSetting) <> VersionCode Then
    #If DEBUG Then
                    Microsoft.Win32.Registry.SetValue(Root & Key, AppName & ".vshost.exe", VersionCode)
    #End If
                    Microsoft.Win32.Registry.SetValue(Root & Key, AppName & ".exe", VersionCode)
                End If
            Catch ex As Exception
                Return "Exception: " & ex.Message
            End Try
    
            Return ""
    
        End Function

    se la funzione ritorna una stringa vuota è andato tutto ok, se ritorna qualcosa c'è un errore

    questa funzione imposta la compatibilità con Internet Explorer 11, e quindi funziona su molti più siti

  • Re: Errore nella classe WebBrowser

    01/08/2024 - Alka ha scritto:


    01/08/2024 - Giorgio ha scritto:


    Quindi non dipende dal mio codice, ma dall'aggiornamento che ho fatto qualche giorno fa di Java?

    “Java” sta a “JavaScript” come “cane” sta a “canestro”: non sono la stessa cosa!

    Chiedo scusa per l'ignoranza

  • Re: Errore nella classe WebBrowser

    01/08/2024 - SirJo ha scritto:


    Esatto, il codice come lo hai fatto tu (se non hai già modificato il registro di window) fa partire Internet Explorer versione 7, che quindi crea un sacco di problemi.

    eccoti un pezzo di codice della mia libreria per la gestione del WebBrowser, dopo aver creato l'oggetto webbrowser chiama questa routine:

        <System.Runtime.CompilerServices.Extension()> _
        Public Function InitIE11(WB As System.Windows.Forms.WebBrowser) As String
    
            WB.ScriptErrorsSuppressed = True
    
            Try
                ' Computer\HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
                Dim VersionCode = 11001 ' IE11
                Dim Root As String = "HKEY_CURRENT_USER\"
                Dim AppName = My.Application.Info.AssemblyName
                Dim Key As String = "Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION"
    
                Dim SubKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(Key)
                If SubKey Is Nothing Then
                    ' chiave non trovata, tento di crearla
                    SubKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(Key)
                    If SubKey Is Nothing Then
                        Return "Impossibile creare la voce di registro per il WebBrowser"
                    End If
                End If
    
                Dim CurrentSetting As String = CStr(SubKey.GetValue(AppName & ".exe"))
                If CurrentSetting Is Nothing OrElse CInt(CurrentSetting) <> VersionCode Then
    #If DEBUG Then
                    Microsoft.Win32.Registry.SetValue(Root & Key, AppName & ".vshost.exe", VersionCode)
    #End If
                    Microsoft.Win32.Registry.SetValue(Root & Key, AppName & ".exe", VersionCode)
                End If
            Catch ex As Exception
                Return "Exception: " & ex.Message
            End Try
    
            Return ""
    
        End Function

    se la funzione ritorna una stringa vuota è andato tutto ok, se ritorna qualcosa c'è un errore

    questa funzione imposta la compatibilità con Internet Explorer 11, e quindi funziona su molti più siti

    Cosi non segnala l'errore JavaScript, grazie

  • Re: Errore nella classe WebBrowser

    01/08/2024 - oregon ha scritto:


    Infatti, mi sembra strano che ci sia un “errore di sintassi” in codice delle Agenzie delle Entrate (sebbene non impossibile).

    E' più facile che, come dice Alka, il motore del browser (obsoleto) non riesca a comprendere codice più recente.

    Evitare l'emissione di ogni messaggio di errore dagli script Javascript può essere efficace ma anche “pericoloso”. Sarebbe meglio non utilizzare il WebBrowser.

    Cosa dovrei utilizzare nel mio caso?

  • Re: Errore nella classe WebBrowser

    Soluzioni ce ne sono molte.

    io di programmi che simulano la navigazione su internet ne ho parecchi.

    Se non ho grosse esigenze ed il sito è compatibile utilizzo ancora WebBrowser, attivandolo come IE11, ma mi sono costruito una lilbreria (in realtà sono una serie di estensioni dell'oggetto WebBrowser) che mi permette di avere macro istruzioni utilissimi, come ad esempio SelectElement, SelectElements e altre utiilty.

    Io non utilizzo l'evento DocumentCompleted perchè se il progetto è abbastanza complicato bisogna scrivere praticamente tutto dentro lì, preferisco utilizzare un Wait dopo che ho fatto il Navigate, controllando ovviamente eventuali errori o cose del genere.

    In questo modo scrivi tutto sequenzale e (ameno per me) ho un controllo molto più sofisticato su tutta la procedura.

    Se parliamo invece di siti non compatibili con IE11 hai molte altre soluzioni tra cui:

    1) WebView2 della Microsoft, che però ho usato solo per fare dei test e a livello didattico, sinceramente non mi piace proprio, un po' troppo complicato da usare, ma soprattutto difficile interagire tra il codice VB.NET e il DOM, si può farlo solo tramite codice JavaScript e quindi difficile se devi fare dei cicli di ricerca o cose del genere

    2) progetti di terze parti: personalmente sto usando molto Selenium, gratuito, funziona sia con Chrome (che io uso) ma anche con Firefox e altri browser. Anche qui mi sono costruito una libreria di funzioni per rendere il tutto molto più facile da usare, ma ha già comunque un sacco di funzioni e metodi proprio per accedere al DOM

Devi accedere o registrarti per scrivere nel forum
12 risposte