InvalidCastException с WebBrowser.IsBusy или ReadyState (VB .NET)
Я играл с методом, который был предложен в качестве ответа на другой из моих вопросов (Автоматизировать вход на сайт и заполнение форм?) и заметил что-то любопытное.
Ответом на поставленный выше вопрос было использование серии вызовов javascript в качестве URL-адреса.s для того, чтобы заполнить веб-форму и отправить ее. Я пытался сделать это автоматически в программе VB .NET безуспешно.
Оригинальный пример, который мне даливозможно, потому что вы ожидаете в том же потоке, в котором работает элемент управления WebBrowser:
WebBrowser1.Navigate("http://www.google.com")
Do While WebBrowser1.IsBusy OrElse WebBrowser1.ReadyState WebBrowserReadyState.Complete
Threading.Thread.Sleep(1000)
Application.DoEvents()
Loop
WebBrowser1.Navigate("javascript:function%20f(){document.forms[0]['q'].value='stackoverflow';}f();")
Threading.Thread.Sleep(2000) 'wait for javascript to run
WebBrowser1.Navigate("javascript:document.forms[0].submit()")
Threading.Thread.Sleep(2000) 'wait for javascript to run
Если вы нене ждать, это неКонечно, тоже. URL-адрес, по которому вы первоначально просматриваете, прерван. Но интересно, что вы не можете выполнить«Navigations на вызовы JavaScript без задержки, либо.
Так что я'Мы попробовали два других метода: использовать событие DocumentCompleted, чтобы дождаться просмотра URL-адреса гнезда, пока браузер не завершит загрузку страницы. К сожалению, DocumentCompleted не всегда срабатывает и неКажется, что срабатывает после каждого URL JavaScript.
Второй метод, который я попробовал, состоял в том, чтобы поместить ожидание в отдельный поток:
Private Delegate Sub SetTextDelegate(ByVal TheText As String)
Private Sub delSetText(ByVal TheText As String)
WebBrowser1.Navigate(TheText)
End Sub
Private Sub BrowseTo(ByVal URL As String)
If WebBrowser1.InvokeRequired Then
Me.BeginInvoke(New SetTextDelegate(AddressOf delSetText), URL)
Else
WebBrowser1.Navigate(URL)
End If
End Sub
Private Sub TargetURL()
BrowseTo("http://www.google.com")
End Sub
Private Sub TypeSomethingIn()
BrowseTo("javascript:function%20f(){document.forms[0]['g'].value='test';}f();")
End Sub
Private Sub SubmitForm()
BrowseTo("javascript:document.forms[0].submit()")
End Sub
Private Sub Wait()
While True
If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then Exit Sub
Threading.Thread.Sleep(100)
End While
End Sub
Private Sub AutoBrowse()
TargetURL()
Wait()
TypeSomethingIn()
Wait()
SubmitForm()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim t As Threading.Thread
t = New Threading.Thread(AddressOf AutoBrowse)
t.Start()
End Sub
Любопытно, что проверка ReadyState (или IsBusy, в этом отношении) в цикле ожидания иногда вызывает InvalidCastException. Предположительно, звонки на них не безопасны? Я понятия не имею. Если я помещаю вызывающий вызов вызов в блок Try, цикл ожидания просто не работает. На самом деле это даже кажется исключением »сохраняется» чтобы все испортить, потому что даже при пошаговом выполнении кода с блоком try Visual Studio останавливается на 10–20 секунд (то же самое происходит и без блока try).
Есть идеи?