есть ли лучший способ сделать это

#vb.net #browser #loops #webforms #setattribute

#vb.net #браузер #циклы #веб-формы #setattribute

Вопрос:

итак, у меня есть цикл в vb.net который загружает веб-страницу, заполняет форму и нажимает отправить

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

    Do While Not browser.ReadyState = WebBrowserReadyState.Complete

            System.Windows.Forms.Application.DoEvents()
        Loop
  

и

         browser.Document.GetElementById("text").SetAttribute("value", message)
  

и

   For Each element As HtmlElement In browser.Document.GetElementsByTagName("input")


        If element.GetAttribute("type") = "submit" Then

            element.InvokeMember("click")

        End If
    Next
  

но моя проблема в том, что примерно после пятого запуска цикла он прерывается в строке с атрибутом set. И у меня такое ощущение, что он не ожидает загрузки веб-страницы, прежде чем попытается заполнить форму, и именно поэтому он выдает ошибку.

Кто-нибудь знает лучший способ сделать это?

Комментарии:

1. Исключение System.NullReferenceException не было обработано

2. Вы не можете использовать DocumentComplete событие?

Ответ №1:

Вы можете использовать событие DocumentCompleted, это событие гарантирует, что ваш документ готов, и загружены все необходимые разделы

 Private Sub browser_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles browser.DocumentCompleted
    ' YOUR FORM FILLING CODE HERE


End Sub
  

а для отправки формы вы можете использовать метод forms ‘ submit(), подобный этому

 browser.Document.GetElementById("text").DOMElement.form.submit()
  

Комментарии:

1. единственная проблема, которую я вижу в этом, заключается в том, что когда я нажимаю «Отправить», загружается новая страница, поэтому после нажатия кнопки «Отправить» не будет ли она просто перезапускать то, что находится в этом разделе, и ошибка, потому что нет формы для заполнения?

2. Вы можете проверить browser.Document.GetElementById("text") IsNot Nothing , прежде чем устанавливать для него значение. Но я бы использовал свой код заполнения fom в DocumentCompleted случае, чтобы быть уверенным в полной загрузке страницы

Ответ №2:

Возможно, элемент «text» еще не загружен или его нет на странице?

Вы могли бы создать некоторый javascript для выполнения этой задачи и внедрить его на страницу.

Вот как сделать «щелчок» в javascript:https://developer.mozilla.org/en/DOM/document.createEvent

Комментарии:

1. Я знаю, что «текстовая» часть страницы не загружена, и именно это выдает мне ошибку, как я мог это исправить.

2. Вместо бесконечного цикла поиска условия, он должен зарегистрировать обработчик загрузки, в vb это выглядит так, как будто это называется DocumentCompleted , смотрите Другой ответ выше.