2017-02-17 81 views
0

我正在研究一个VB.Net类库项目,并且我有一个Web浏览器控件(在一个表单中)用于多次导航到相同的URL这个特殊的序列:Web浏览器控件 - 一个接一个地导航到URL

假设的网址是:https://www.google.com/submitForm

环路启动

  1. 浏览URL,
  2. 文档完备事件导航的URL的
  3. 执行DOM操作,并提交形式
  4. 关闭Web浏览器形式

循环结束

代码:

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 

问题: 每次我尝试运行此循环时,它都会打开多个Web浏览器窗体,但只会关闭第一个窗体并将其他窗体打开。另外,它确实执行了多次导航,但实际上只进行了最后一次导航提交。

预期的行为: 我想为形式实际上经过上述过程中,通过每完成的事件,关闭窗体,然后再次启动形式,导航和关闭形式的创作。

+1

你必须向我们展示的形式相关的代码。你给我们太少,无法重现这一点。 –

+0

Hi @VisualVincent:我也为表单添加了相关的代码。请让我知道是否有办法实现这一目标? – Neophile

+0

假设提交调用是表单最后要做的事情....按照me.close –

回答

2

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

基本上,我所做的是,而不是循环浏览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