Webseite einloggen -> weiter navigieren und Daten holen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Dodo.

    Webseite einloggen -> weiter navigieren und Daten holen

    Hallo Leute!

    Da ich schon seit einigen Wochen "programmiere" ( :P ) habe ich mir schon viel aneignen können und habe auch schon sehr viele google-such-stunden und forum-durchforsterei hinter mir.
    Doch bei meinem jetzigen Problem komme ich absolut nicht weiter und das seit 2 Tagen (trotz Suche..)

    Was mein Programm bisher kann:
    Ich habe ein Bereich, wo ich meine Login-Daten laden kann. Diese sind wie folgt abgespeichert "username:passwort"
    Ich kann nun im ersten Schritt zur Login-Seite navigieren. Die Login-Daten werden mit Split aufgeteilt.
    Erst wartet das Programm, dass die Login-Seite komplett geladen ist. Dazu habe ich eine Funktion geschrieben:

    VB.NET-Quellcode

    1. Function waitForReadyState(ByVal WebBrowser As WebBrowser)
    2. Do Until WebBrowser.ReadyState = WebBrowserReadyState.Complete
    3. My.Application.DoEvents()
    4. Loop
    5. Return Nothing
    6. End Function

    Wenn die Seite fertig geladen ist, werden username und passwort eingetragen und Login erfolgt auch Super.

    Und ab hier habe ich dann Probleme. Wenn ich direkt nach dem einloggen auf die Statistic-Seite navigieren möchte, muss ich nochmal warten, bis die Seite nach dem Login fertig geladen ist. Obwohl ich dann meine Funktion aufrufe, wird nicht gewartet, bis die Seite vollständig geladen ist.
    Ich weiß, dass man WebBrowser1_DocumentCompleted verwenden sollte, aber auch damit komme ich nicht weiter, da ich ja direkt nach dem erfolgreichen Login weiter navigieren möchte..

    Wenn das Programm fertig ist, soll es eine Reihe von Login-Daten einlesen und eine Reihe von Webseiten, auf denen ich dann Infos wie "Punkte" oder "Kontostand" bekomme. Dies alles möchte ich mit einem Button-Click erledigt haben.

    Meine Frage nun: Wie schaffe ich es, dass ich zweimal erfolgreich meine Funktion benutzen kann, um Seiten vollständig zu laden?
    (HttpWebRequest ist mir bekannt, aber wollte mein Problem mit dem Webbrowser bewerkstelligen)

    Bin für jeden Ansatz dankbar!
    Klaro, hier bisschen was vom Code:

    VB.NET-Quellcode

    1. Function waitForReadyState(ByVal WebBrowser As WebBrowser)
    2. Do Until WebBrowser.ReadyState = WebBrowserReadyState.Complete
    3. My.Application.DoEvents()
    4. Loop
    5. Return Nothing
    6. End Function
    7. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    8. WebBrowser1.Navigate("www.testseite.de/login.php")
    9. waitForReadyState(WebBrowser1)
    10. WebBrowser1.Document.GetElementById("username").SetAttribute("value", username)
    11. WebBrowser1.Document.GetElementById("password").SetAttribute("value", password)
    12. WebBrowser1.Document.GetElementById("login").InvokeMember("click")
    13. waitForReadyState(WebBrowser1)
    14. WebBrowser1.Navigate("www.testseite.de/member.php")
    15. 'Ab hier klappt es dann nicht mehr...
    16. End Sub

    Kaktus-Stecher schrieb:

    Klaro, hier bisschen was vom Code:

    VB.NET-Quellcode

    1. Function waitForReadyState(ByVal WebBrowser As WebBrowser)
    2. Do Until WebBrowser.ReadyState = WebBrowserReadyState.Complete
    3. My.Application.DoEvents()
    4. Loop
    5. Return Nothing
    6. End Function
    7. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    8. WebBrowser1.Navigate("www.testseite.de/login.php")
    9. waitForReadyState(WebBrowser1)
    10. WebBrowser1.Document.GetElementById("username").SetAttribute("value", username)
    11. WebBrowser1.Document.GetElementById("password").SetAttribute("value", password)
    12. WebBrowser1.Document.GetElementById("login").InvokeMember("click")
    13. waitForReadyState(WebBrowser1)
    14. WebBrowser1.Navigate("www.testseite.de/member.php")
    15. 'Ab hier klappt es dann nicht mehr...
    16. End Sub

    du musst bei der webseiten url das http:// auch angeben!

    lg Gugi
    schau dir mal das navigated bzw. das documentcompleted event das webbrowsers an. dann überprüfst du mit einer if abfrage, auf welcher seite, er sich gerade befindet, und falls es testseite.de/login.php ist, soll er das machen:

    VB.NET-Quellcode

    1. WebBrowser1.Document.GetElementById("username").SetAttribute("value", username)
    2. WebBrowser1.Document.GetElementById("password").SetAttribute("value", password)
    3. WebBrowser1.Document.GetElementById("login").InvokeMember("click")

    usw.

    lg Gugi
    navigated bzw. das documentcompleted event ist mir bekannt. aber das greift ja dann direkt ein, wenn ich z.b die login-seite öffne. Dann macht das ja für mein Programm keinen Sinn, weil das ja nochmal bei der zweiten Seite geprüft werden soll.

    Wie kann ich denn Abfragen, auf welcher Seite sich das Programm befindet?
    Habe Webbrowser1.Contains("LogOut") versucht, weil das ja nur erscheint, wenn man eingeloggt ist...

    Edit:
    Das letzte Problem konnt ich mit folgendem Code lösen:

    VB.NET-Quellcode

    1. If WebBrowser1.DocumentText.Contains("LogOut") Then
    2. End if

    Aber wenn ich das dann ins Documentcompleted event packe, erzeuge ich damit eine Schleife, weil bei jedem weiteren navigieren auf der seite dann einmal "Logout" vorkommt...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Kaktus-Stecher“ ()

    Nach fast einer Stunde rumprobieren, etwas mit deinem Code hinzubekommen, gebe ich es auf...
    Kann mit deiner Information leider nichts anfangen...

    Ich will doch bloß meine Funktion mehrmals benutzer....So dass ich mehrmals warte, bis eine Seit vollständig geladen ist....

    VB.NET-Quellcode

    1. Private Sub WebBrowser1_Navigated(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserNavigatedEventArgs) Handles WebBrowser1.Navigated
    2. Dim url As String = WebBrowser1.Url.AbsoluteUri
    3. If url = "http://www.testseite.de/login.php" Then
    4. WebBrowser1.Document.GetElementById("username").SetAttribute("value", "username")
    5. WebBrowser1.Document.GetElementById("password").SetAttribute("value", "password")
    6. WebBrowser1.Document.GetElementById("login").InvokeMember("click")
    7. ElseIf url = "http://www.testseite.de/wasweisich.php" Then
    8. '..
    9. End If
    10. End Sub


    lg Gugi
    Wieso u.a. deine Funktion nach dem Abschicken des Formulars nicht ausgeführt wurde könnte u.a. daran liegen das bei einem Klick auf dem Submit Button der Browser noch etwas braucht bevor die Seite neu geladen wird, gleich nach dem Login Klick wird jedoch deine Wait Funktion wieder aufgerufen und die Seite ist ja bereits noch geladen, deswegen wird sie gleich Beendet.
    Das Problem hättest du mit DocumentComplete Event nicht.
    Ansonsten müsstest ggf. eine weile warten, bevor du checkest ob die Seite geladen ist.