mehrere HTML Seiten aufrufen

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von haiflosse.

    mehrere HTML Seiten aufrufen

    Ich rufe eine Webseite auf und per Klick auf einen Button rufe ich weitere Seiten auf.

    Bei jedem Aufruf möchte ich die Seite den aktuellen Quelltext prüfen.

    Mein Versuch sieht wie folgt aus:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. schritt = 1
    3. WebBrowser1.Navigate "http://www.seite.org"
    4. Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
    5. Application.DoEvents()
    6. Loop
    7. ausfuellen()
    8. End Sub
    9. Private Sub ausfuellen()
    10. WebBrowser1.Document.All(eingabe).SetAttribute("value", "begriff")
    11. WebBrowser1.Document.All("Button").InvokeMember("Click")
    12. Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
    13. Application.DoEvents()
    14. Loop
    15. End Sub
    16. Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    17. On Error GoTo ErrHandler
    18. If schritt = 1 Then
    19. ' Webseite wurde vollständig geladen
    20. inhalt = WebBrowser1.Document.Body.InnerHtml
    21. schritt = 2
    22. ElseIf schritt = 2 Then
    23. WebBrowser1.Document.All("Button2").InvokeMember("Click")
    24. Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
    25. Application.DoEvents()
    26. Loop
    27. inhalt = WebBrowser1.Document.Body.InnerHtml
    28. End If
    29. On Error GoTo 0
    30. Exit Sub
    31. ErrHandler:
    32. MsgBox(Err.Description)
    33. End Sub


    Der Code funktioniert soweit, nur habe ich bemerkt, dass die Routine

    VB.NET-Quellcode

    1. Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
    2. Application.DoEvents()
    3. Loop

    nach dem ersten Durchlauf nicht mehr ausgeführt wird, da anscheinend die Seite immer schon geladen ist.
    Wie kann ich das Laden zurücksetzen sobald ich auf einem Button geklickt habe.
    Bin auch für jeden Verbesserungsvorschlag der gesamten Struktur dankbar, da ich mit vb.net noch sehr wenig Erfahrung habe.
    Danke für jede Antwort
    @haiflosse Auch wenn ioch Dein Vorgehen nicht ganz verstehe, sollte eine richtige Struktur vielleicht so aussehen:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. schritt = 1
    3. WebBrowser1.Navigate("http://www.seite.org")
    4. End Sub
    5. Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    6. If schritt = 1 Then
    7. ' Webseite wurde vollständig geladen
    8. ausfuellen()
    9. inhalt = WebBrowser1.Document.Body.InnerHtml
    10. WebBrowser1.Document.All("Button2").InvokeMember("Click")
    11. schritt = 2
    12. ElseIf schritt = 2 Then
    13. inhalt = WebBrowser1.Document.Body.InnerHtml
    14. End If
    15. End Sub
    16. Private Sub ausfuellen()
    17. WebBrowser1.Document.All(eingabe).SetAttribute("value", "begriff")
    18. WebBrowser1.Document.All("Button").InvokeMember("Click")
    19. End Sub
    Pack das Navigate ggf. in die Form_Shown, jedenfalls nicht in die Form_Load.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für die Antwort.
    Nur leider funktioniert die nicht.
    Wenn ich ausfuellen() in webBrowser1_DocumentCompleted kopiere wird der ersten Button Click nicht ausgeführt.

    Auch musste ich nach dem Öffnen des ersten Links wieder

    VB.NET-Quellcode

    1. Do Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
    2. Application.DoEvents()
    3. Loop


    einfügen, sonst ändert sich überhaupt keine Seite.

    Das ganze soll auch automatisch ablaufen und nicht mit einem Buttonclick gestartet werden.
    Die Änderung auf Form_Shown konnte ich nichts feststellen.

    Ich denke ich muss bei jedem Click es irgendwie schaffen, dass der ReadyState wieder zurückgesetzt wird, da dieser nach dem ersten Durchlauf auf Complete gestellt ist und somit der restliche Code automatisch durchgeführt wird.

    Hoffe ich erkläre dies verständlich und es kann mir jemand weiterhelfen.
    Danke

    haiflosse schrieb:

    wird der ersten Button Click nicht ausgeführt.
    Klar. Dazu musst Du auf den entsprechenden Button drücken.
    Lass das mit den DoEvents() sein und verstehe zunächst den korrekten Ablauf.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    haiflosse schrieb:

    Wie kann ich dies aber dann automatisieren
    Beschreib mal ohne Code-Elemente zu benennen, den Ablauf, wie er sein soll.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für die Antwort.
    Der Ablauf sieht wie folgt aus.
    Eine bestimmte Anmelde Webseite wird geöffnet und es soll automatisch der Benutzername, Kennwort ausgefüllt werden und auf den Button Anmelden geklickt werden.
    Sobald man sich angemeldet hat wird ein weiterer Button automatisch angeklickt um auf eine andere Seite zu kommen.
    Diese Seite soll dann der Sourcecode in eine Variable gespeichert werden.

    Danke für eine weitere Unterstützung.
    @haiflosse Mein Code oben sollte, wenn alles richtig implementiert ist, dies machen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke nochmals für die Antwort.
    Ich habe deinen Code nochmals in ein neues Formular kopiert und nochmals gebugged.
    Er beginnt bei Button1_Click, geht dann weiter zu WebBrowser1_DocumentCompleted ruft dann ausfuellen() auf und geht dann weiter bei WebBrowser1_DocumentCompleted unter ausfuellen(). Beim Aufruf von WebBrowser1.Document.All("Button2").InvokeMember("Click") ist dann schluß, da es diesen Button noch nicht gibt.
    Es erscheint noch keine Webseite mit den ausgefüllten Werte und es wird auch noch nichts ausgeführt.

    haiflosse schrieb:

    da es diesen Button noch nicht gibt
    Dafür kann ich nichts.
    Der Rest scheint jedoch zu laufen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    haiflosse schrieb:

    da es diesen Button noch nicht gibt
    Dafür kann ich nichts.


    Wenn die einzelnen Teile zur richtigen Zeit aufgerufen werden wird es sicher funktionieren, aber wie kann ich dies durchführen, dass der Button genau zur richtigen Zeit gesucht wird, genau das ist mein Problem. Der Code führt alles auf einmal durch. Er müsste aber nach Click auf einen Button warten bis die nächste Seite aufgerufen wird um dann wieder den nächsten Button klicken zu können. Wie kann man dies durchführen, oder funktioniert dies nicht automatisch.

    Danke nochmals

    haiflosse schrieb:

    warten
    Wenn das im Debug im Einzelschritt funktioniert, kannst Du natürlich da ein sleep reinbauen, um der Seite Zeit für Aktualisierungen zu geben, sofern da kein DocumentCompleted kommt.
    Da könntest Du ja mit schritt = n weiterkommen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für die Antwort.
    Ich habe jetzt im Formular ein Webbrowser Element und 3 Buttons.
    Im ersten Button öffne ich die Seite
    im zweiten Button führe ich den Anmeldebutton aus
    im dritten Button führe ich dann den Click nach dem anmelden durch.
    Dies funktioniert einwandfrei.

    Ich habe dann versucht zu automatisieren und habe versucht den Code
    Threading.Thread.CurrentThread.Sleep(5000)
    im Code einzufügen.
    Ich habe schon einige Stellen ausprobiert, leider fehlt mir noch die Idee wo ich dies durchführen muss.
    Vielleicht kannst du mir noch ein Beispiel geben.
    Danke nochmals

    haiflosse schrieb:

    wo ich dies durchführen muss
    da, wo der Browser eine länger dauernde Aktion durchführt und Du nicht mit DocumentCompleted benachrichtigt wirst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe nun nach
    WebBrowser1.Navigate("http://www.seite.org")
    und
    WebBrowser1.Document.All("Button").InvokeMember("Click")

    ein
    Threading.Thread.CurrentThread.Sleep(5000)

    eingefügt.

    Leider wird aber nur auf der ersten Anmeldeseite die Daten eingefügt und dann passiert nichts mehr und es wird auch kein Klick ausgeführt.

    Vielleicht kannst du mir noch einen Tipp wo ich dies im Code einfügen sollte.
    Danke