2017-12-06 1 views
0

Ich bin ziemlich sehr Amateur in vb.net. Wenn ich einen Text in die Textbox eintippe, sollte es in der Lage sein, automatisch in die Webbrowser-Steuerung einzugeben und auch, wie man auf die Schaltfläche klickt, bei der keine geteilelementsbyid.Wie automatisch in das WebBrowser-Steuerelement eingeben

Auch ich schaffe es, den ersten Teil richtig zu bekommen, aber wenn ich auf die Schaltfläche "Anmelden" im Browser klicke, scheint ein kleinerer Fehler zu sein. Ich habe ein Projekt wie dieses vor nicht allzu langer Zeit gemacht und kann den Quellcode davon nicht mehr finden, also fange ich wieder von vorne an.

Website: https://app.coins.ph/welcome/login

Heres mein Code so weit:

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged 
    WebBrowser1.Document.GetElementById("username").InnerText = TextBox1.Text 
End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    For Each Element As HtmlElement In WebBrowser1.Document.GetElementsByTagName("class") 'Depending on how the source code is formatted on the tag, you may also try Element.OuterHTML, Element.InnerText and Element.OuterText in the line below 
     If Element.OuterText.Contains("SIGN IN") Then 
      Element.InvokeMember("click") 
      Exit For 
     End If 
    Next Element 
End Sub 

Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged 
    WebBrowser1.Document.GetElementById("password").InnerText = TextBox2.Text 
End Sub 
+3

ein paar Minuten zu lernen (https://stackoverflow.com/help/how-to -ask) – djv

+0

Bitte beachten Sie auch: [Unter welchen Umständen kann ich "dringende" oder ähnliche Formulierungen zu meiner Frage hinzufügen, um schnellere Antworten zu erhalten?] (https://meta.stackoverflow.com/q/326569) –

+1

Wenn Sie Fragen stellen, nehmen Sie sich bitte ein paar Sekunden Zeit, um einen nützlichen Titel hinzuzufügen. Solche Fragen können sich auf alle 15M-Fragen auf der Website beziehen, und (a) Ihre Frage ist nicht wichtiger als andere, (b) Ihre Frage ist das Erstellen von Editierarbeiten für Freiwillige, (c) Sie fragen im Wesentlichen danach wird Ihre Chancen, gute Antworten zu bekommen, schädigen, (d) alles oben genannte ist wirklich offensichtlich. – halfer

Antwort

2

Sie ein paar Probleme hier haben. Beginnen wir mit den Textboxeingaben. Wenn Sie sich die HTML-Quelle für die Anmeldeseite dieser Website ansehen, haben die Eingaben für Benutzername und Kennwort keine ID-Eigenschaft, sie verwenden nur Name. Darüber hinaus sucht GetElementsByTagName nach einem HTML-Element mit "Benutzername", nicht nach einer "Eingabe", wie es sollte. Bei diesen beiden Problemen sollten Sie Document.All("[elementName]") verwenden, um auf diese Eingänge zuzugreifen. Was den Anmeldebereich anbelangt, sucht GetElementsByTagName, wie bereits erwähnt, nach HTML-Elementen. Wenn Sie also nach dem Wert "class" suchen, wird nichts zurückgegeben, was Sie möchten. Stattdessen sollten Sie nach einem "Button" suchen, bei dem der OuterText "SIGN IN" enthält. Mit all diesen Änderungen angewandt, wird der Code:

Public Class Form1 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     WebBrowser1.Navigate("https://app.coins.ph/welcome/login") 
    End Sub 

    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged 
     WebBrowser1.Document.All("username").InnerText = TextBox1.Text 
    End Sub 

    Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged 
     WebBrowser1.Document.All("password").InnerText = TextBox2.Text 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     For Each Element As HtmlElement In WebBrowser1.Document.GetElementsByTagName("button") 
      If Element.OuterText.Contains("SIGN IN") Then 
       Element.InvokeMember("click") 
       Exit For 
      End If 
     Next Element 
    End Sub 

End Class 

Es gibt ein anderes Problem ist, wenn Sie diesen Code ausführen, obwohl

Wenn Sie das obige Beispiel ausführen, werden Sie feststellen, dass die Formularfelder sind korrekt ausgefüllt und der Anmelde-Button wurde erfolgreich angeklickt, jedoch erscheint ein Fehler, der darauf hinweist, dass die Formularfelder noch leer sind. Selbst wenn Sie WebBrowser1.Document.All("username").SetAttribute("value", TextBox1.Text) verwenden, um den Wert des Eingangs ebenfalls festzulegen, tritt derselbe Fehler auf. Dies ist wahrscheinlich, weil die Entwickler der Website eine Art von Javascript verwenden, das aus dem einen oder anderen Grund die Tasten drückt. Es ist unmöglich zu wissen warum, aber so ist es. Sie müssen also selbst Tasten drücken. Wenn Sie das tun, wird sich die Website erfolgreich mit dem Benutzernamen und dem Passwort anmelden. Sie haben zwei Möglichkeiten, dies zu tun. Der Reiniger Weg ist, einfach auf einmal alle Schlüssel senden und melden Sie sich an, wie so:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    WebBrowser1.Focus() 
    WebBrowser1.Document.All("username").Focus() 
    For Each c As Char In TextBox1.Text.ToCharArray 
     SendKeys.SendWait(c) 
    Next 
    WebBrowser1.Document.All("password").Focus() 
    For Each c As Char In TextBox2.Text.ToCharArray 
     SendKeys.SendWait(c) 
    Next 
    For Each Element As HtmlElement In WebBrowser1.Document.GetElementsByTagName("button") 
     If Element.OuterText.Contains("SIGN IN") Then 
      Element.InvokeMember("click") 
      Exit For 
     End If 
    Next Element 
End Sub 

Wenn Sie jedoch nach wie vor jedes Zeichen angezeigt werden soll, wie Sie schreiben, können Sie die Funktionalität der Textchanged Ereignislogik zu spiegeln sind verwenden Sie derzeit würde das KeyPress-Ereignis verwenden und im Grunde die Tastenanschläge wie folgt weiter: [., wie fragen]

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    For Each Element As HtmlElement In WebBrowser1.Document.GetElementsByTagName("button") 
     If Element.OuterText.Contains("SIGN IN") Then 
      Element.InvokeMember("click") 
      Exit For 
     End If 
    Next Element 
End Sub 

Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress 
    WebBrowser1.Focus() 
    WebBrowser1.Document.All("username").Focus() 
    SendKeys.SendWait(e.KeyChar) 
    TextBox1.Focus() 
End Sub 

Private Sub TextBox2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox2.KeyPress 
    WebBrowser1.Focus() 
    WebBrowser1.Document.All("password").Focus() 
    SendKeys.SendWait(e.KeyChar) 
    TextBox2.Focus() 
End Sub 
+0

Wow, das scheint mein Problem zu lösen, dass ich schon eine ganze Weile bei Versuch und Irrtum feststecke.Vielen Dank, das hilft wirklich große Zeit. –

+0

Ich bin über ein anderes Problem gestolpert. Kann ich dich da vielleicht direkt per facebook direkt kontaktieren? Wirklich brauchen Sie Ihre Hilfe dieses Mal wieder und in der Zukunft für einige Referenzen, danke –

+0

Stellen Sie einfach Ihre Fragen auf dieser Website, es gibt eine Menge von Entwicklern, die viel besser sind als ich auf StackOverflow – soohoonigan

Verwandte Themen