- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试作为我的另一个问题 (Automate website log-in and form filling?) 的答案而建议的方法,并注意到一些奇怪的事情。
上述问题的答案是使用一系列 javascript 调用作为 URL,以填写网络表单并提交。我一直试图在 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 被中断。但有趣的是,您也无法立即执行到 javascript 调用的“导航”。
所以我尝试了另外两种方法:使用 DocumentCompleted 事件等待浏览到嵌套 URL,直到浏览器完成加载页面。不幸的是,DocumentCompleted 并不总是触发,而且似乎不会在每个 javascript URL 之后触发。
我尝试的第二种方法是将等待放在单独的线程中:
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 block 中,等待循环就无法工作。事实上,异常似乎“持续存在”以搞砸一切,因为即使使用 try block 逐步执行代码,Visual Studio 也会卡住 10 到 20 秒(没有 try block 也是如此)。
有什么想法吗?
最佳答案
One of the most interesting issues I had experienced and which for I was not able to find a solution in inet - was problem related to WebBrowser control. The thing is that when I was trying to access the Document property of the WebBrowser control instance, I was getting "Invalid cast exception". The thing is that the WebBrowser control is designed to work in one thread. So to fix this you must only check the InvokeRequired property and if it's value is true, then call the logic from the delegate, given into browser.Invoke(...) method.
关于vb.net - InvalidCastException 与 WebBrowser.IsBusy 或 ReadyState (VB .NET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18232441/
我查房.readyState的 BrowserTestObject使用 RFT(Rational Functional Tester)。 有时在我的测试脚本的下一步之前,我需要确保页面已“准备好”并且
我目前正在 servlet 内创建一个私有(private)方法。但我的 PreparedStatement 不断返回 null。 private ArrayList emails(String id
花了几个小时找出问题所在,但失败了..因为我是 Ajax 新手,所以我不知道我看到了什么。真的需要你们找到这个错误。 HTML The Chuff Bucket
home.html front page test 测试.php Click Me! ajax.js function callAJAX(url, pageElement, callMessage
我有一个页面,其中 RFT(Rational Functional Tester)告诉我 readyState 对于 IE 是 3。从视觉上看,这个页面的加载似乎已经完成。 我可以以某种方式手动检查
我正在设置一个非常简单的页面来从 DOMContentLoaded 事件上的数组填充下拉列表,但是在我的环境(VS 代码 + 实时服务器扩展)中,我收到错误,因为整个主体对象不存在在 DOMConte
使用 Vue.js,我想将音频 dom 元素的 readyState 属性用作 react 属性。 我在组件中有音频元素并使用 this.$refs.audioPlayer 访问它 我尝试设置计算属性
在网页中,我正在使用 XMLHttpRequest。我遇到了麻烦,因为事情不会像往常一样发生。 相关代码如下: let xmlHttp = new XMLHttpRequest(); xmlH
我正在尝试更新我的 ajax 请求函数以显示响应的各个状态。 然而,我在发送请求后得到的只是 readyState = 1,然后它直接跳转到 readyState = 4,我从服务器得到了完整的响应。
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Troubleshooting .NET “Fatal Execution Engine Error” 我的
在外部 JS 脚本中,我使用 document.readystate 来确定文档是否已加载。 如果它没有加载,我附加 Onload 事件监听器。 但是,当我在 IE7 文档上从 IEPRO(类似于 F
我正在尝试使用 JavaScript 实现聊天客户端。使用以下构造函数构造客户端: function ChatClient(endpointUrl) { this.xmlHttp = crea
为了确保在执行操作之前准备好文档,我执行以下操作: (function() { var interval = window.setInterval(function() { i
尝试通过 javascript open() 函数将数据放入 XML 中。 但是网站没有超过readyState 1, 下面是Javascript代码 function addItem() {
这个问题已经有答案了: onreadystatechange function is not working in AJAX (4 个回答) 已关闭 8 年前。 我正在制作一个聊天应用程序。在聊天应用
我想在 DOM 完全加载时触发事件。我检查了 document.readyState 但这不是一个事件。我想在 readyState 完成时触发它。我该怎么做? 最佳答案 一些简单的谷歌搜索将我指向这
我正在学习 w3schools 的 PHP/AJAX 教程,但在第一个方面遇到了一些障碍。每次调用此函数时,就绪状态始终未定义。 function showHint(str) { if (st
这是我的代码: var xhttp: OleVariant; xhttp := CreateOleObject('MSXML2.XMLHTTP'); xhttp.Open('GET', URL,
AJAX调用在xhr.readystate===4之后完成是否正确? Here它说状态是 complete。那么这个complete是什么意思呢? 最佳答案 Ajax http 请求有 5 种状态作为
我正在创建一个自定义的 html5 视频播放器,它可以播放直播、录制直播和播放常规视频文件。为了录制我正在使用 RecordRTC。一切运行良好,但我需要创建一个自定义搜索栏。为此,我只是简单地使用
我是一名优秀的程序员,十分优秀!