VB.NET Webbrowser Get element by Class
Inhaltsverzeichnis
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 Webbrowser–Control–Methoden an ein Element mit einem Klassen–Namen 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 getElementById–Funktion 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 „InnerText“ abgegriffen 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.
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