【问题标题】:How to fill a WebForm and click the submit Button with a WebBrowser control?如何使用 WebBrowser 控件填写 WebForm 并单击提交按钮?
【发布时间】:2021-02-15 16:57:13
【问题描述】:

如何使用 WebBrowser 控件单击此 SUBMIT 按钮?

我试过了:

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

但它不返回任何东西。

【问题讨论】:

  • 另一方面,这种类型的事情你最好将点击事件中的逻辑拆分成它自己的方法。您可以直接从您的代码后面调用该方法,或者单击事件处理程序,而无需担心 UI 实现

标签: vb.net winforms webbrowser-control form-submit


【解决方案1】:

这是使用 WebBrowser 控件执行 WebForm LogIn 的示例过程。

注意:我建议事先激活 WebBrowser Emulation Advanced Features,以备不时之需。阅读a description here(参见WebBrowserAdvancedFetures 类):
FEATURE_GPU_RENDERING Key 可能不存在,所以可能需要先创建)

  • 在导航到地址之前订阅WebBrowser.DocumentCompleted 事件
  • 引发事件时,检查WebBrowser.ReadyState 是否为WebBrowserReadyState.Complete:如果不是则返回(我们不想处理部分文档)。
  • 当前文档完成后,找到具有特定 ID 或类名的表单:这就是我们要填写的登录表单。
  • 找到 Form 后,解析其 Document 并选择需要值的 INPUT 元素。
  • 如果找到所有元素并设置它们的值,则找到SUBMIT 按钮并调用其InvokeMember() 方法,指定click 处理程序以完成该过程并激活Form POST 方法。李>
  • 当Button被点击时,WebBrowser被重定向到一个登陆页面,所以我们移除DocumentCompleted事件的Handler:到这里就完成了,不再需要处理这个事件了。

▶ 在表单的设计器中设置 [WebBrowser].ScriptErrorsSuppressed = True

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

【讨论】:

  • 耸人听闻。这可能是人们可以在网上找到的最严重的通过 WebBrowser 登录。
猜你喜欢
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 2020-05-12
相关资源
最近更新 更多