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
ein paar Minuten zu lernen (https://stackoverflow.com/help/how-to -ask) – djv
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) –
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