我可能错过了一个非常基本的东西,但我只是不明白为什么这不起作用。
我希望根据一些用户输入填写一些网络表单。
我已经在vbscript中写了这个,它的工作完美无瑕。现在我想将它导入VB。
我的两个主要问题atm。
之前,我会有一段代码:
For Each wnd In CreateObject("Shell.Application").Windows
If InStr(1, wnd.FullName, "iexplore.exe", vbTextCompare) > 0 Then
Set IE = wnd
Exit For
End If
Next
用于决定要使用的Internet Explore窗口。但是,如果我在VB中使用这个表单,我会错过任何类型的事件处理。我不能使用IsBusy,我不能使用DocumentCompleted或任何东西。
所以我必须将IE声明为浏览器。
Dim IE As New WebBrowser
这看起来很好..除了..现在我无法在任何地方导航,没有创建浏览器,没有任何事情发生。所以当我运行我的代码时:
IE.Navigate("www.awebwithusernameandpasswordform.org")
IE.Visible = True
Helem = IE.Document.GetElementById("username")
Helem.Value = "xxxx"
Helem = IE.Document.GetElementById("password")
Helem.Value = "xxxx"
Helem = IE.Document.Forms("signupForm")
Helem.Submit()
它只是在“用户名”元素上失败,因为它永远无法导航到网站。
它只是忽略了IE.Navigate。我尝试使用process.start()运行一个新进程,但这也不起作用,它仍然不会为我或任何东西打开一个网页。
其次,我遇到了在文档完全加载时检查vb的主要问题。 在VBS我使用
Do while ie.readystate <> 4 or ie.busy or ie.document.readystate <> "complete"
wscript.sleep 500
Loop
Do until ie.document.readystate = "complete"
wscript.sleep 500
Loop
这就像一个魅力。
在VB中,ie.document.readystate无法识别,我似乎无法使DocumentCompleted事件处理工作。我从这个网站尝试了几件事,但要么他们只是让一切都挂起,要么它只是因为各种原因而无法工作。我尝试了How to wait until WebBrowser is completely loaded in VB.NET?的2个解决方案,但它们都只是让脚本挂起。
任何提示都将非常感谢..
答案 0 :(得分:0)
正如Bjørn-RogerKringsjå试图说的那样,您的代码运行速度比浏览器可以导航的速度快,这意味着您在加载元素之前尝试获取元素。
您需要做的是在.Navigate
和.GetElementById
之间等待:
IE.Navigate("www.awebwithusernameandpasswordform.org")
'WAIT BEFORE COMPLETION
'Continue
Helem = IE.Document.GetElementById("username")
Helem.Value = "xxxx"
然而,在线进行这种非常非常棘手,不建议这样做。最好使用DocumentCompleted
事件处理程序使浏览器控件在加载页面后运行代码。希望这能够彻底清除它。