Form Submit mit dem WebBrowser Control

    • VB.NET

    Es gibt 52 Antworten in diesem Thema. Der letzte Beitrag () ist von brennbolle.

      Form Submit mit dem WebBrowser Control

      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

      VB.NET-Quellcode

      1. Public Class WebBrowserForm
      2. Private myBrowser As WebBrowser
      3. Private LastHtmlElement As HtmlElement
      4. Public Sub New(ByVal WebBrowser As WebBrowser)
      5. myBrowser = WebBrowser
      6. End Sub
      7. Public Sub InnerText(ByVal TextboxName As String, ByVal Value As String)
      8. myBrowser.Document.GetElementById(TextboxName).InnerText = Value
      9. LastHtmlElement = myBrowser.Document.GetElementById(TextboxName)
      10. End Sub
      11. Public Sub Checkbox(ByVal CheckboxName As String, ByVal Checked As Boolean)
      12. Dim sCheckState As String = ""
      13. If Checked Then sCheckState = "checked"
      14. myBrowser.Document.GetElementById(CheckboxName).SetAttribute("checked", sCheckState)
      15. LastHtmlElement = myBrowser.Document.GetElementById(CheckboxName)
      16. End Sub
      17. Public Sub Radiobox(ByVal RadioboxName As String, ByVal Value As String, Optional ByVal Checked As Boolean = True)
      18. Dim sCheckState As String = ""
      19. If Checked Then sCheckState = "checked"
      20. For Each oElement As HtmlElement In myBrowser.Document.GetElementsByTagName("INPUT")
      21. If oElement.Name = RadioboxName And oElement.GetAttribute("value") = Value Then
      22. oElement.SetAttribute("checked", sCheckState)
      23. LastHtmlElement = oElement
      24. Exit For
      25. End If
      26. Next
      27. End Sub
      28. Public Sub SelectListItem(ByVal ListboxName As String, ByVal Index As Integer)
      29. myBrowser.Document.GetElementById(ListboxName).Children(Index).SetAttribute("selected", "selected")
      30. LastHtmlElement = myBrowser.Document.GetElementById(ListboxName)
      31. End Sub
      32. Public Sub Submit()
      33. Dim FormElement As HtmlElement = GetForm(LastHtmlElement)
      34. FormElement.InvokeMember("submit")
      35. End Sub
      36. Private Function GetForm(ByVal CurrentHtmlElement As HtmlElement) As HtmlElement
      37. Try
      38. If CurrentHtmlElement.TagName.ToLower() = "form" Then
      39. Return CurrentHtmlElement
      40. Else
      41. Return GetForm(CurrentHtmlElement.Parent)
      42. End If
      43. Catch ex As Exception
      44. Return Nothing
      45. End Try
      46. End Function
      47. 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

      1. Public Class Form1
      2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      3. WebBrowser1.Navigate("http://web.de")
      4. While Not WebBrowser1.ReadyState = WebBrowserReadyState.Complete
      5. Application.DoEvents()
      6. End While
      7. Dim myForm As New WebBrowserForm(WebBrowser1)
      8. myForm.InnerText("inpLoginUsername", "e-mail adresse")
      9. myForm.InnerText("inpLoginPasswd", "passwort")
      10. myForm.Submit()
      11. End Sub
      12. 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:
      Bilder
      • web1.png

        26,66 kB, 493×335, 1.432 mal angesehen
      • web2.png

        17,04 kB, 797×452, 1.474 mal angesehen

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Dodo“ ()

      Gibt es auch eine Möglichkeit, mit diesem Code den Text von einer SelectBox zu ändern?
      Wenn ja, wie?

      PHP-Quellcode

      1. <select name="handy" onchange="deletetelbook();">
      2. <option value="0664">0664 (a1)</option>
      3. <option value="0676">0676 (t-mobile)</option>
      4. <option value="0699">0699 (one)</option>
      5. <option value="0650">0650 (tele.ring)</option>
      6. <option value="0660">0660 (drei)</option>
      7. <option value="0681">0681 (eety)</option>
      8. <option value="0688">0688 (tele2)</option>
      9. <option value="0680">0680 (bob)</option>
      10. <option value="0780">0780 (yesss!)</option>
      11. </select>


      Wie kann ich jetzt in dieser SelectBox den Eintrag 0680 (bob) auswählen lassen?

      ~ Edit ~
      Sonst finde ich den Code klasse!
      Hab schon nach so etwas gesucht ;)
      ~ ~

      Grüße,
      Patschi

      ~ Edit² ~
      Hat sich erledigt!

      VB.NET-Quellcode

      1. myForm.SelectListItem("telbuch", "1")

      Statt 1 dann einfach die Nummer vom Eintrag.
      ~ ~
      Meine neue Homepage: pkern.at
      Wetter bei mir zu Haus:

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Patschi“ ()

      Danke für den Code ist echt zum gebrauchen
      Kannst du mir bitte helfen und sagen warum ich es nicht mit yahoo schaffe .Ich bin im glauben das es was mit dem Login Button Zutun hat


      "<p class="yreglgsb"><input type="submit" id=".save" name=".save" value="Anmelden"></p>"


      da Bast es ja mit der id oder




      <th id='thun'><label for="username">Yahoo!-ID:</label></th></tr>

      <td><input name="login" id="username" value="" size="17" class="yreg_ipt" type="text" maxlength="96">


      <td><input name="passwd" id="passwd" value="" size="17" class="yreg_ipt" type="password" maxlength="64"></td>


      Vielen Dank hoffe du findest mal zeit für mein Problem
      Bitte formatieren!
      :cursing:

      Edit:
      Ich hab auch noch ein Problem:
      ich rufe so:

      VB.NET-Quellcode

      1. Dim myForm As New WebBrowserForm(WebBrowser1)
      2. myForm.Radiobox("direction", "sw")
      3. myForm.Submit()

      den Radiobutton aus folgender Seite auf:
      Spoiler anzeigen

      PHP-Quellcode

      1. <?xml version="1.0" encoding="UTF-8"?>
      2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      3. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      4. <html xmlns="http://www.w3.org/1999/xhtml">
      5. <head>
      6. <title>Neues Dorf erbauen</title>
      7. <link rel="stylesheet" type="text/css" href="/css/stamm.css?1255509606" />
      8. <script src="/js/script.js?1257345606" type="text/javascript"></script>
      9. <script src="/js/mootools.js?1251209464" type="text/javascript"></script>
      10. <script type="text/javascript">
      11. window.addEvent('domready', function(){
      12. if (self!= top){
      13. $$('.text a').each(function(link){
      14. link.set('target', '_parent');
      15. });
      16. }
      17. });
      18. </script>
      19. </head>
      20. <body id="ds_body" >
      21. <table class="navi-border" width="800" style="margin:auto; margin-top: 25px; border-collapse: collapse;">
      22. <tr>
      23. <td>
      24. <table class="main" width="800" align="center">
      25. <tr>
      26. <td>
      27. <h3>Neues Dorf erbauen</h3>
      28. <h4>In welcher Himmelsrichtung soll dein neues Dorf erbaut werden?</h4>
      29. <table class="vis">
      30. <tr>
      31. <td width="200">
      32. <form action="create_village.php?action=create" method="post">
      33. <label><input type="radio" name="direction" value="random" checked="checked" />Zufällig</label><br />
      34. <label><input type="radio" name="direction" value="nw" />Nordwest</label><br />
      35. <label><input type="radio" name="direction" value="no" />Nordost</label><br />
      36. <label><input type="radio" name="direction" value="sw" />Südwest</label><br />
      37. <label><input type="radio" name="direction" value="so" />Südost</label><br />
      38. <br />
      39. <input type="submit" value="Bestätigen" />
      40. </form>
      41. </td>
      42. <td>
      43. <img src="graphic/richtung/richtung.png?1" alt="" />
      44. </td>
      45. </tr>
      46. </table>
      47. </td></tr></table>
      48. </td></tr></table>
      49. <script type="text/javascript">setImageTitles();</script>
      50. <script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
      51. </script>
      52. <script type="text/javascript">
      53. _uacct = "UA-1897727-2";
      54. urchinTracker();
      55. </script>
      56. <script>
      57. //<![CDATA[
      58. document.write(unescape("%3Cscript src='" + (document.location.protocol == "https:" ? "https://sb" : "http://b") + ".scorecardresearch.com/beacon.js' %3E%3C/script%3E"));
      59. //]]>
      60. </script>
      61. <script>
      62. //<![CDATA[
      63. COMSCORE.beacon({
      64. c1:2,
      65. c2:6273219,
      66. c3:"",
      67. c4:"",
      68. c5:"",
      69. c6:"",
      70. c15:""
      71. });
      72. //]]>
      73. </script>
      74. <noscript>
      75. <img src="http://b.scorecardresearch.com/b?c1=2&c2=6273219&c3=&c4=&c5=&c6=&c15=&cv=1.3&cj=1" style="display:none" width="0" height="0" alt="" />
      76. </noscript>
      77. </body>
      78. </html>

      aber beim Debuggen kommt der fehler:
      "Der objektverweis wurde nicht auf eine Objektdistanz festgelegt"

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „timi257“ ()

      @trixxer: ich sehe kein VB Code von dir, wie du es versucht hast. Den Submit Button braucht man bei meiner Methode eben NICHT mehr.

      @timi257: Rufst du diese Seite auch direkt auf? Also es ist keine Frameweiterleitung?
      Wo kommt der Fehler denn genau bei welcher Zeile??
      Oh, ich hab mich vertan:
      jetzt funktioniert es, den Radio-Button zu setzen, aber beim Submit kommt ein Fehler:
      Der fehler, den ich beschrieben habe kommt also in der Zeile

      VB.NET-Quellcode

      1. FormElement.InvokeMember("submit")


      Weißt du, warum? :huh:
      Hast du den neuen Code genommen wo in der Funktion "RadioBox()" das LastElement gesetzt wird?

      VB.NET-Quellcode

      1. Public Sub Radiobox(ByVal RadioboxName As String, ByVal Value As String, Optional ByVal Checked As Boolean = True)
      2. Dim sCheckState As String = ""
      3. If Checked Then sCheckState = "checked"
      4. For Each oElement As HtmlElement In myBrowser.Document.GetElementsByTagName("INPUT")
      5. If oElement.Name = RadioboxName And oElement.GetAttribute("value") = Value Then
      6. oElement.SetAttribute("checked", sCheckState)
      7. LastHtmlElement = oElement
      8. Exit For
      9. End If
      10. Next
      11. End Sub


      Hier Zeile 7, das ist ganz wichtig, weil ein HtmlElement in der Form min einmal angesprochen werden muss, damit die Übergeordnete Form gefunden werden kann und der Submit ausgeführt wird.
      Solange du die Variable wo die die Klasse zuordnest Global machst sollte das kein Problem sein, was nicht sein darf ist natürlich in Button 1 die Klasse instanzieren und in Button 2 nochmal neu, das ist ja dann klar das es dann 2 unterschiedliche Instanzen sind und sie keinerlei Zugriff zu einander haben.
      Kannst du mir bitte helfen ich möchte gerne für das Passwort und Namen eine Textbox nehmen weiß aber nicht wie das mit dem geht


      mit dem hat er ein Problem

      Quellcode

      1. Public Sub InnerText(ByVal TextboxName As String, ByVal Value As String)
      2. myBrowser.Document.GetElementById(TextboxName).InnerText = Value
      3. LastHtmlElement = myBrowser.Document.GetElementById(TextboxName)
      4. End Sub
      geht

      habe es versucht mit

      Quellcode

      1. myForm.InnerText(TextBox1.Text, "inpLoginUsername")
      2. myForm.InnerText1(TextBox1.Text, "inpLoginPasswd")



      geht aber leider nicht
      vielen Dank
      Momentan Steuerst du auf der Seite ein HTML-element namens "Textbox1.Text" an.
      Du hast es genau vertauscht, also musst du

      VB.NET-Quellcode

      1. myForm.InnerText("inpLoginUsername", TextBox1.Text)
      2. myForm.InnerText1("inpLoginPasswd", Textbox1.Text)



      Und mir ist noch aufgefallen, dass du sowohl den Usernamen als auch das Passwort aus Textbox1 holst
      ->Der Username und das Passwort sind gleich?!?!
      mein Standardbrowser ist der Firefox, doch dort wo ich mich einloggen möchte, erscheint immer: Bitte Firefox benutzen(bei dieser Seite kann man sich nur mit Firefox einloggen). Aber wenn mein Standardbrowser Firefox ist, wieso zeigt VB diese Meldung an?
      naja, ich habe jetzt geckofx genommen, trotzdem werde ich immernoch gebeten, Firefox zu benutzen. Da muss ja ein ganz hartnäckiges Script dahinterstecken. Muss ich noch etwas bei der Geckofx-Engine umstellen, damit es als Firefox getarnt wird?