2017-02-17 22 views
0

Я работаю над проектом библиотеки классов VB.Net, и у меня есть элемент управления веб-браузером (в пределах формы), который я использую, чтобы несколько раз переходить к одному URL-адресу в это определенная последовательность:Управление веб-браузером - перейдите по ссылке один за другим

Давайте предположим, что URL-адрес является: https://www.google.com/submitForm

Loop Start

  1. Перейдите к URL
  2. Document Complete Event из с навигацией URL
  3. Выполнять манипуляции DOM и отправить форму
  4. Закрыть веб-браузер формы

Loop End

Код:

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 

Выпуск: Каждый раз, когда я пытаюсь запустить этот цикл, он открывает несколько форм веб-браузера, но закрывает только первый и сохраняет остальные. Кроме того, он выполняет навигацию несколько раз, но на самом деле выполняет последнюю навигацию.

Ожидаемое поведение: Я хотел бы, чтобы форма на самом деле пройти через процесс, упомянутый выше, пройти через каждое завершенное событие, закройте форму, а затем приступить к созданию формы, навигации и закрыть форму еще раз.

+1

Вы должны показать нам соответствующий код формы, а также. Вы дали нам слишком мало, чтобы воспроизвести это. –

+0

Привет @VisualVincent: Я добавил соответствующий код для формы. Пожалуйста, дайте мне знать, есть ли способ достичь этого? – Neophile

+0

Предполагая, что submit invoke является последним, что должна делать форма .... следуйте за ней со мной.close –

ответ

2

Мне удалось решить эту проблему самостоятельно и подумал, что отправлю ответ кому-то еще, кто может попытаться решить подобную проблему.

В общем, то, что я сделал, вместо того, чтобы перебирать список URL-адресов один за другим, я ждал завершения документа, чтобы закончить, и как только это произойдет, я использую ту же самую 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