VB.NET Webbrowser Get element by Class

VB.NET Webbrowser Get Element By Class
VB.NET Webbrowser Get Element By Class

VB.NET Webbrowser Get element by Class

Du möchtest im Webbrowser Control an ein gewisses Element anhand der Klasse kommen und der Suchbegriff „VB.NET Webbrowser Get element by Class“ führte Dich her?

Dann bist Du hier richtig, denn in diesem Beitrag zeige ich Dir unter anderem, wie Du mit Hilfe der WebbrowserControlMethoden an ein Element mit einem KlassenNamen kommst.

Falls Du allerdings auf der Suche nach einem einfachen VB.NET Webbrowser-Control Beispiel bist, kannst Du in meinen Beitrag dazu nachlesen.

Noch einen Schritt einfacher, hast Du es mit meinem Beitrag über das öffnen einer Webseite in „VB.NET Webseite öffnen„.

Element anhand Id bekommen

Wer schonmal detaillierter mit dem Webbrowser-Control gearbeitet hat, wird sicherlich schon Bekanntschaft mit der getElementById-Funktion der Document-Eigenschaft gemacht haben.

Die getElementByIdFunktion wird ähnlich der von uns hier benötigten Funktion aufgerufen und gehört zu den essentiellen Webbrowser-Hilfsmitteln, daher zeige ich Sie hier noch einmal.

Um mit dessen Hilfe an ein Element via Id zu kommen, sieht ein Aufruf zum Beispiel wie folgt aus:

Dim theElement = wb.getElementById("<theId>")

Fehler unterbinden

Fehler vermeiden – VB.NET Webbrowser Get element by Class

Um ggf. besser mit dem Webbrowser arbeiten zu können, empfiehlt es sich eventuell, die ScriptErrorsSuppressed-Eigenschaft auf True zu stellen.

Damit werden wie der Name schon sagt, diverse Skriptfehler unterdrückt und gewähren somit einen flüssigeren, bzw. besseren Ablauf.

Wer sich ggf. bei der Arbeit gewisse Abläufe, oder Fehler nicht erklären kann, sollte die Eigenschaft auch testweise wieder deaktivieren, um zu schauen, ob es eventuell einen relevanten Fehler gibt.

GetElementsByClass – eigene Erweiterungen

Hier stelle ich zwei Erweiterungsmethoden für das WebBrowser-Document vor, um leichter an Elemente via Klassennamen zu kommen.

GetElementByClass

Die erste der beiden Funktionen greift auf die zweite Funktion zu, um dessen erstes Ergebnis oder Nothing zu liefern.

Sie liefert also entweder das erste Element mit diesem Klassennamen, oder eben Nothing, wenn nichts gefunden wurde.

GetElementsByClass

Diese Funktion iteriert alle Html-Elemente des Dokuments und ruft das className-Attribut des Elements ab.

Vorher gehe ich noch hin und kille den führenden Punkt, falls einer beim Aufruf der Funktion – wie bei Klassennamen üblich – übergeben wurde.

Leider heißt das so, obwohl man aus dem Web halt an das Attribut „class“ gewöhnt ist.

Nachdem wir die Klassennamen als String noch mit Trim von führenden und nachstehenden Leerzeichen gesäubert haben, können wir die Klassen durch Split in eine Auflistung packen.

Wenn diese Auflistung dann unsere übergebene Klasse beinhaltet, dann handelt es sich bei dem Element um ein Element unserer Begierde und wird letztendlich der elements-Variable für die Rückgabe hinzugefügt.

Imports System.Runtime.CompilerServices

Module modBrowserExtensions

    <Extension>
    Public Function GetElementByClass(doc As HtmlDocument, cls As String) As HtmlElement
        Dim elements = GetElementsByClass(doc, cls)
        Return elements.FirstOrDefault()
    End Function

    <Extension>
    Public Function GetElementsByClass(doc As HtmlDocument, cls As String) As List(Of HtmlElement)
        If cls.StartsWith(".") Then
            cls = cls.Substring(1)
        End If
        Dim elements = New List(Of HtmlElement)
        For Each element As HtmlElement In doc.All
            Dim className = element.GetAttribute("className").Trim()
            Dim classNames = className.Split(" ")
            If classNames.Contains(cls) Then
                elements.Add(element)
            End If
        Next
        Return elements
    End Function

End Module

Code – VB.NET Webbrowser Get element by Class

So nun kommen wir zum Code des heutigen Beitrages, wo wir schauen, wie man an ein Element im Webbrowser-Document mit Hilfe des Klassennamen kommen kann (VB.NET Webbrowser Get element by Class).

Vorbereitung

Styling

Auch in diesem Beitrag werde ich dem Webbrowser den Namen wb“ geben, da es schließlich unser einziges Webbrowser-Control sein wird.

Ansonsten sollten wir natürlich immer auf einen prägnanten Namen für Controls achten!

Als nächstes habe ich die Dock-Eigenschaft auf None gestellt, damit der Webbrowser nicht den gesamten Platz einnimmt und wir noch Platz für eventuelle andere Steuerelemente haben.

Wie oben vorgestellt, stelle ich auch die ScriptErrorsSuppressed-Eigenschaft auf True.

