Вам не нужна никакая async
процедура здесь. Событие WebBrowser.DocumentCompleted уже вызывается асинхронно. DoEvents()
одинаково бесполезен, если не разрушителен.
Вам просто нужно подписаться на событие DocumentCompleted
и вызвать метод Navigate
, чтобы веб-браузер мог загрузить удаленный ресурс Html.
Когда HtmlDocument
будет наконец загружен, WebBrowser сообщит о своем завершении, установив его состояние в WebBrowserReadyState.Complete
.
Об элементе ввода HTML и формах :
здесь код предполагает, что в этом HtmlDocument есть только одна форма.
Это может быть так, но это не так. HTML-документ может иметь более одной формы, и каждый фрейм может иметь свой собственный документ. У IFrames наверняка будет по одному.
Прочтите примечания в этом ответе (код C #, но вам просто нужны заметки) для получения дополнительной информации о том, как обрабатывать несколько кадров / IFrames
Button1
подключит событие DocumentCompleted
и вызовет Navigate()
.
Когда Документ завершен, код в обработчике событий запустится и выполнит процедуру входа в систему.
Затем обработчик событий удаляется, так как он завершил свою задачу, и вам все еще нужно использовать WebBrowser для других целей.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Button1.Enabled = False
WebSiteLogIn()
End Sub
Private Sub WebSiteLogIn()
AddHandler WebBrowser1.DocumentCompleted, AddressOf PageWaiter
WebBrowser1.Navigate("https://thesite.com/#/login")
End Sub
Private Sub PageWaiter(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
WebBrowser1.Document.GetElementById("username").SetAttribute("value", "Username")
WebBrowser1.Document.GetElementById("Password").SetAttribute("value", "Password")
Dim allInputElements = WebBrowser1.Document.Body.All.
Cast(Of HtmlElement).Where(Function(h) h.TagName.Equals("INPUT")).ToList()
For Each element As HtmlElement In allInputElements
If element.GetAttribute("type").ToUpper().Equals("SUBMIT") Then
element.InvokeMember("click")
End If
Next
RemoveHandler WebBrowser1.DocumentCompleted, AddressOf PageWaiter
Button1.Enabled = True
End If
End Sub