Da ja hier wieder vermehrt die Problematik des WebBrowser Logins auftraten habe ich mal einen kleinen Sourcecode geschrieben der dieses Problem des Form Submittes aufheben sollte.
Problem war ja immer das die Form nicht zwangsläufig eine ID oder einen Namen besitzt und man diese somit nicht ansprechen kann. Die Form über das Forms() Array ansprechen funktioniert auch nicht immer, vorallem wenn sich mehrere Formen auf der Homepage befinden.
Nun mein Lösungsansatz ist ganz einfach, jedes Inputfeld einer Form MUSS ja einen Namen haben, also hat man hier schonmal ein HtmlElement. Von diesem HtmlElement aus gehe ich in der Funktion rekursiv die einzelnen HtmlElement nach oben durch, solange bis ich die Form gefunden habe. Im Prinzip ganz einfach oder?
So zuerst erstellen wir mal eine neue Klassenbibliothek in unserem Projekt, dort kommt dann dieser Code rein
Das wars auch schon, nun noch ein Anwendungsbeispiel. Hierzu brauchen wir eine Form mit einem WebBrowser Control und einem Button.
Jetzt müsst ihr noch noch auf der Seite, wo ihr euch einloggen wollt, die Namen der entsprechenden Inputfeldern herausfinden. Das geht sehr leicht mit dem FireFox AddOn FireBug. Wenn ihr das habt einfach auf die Inputbox rechtsklicken un im Popupmenü "Element anzeigen" auswählen, danach öffnet sich ein neues Fenster wo dann direkt zu der Stelle im Quellcode gesprungen wird, wo das Inputfeld deklariert wird.
Hier mal im Beispiel von Web.de:
Problem war ja immer das die Form nicht zwangsläufig eine ID oder einen Namen besitzt und man diese somit nicht ansprechen kann. Die Form über das Forms() Array ansprechen funktioniert auch nicht immer, vorallem wenn sich mehrere Formen auf der Homepage befinden.
Nun mein Lösungsansatz ist ganz einfach, jedes Inputfeld einer Form MUSS ja einen Namen haben, also hat man hier schonmal ein HtmlElement. Von diesem HtmlElement aus gehe ich in der Funktion rekursiv die einzelnen HtmlElement nach oben durch, solange bis ich die Form gefunden habe. Im Prinzip ganz einfach oder?
So zuerst erstellen wir mal eine neue Klassenbibliothek in unserem Projekt, dort kommt dann dieser Code rein
VB.NET-Quellcode
- Public Class WebBrowserForm
- Private myBrowser As WebBrowser
- Private LastHtmlElement As HtmlElement
- Public Sub New(ByVal WebBrowser As WebBrowser)
- myBrowser = WebBrowser
- End Sub
- Public Sub InnerText(ByVal TextboxName As String, ByVal Value As String)
- myBrowser.Document.GetElementById(TextboxName).InnerText = Value
- LastHtmlElement = myBrowser.Document.GetElementById(TextboxName)
- End Sub
- Public Sub Checkbox(ByVal CheckboxName As String, ByVal Checked As Boolean)
- Dim sCheckState As String = ""
- If Checked Then sCheckState = "checked"
- myBrowser.Document.GetElementById(CheckboxName).SetAttribute("checked", sCheckState)
- LastHtmlElement = myBrowser.Document.GetElementById(CheckboxName)
- End Sub
- Public Sub Radiobox(ByVal RadioboxName As String, ByVal Value As String, Optional ByVal Checked As Boolean = True)
- Dim sCheckState As String = ""
- If Checked Then sCheckState = "checked"
- For Each oElement As HtmlElement In myBrowser.Document.GetElementsByTagName("INPUT")
- If oElement.Name = RadioboxName And oElement.GetAttribute("value") = Value Then
- oElement.SetAttribute("checked", sCheckState)
- LastHtmlElement = oElement
- Exit For
- End If
- Next
- End Sub
- Public Sub SelectListItem(ByVal ListboxName As String, ByVal Index As Integer)
- myBrowser.Document.GetElementById(ListboxName).Children(Index).SetAttribute("selected", "selected")
- LastHtmlElement = myBrowser.Document.GetElementById(ListboxName)
- End Sub
- Public Sub Submit()
- Dim FormElement As HtmlElement = GetForm(LastHtmlElement)
- FormElement.InvokeMember("submit")
- End Sub
- Private Function GetForm(ByVal CurrentHtmlElement As HtmlElement) As HtmlElement
- Try
- If CurrentHtmlElement.TagName.ToLower() = "form" Then
- Return CurrentHtmlElement
- Else
- Return GetForm(CurrentHtmlElement.Parent)
- End If
- Catch ex As Exception
- Return Nothing
- End Try
- End Function
- End Class
Das wars auch schon, nun noch ein Anwendungsbeispiel. Hierzu brauchen wir eine Form mit einem WebBrowser Control und einem Button.
VB.NET-Quellcode
- Public Class Form1
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- WebBrowser1.Navigate("http://web.de")
- While Not WebBrowser1.ReadyState = WebBrowserReadyState.Complete
- Application.DoEvents()
- End While
- Dim myForm As New WebBrowserForm(WebBrowser1)
- myForm.InnerText("inpLoginUsername", "e-mail adresse")
- myForm.InnerText("inpLoginPasswd", "passwort")
- myForm.Submit()
- End Sub
- End Class
Jetzt müsst ihr noch noch auf der Seite, wo ihr euch einloggen wollt, die Namen der entsprechenden Inputfeldern herausfinden. Das geht sehr leicht mit dem FireFox AddOn FireBug. Wenn ihr das habt einfach auf die Inputbox rechtsklicken un im Popupmenü "Element anzeigen" auswählen, danach öffnet sich ein neues Fenster wo dann direkt zu der Stelle im Quellcode gesprungen wird, wo das Inputfeld deklariert wird.
Hier mal im Beispiel von Web.de:
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Dodo“ ()