Die Form, bzw. dessen Startposition habe ich wie fast immer auf „CenterScreen“ gestellt, da es besonders auf großen Bildschirmen nervig ist (bei mir 50″ Curved..), wenn das Fenster jedes Mal oben links in der letzten Ecke hängt..

Controls

TextBox – tbUrl

Mit dieser TextBox kannst Du eine URL eingeben und anschließend dorthin navigieren.

Ich wollte die URL nicht hardcoden, da sich die Ziel-Seite nach Erstellung meines Beitrages ggf. ändert und deshalb nicht mehr funktioniert.

Button – btnGo

Mit diesem Button kann zur angegebenen URL navigiert werden.

WebBrowser – wb

Der Browser mit dem wir alles in diesem Beitrag ausprobieren.

TextBox – tbClassName

In dieser TextBox kannst Du einen Klassennamen (mit oder ohne Punkt) eingeben und somit nach dem jeweiligen Element suchen.

Anschließend wird dessen „InnerTextabgegriffen und in der dafür vorgesehenen TextBox angezeigt.

Button – btnGetElementsInnerText

Mit diesem Button wird die Suche nach dem Element via Klassenname ausgelöst und dessen InnerText in die rechte TextBox ausgegeben.

TextBox – tbInnerText

Hier wird der ausgelesene InnerText des Html-Elements ausgegeben und angezeigt.

Die TextBox ist bewusst auf ReadOnly gestellt, damit man dort nicht rumpfuschen kann.

Zur URL navigieren

Via Button

Mit diesem Button navigieren wir zur Ziel-Seite, nachdem wir vorher die URL aus der TextBox mit der Trim-Funktion abgegriffen haben.

Private Sub btnGo_Click(sender As Object, e As EventArgs) Handles btnGo.Click
    Dim url = tbUrl.Text.Trim()
    wb.Navigate(url)
End Sub

Via Enter

Um via Enter zur jeweiligen Seite zu navigieren, fügen wir folgenden Code ein:

Private Sub tbUrl_KeyDown(sender As Object, e As KeyEventArgs) Handles tbUrl.KeyDown
    If e.KeyCode = Keys.Enter Then
        Dim url = tbUrl.Text.Trim()
        wb.Navigate(url)
    End If
End Sub

Könnte man natürlich durch eine zentrale Sub lösen, um duplicated Code zu vermeiden..

Den InnerText auslesen

Um nun den InnerText auszulesen, müssen wir zuerst an das jeweilige Element mit Hilfe des Klassennamens kommen.

Leider fängt hier das große Fragezeichen an, denn das WebBrowser-Control hat dämlicherweise keine native Funktion um ein Element anhand seines Klassennamens zu bekommen.

Zum Glück haben wir aber dafür weiter oben unsere eigene Extension-Methoden gebaut!

Private Sub btnGetElementsInnerText_Click(sender As Object, e As EventArgs) Handles btnGetElementsInnerText.Click
    Dim className = tbClassName.Text.Trim()
    Dim element = wb.Document.GetElementByClass(className)
    If element IsNot Nothing Then
        tbInnerText.Text = element.InnerText
    End If
End Sub

Kompletter Code – VB.NET Webbrowser Get element by Class

Hier findest Du wie fast bei allen meiner Beiträge den kompletten Beispielcode, achte nur darauf, dass Dieser je nach Webseite eventuell nicht funktioniert (was nicht am Code direkt liegt!).

Dabei solltest Du auf die korrekten Klassennamen achten und überprüfen, ob der Klassenname sich nicht etwa bei jedem Aufruf der Seite ändert.

Public Class Form1

    Private Sub btnGo_Click(sender As Object, e As EventArgs) Handles btnGo.Click
        Dim url = tbUrl.Text.Trim()
        wb.Navigate(url)
    End Sub

    Private Sub tbUrl_KeyDown(sender As Object, e As KeyEventArgs) Handles tbUrl.KeyDown
        If e.KeyCode = Keys.Enter Then
            Dim url = tbUrl.Text.Trim()
            wb.Navigate(url)
        End If
    End Sub

    Private Sub btnGetElementsInnerText_Click(sender As Object, e As EventArgs) Handles btnGetElementsInnerText.Click
        Dim className = tbClassName.Text.Trim()
        Dim element = wb.Document.GetElementByClass(className)
        If element IsNot Nothing Then
            tbInnerText.Text = element.InnerText
        End If
    End Sub

End Class

Imports System.Runtime.CompilerServices

Module modBrowserExtensions

    <Extension>
    Public Function GetElementByClass(doc As HtmlDocument, cls As String) As HtmlElement
        Dim elements = GetElementsByClass(doc, cls)
        Return elements.FirstOrDefault()
    End Function

    <Extension>
    Public Function GetElementsByClass(doc As HtmlDocument, cls As String) As List(Of HtmlElement)
        If cls.StartsWith(".") Then
            cls = cls.Substring(1)
        End If
        Dim elements = New List(Of HtmlElement)
        For Each element As HtmlElement In doc.All
            Dim className = element.GetAttribute("className").Trim()
            Dim classNames = className.Split(" ")
            If classNames.Contains(cls) Then
                elements.Add(element)
            End If
        Next
        Return elements
    End Function

End Module

Downloads

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert