问题
How can I click this SUBMIT
button using a WebBrowser control?
I've tried with:
For Each divSect As HtmlElement In WebBrowser1.Document.GetElementsByTagName("button")
If divSect.OuterHtml.Contains("Accedi") Then
For Each elem As HtmlElement In divSect.Children
If elem.GetAttribute("type") = "button" Then
elem.InvokeMember("click")
End If
Next
End If
Next
but it doesn't return anything.
回答1:
Here's a sample procedure to perform a WebForm LogIn using a WebBrowser control.
► Note: I suggest to activate the WebBrowser Emulation Advanced Features beforehand, in case its need. Read a description here (see the WebBrowserAdvancedFetures
class):
(The FEATURE_GPU_RENDERING
Key may not exist, so it may be necessary to create it first)
- Subscribe to the WebBrowser.DocumentCompleted event before navigating to an Address
- As describe in How to get an HtmlElement value inside Frames/IFrames?, the Document may be actually composed of more than one Frame/IFrame (the latter, quite common). If that's the case, you need to handle the
DocumentCompleted
more than once, since each Frame/IFrame has its own Document
- As describe in How to get an HtmlElement value inside Frames/IFrames?, the Document may be actually composed of more than one Frame/IFrame (the latter, quite common). If that's the case, you need to handle the
- When the event is raised, check whether the WebBrowser.ReadyState is WebBrowserReadyState.Complete: return if its not (we don't want to handle partial documents).
- When the current Document is complete find a Form with a specific ID or class name: that's the Login Form we want to fill in.
- When the Form is found, parse its Document and to select the
INPUT
elements that require a value. - If all elements are found and their values has been set, find the
SUBMIT
Button and call its InvokeMember() method, specifying theclick
handler to complete the procedure and activate the FormPOST
method. - When the Button is clicked, the WebBrowser is redirected to a landing page, so we remove the Handler of the
DocumentCompleted
event: we're done here, handling this event is no longer need.
► Set [WebBrowser].ScriptErrorsSuppressed = True
in the Form's Designer.
Private Sub btnNavigate_Click(sender As Object, e As EventArgs) Handles btnNavigate.Click
AddHandler webBrowser1.DocumentCompleted, AddressOf Browser_DocumentCompleted
webBrowser1.Navigate("https://SomeAddress.com")
End Sub
Private Sub Browser_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs)
Dim browser = DirectCast(sender, WebBrowser)
If browser.ReadyState <> WebBrowserReadyState.Complete Then Return
' Select a Form with a specific className
Dim form = browser.Document.Forms.OfType(Of HtmlElement).FirstOrDefault(Function(frm) frm.GetAttribute("className").StartsWith("form-login"))
' Not found at this point, try later
If form Is Nothing Then Return
' Select the element by ID or by className or whatever
Dim userId = form.Document.GetElementById("[The UserId Input's ID]")
' Same for other input elements
Dim userPwd = form.Document.GetElementById("[The Password Input's ID]")
If userId Is Nothing OrElse userPwd Is Nothing Then Return
' Set the value of both Input elements. Note that a validation procedure
' may require that you set both the Value and the InnerText
userId.SetAttribute("value", "[The User LogIn ID]")
'userId.InnerText = "[The User LogIn ID]"
userPwd.SetAttribute("value", "[The User LogIn Password]")
'userPwd.InnerText = "[The User LogIn Password]"
' Filter (fail-safe) the SUBMIT button by className, since - here - it has no ID
Dim submit = browser.Document.GetElementsByTagName("button").OfType(Of HtmlElement).
FirstOrDefault(Function(elm) elm.GetAttribute("type").
Equals("submit") AndAlso elm.GetAttribute("className").Contains("bt-label"))
' The SUBMIT Button was found: click it. Also remove the handler: we're done here
' The WebBrowser is redirected to a landing page, this event is no longer needed
If submit IsNot Nothing Then
RemoveHandler browser.DocumentCompleted, AddressOf Browser_DocumentCompleted
submit.InvokeMember("click")
End If
End Sub
来源:https://stackoverflow.com/questions/64655652/how-to-fill-a-webform-and-click-the-submit-button-with-a-webbrowser-control