javascript - Web 浏览器控件 - 依次导航至 URL

标签 javascript c# vb.net forms webbrowser-control

我正在开发一个 VB.Net 类库项目,并且我有一个 Web 浏览器控件(在表单内),我使用它按以下特定顺序多次导航到相同的 URL:

假设 URL 是:https://www.google.com/submitForm

循环开始

  1. 导航至网址
  2. 导航网址的文档完成事件
  3. 执行 DOM 操作并提交表单
  4. 关闭网络浏览器表单

循环结束

代码:

Public Sub customNavigation()
    For j = 0 To listOfUrls.Count - 1
                    testWebBrowserForm = New WebBrowserForm(Me)
                    Dim browserSize As System.Drawing.Size = New Size(100, 100)
                    testWebBrowserForm.Size = browserSize
                    testWebBrowserForm.FormBorderStyle = FormBorderStyle.FixedSingle
                    testWebBrowserForm.Show()
                    testWebBrowserForm.SendToBack()
                    testWebBrowserForm.Location = New Point(100, 100)

                    testWebBrowserForm.Navigate(New Uri("https://google.com/submitForm"))
                Next
End Sub

// Once the document has completely loaded
Public Sub documentLoadComplete()

        Dim submitButton As HtmlElement = Nothing, formEl As HtmlElement = Nothing

        Dim attachmentInputElements As Windows.Forms.HtmlElementCollection = testWebBrowserForm.webBrowser.Document.GetElementsByTagName("input")
        Dim formElements As Windows.Forms.HtmlElementCollection = testWebBrowserForm.webBrowser.Document.Forms
        Dim form As Windows.Forms.HtmlElement = testWebBrowserForm.webBrowser.Document.Forms(0)

        For y = 0 To formElements.Count - 1
            Dim formelement As HtmlElement = formElements(y)
            If formelement.GetAttribute("name").Equals("theForm") Then
                formEl = formelement
            End If
        Next

        For i = 0 To attachmentInputElements.Count - 1
            Dim inputElement As HtmlElement = attachmentInputElements(i)
            If inputElement.GetAttribute("type").Equals("submit") Then
                submitButton = inputElement
            End If
        Next

        testWebBrowserForm.webBrowser.Document.InvokeScript("doSomething")

        submitButton.InvokeMember("click")

        testWebBrowserForm.Close()
End Sub

问题: 每次我尝试运行此循环时,它都会打开多个网络浏览器表单,但仅关闭第一个表单并保持其他表单打开。另外,它确实多次执行导航,但实际上只执行最后一次导航提交。

预期行为: 我希望表单实际上经历上述过程,经历每个已完成的事件,关闭表单,然后再次开始创建表单、导航和关闭表单。

最佳答案

我自己设法解决了这个问题,并认为我应该将答案发布给可能尝试解决类似问题的其他人。

基本上,我所做的是,我没有逐个循环遍历 URL 列表,而是等待 documentcomplete 事件完成,一旦完成,我使用相同的 webbrowserform 并执行另一个导航,直到我的所有 URL 都完成已完全导航,之后我关闭表单。

代码:

Public currentUrlIndex As Integer = Nothing, currentUrl As String = Nothing
    Public Sub customNavigation()

                        testWebBrowserForm = New WebBrowserForm(Me)
                        Dim browserSize As System.Drawing.Size = New Size(100, 100)
                        testWebBrowserForm.Size = browserSize
                        testWebBrowserForm.FormBorderStyle = FormBorderStyle.FixedSingle
                        testWebBrowserForm.Show()
                        testWebBrowserForm.SendToBack()
                        testWebBrowserForm.Location = New Point(100, 100)
                        currentUrlIndex = 0
                        currentUrl = listOfUrls(currentUrlIndex)
                        testWebBrowserForm.Navigate(New Uri(currentUrl))

    End Sub

    // Once the document has completely loaded
    Public Sub documentLoadComplete()

            Dim submitButton As HtmlElement = Nothing, formEl As HtmlElement = Nothing

            Dim attachmentInputElements As Windows.Forms.HtmlElementCollection = testWebBrowserForm.webBrowser.Document.GetElementsByTagName("input")
            Dim formElements As Windows.Forms.HtmlElementCollection = testWebBrowserForm.webBrowser.Document.Forms
            Dim form As Windows.Forms.HtmlElement = testWebBrowserForm.webBrowser.Document.Forms(0)

            For y = 0 To formElements.Count - 1
                Dim formelement As HtmlElement = formElements(y)
                If formelement.GetAttribute("name").Equals("theForm") Then
                    formEl = formelement
                End If
            Next

            For i = 0 To attachmentInputElements.Count - 1
                Dim inputElement As HtmlElement = attachmentInputElements(i)
                If inputElement.GetAttribute("type").Equals("submit") Then
                    submitButton = inputElement
                End If
            Next

            testWebBrowserForm.webBrowser.Document.InvokeScript("doSomething")

            submitButton.InvokeMember("click")

            If currentUrlIndex = listOfUrls.Count - 1 Then
                    testWebBrowserForm.Close()
                    Exit Sub
                Else
                    currentUrlIndex = currentUrlIndex + 1
                    currentUrl = listOfUrls(currentUrlIndex)
                    testWebBrowserForm.Navigate(New Uri(currentUrl))
                End If
    End Sub

关于javascript - Web 浏览器控件 - 依次导航至 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42298504/

相关文章:

c# - 使用c#获取XML节点的内容

C# 闭包堆分配发生在方法开始时

c# - 如何转换大约 300 个字符的字符串,然后在断字后显示 [...] 的延续。?

vb.net - 无法从 .NET 关闭 MS Word

vb.net - 有没有办法比较 Date 对象而忽略时间?

javascript - firebug查找javascript函数源

javascript - 如何仅在旧电子邮件更新时显示 "Email Confirm"输入文本框?

c# - 为什么 C# 不能从这个看似简单、明显的案例中推断出类型

javascript - CSS 3D Transform——打开一张卡片

javascript - 使用 jQuery 时防止通过动画 scrollTop 触发滚动事件