【发布时间】:2012-07-26 14:09:13
【问题描述】:
好的,所以我是新来的,所以如果我发布不正确或有点含糊,我提前道歉。我的问题是,当我尝试运行我的代码时遇到了NullReferenceException,但是在调试并将鼠标悬停在有问题的变量上时,我确实看到了变量的值。
这是我正在使用的 VB 代码:
Private Sub Login_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles login.Click
status.Text = "Connecting...."
WebBrowser2.Navigate("http://*****.com/?op=login")
WebBrowser2.Document.GetElementById("loginUsername").InnerText = username.Text
WebBrowser2.Document.GetElementById("loginPassword").InnerText = password.Text
WebBrowser2.Document.GetElementById("loginSubmit").InvokeMember("click")
End Sub
这里是正在发生的事情的快照:
------------ 编辑:解决方案 --------
WebBrowser2.Url = New Uri("http://*****.com/?op=login")
WaitForPageLoad() ' <---------- ADDED NEW FUNCTION TO WAIT FOR PAGE LOAD
WebBrowser2.Document.GetElementById("loginUsername").InnerText = username.Text
WebBrowser2.Document.GetElementById("loginPassword").InnerText = password.Text
WebBrowser2.Document.GetElementById("loginSubmit").InvokeMember("click")
status.Text = "Completed"
所以我创建了一个名为 WaitForPageLoad() 的新函数(归功于 How to wait until WebBrowser is completely loaded in VB.NET? 中的 BGM),它基本上循环检查页面是否准备就绪,然后一旦准备就绪,就会被杀死处理程序,因此登录成功并且页面不会循环。这是 WaitForPageLoad():
Private Property pageready As Boolean = False
Private Sub WaitForPageLoad()
AddHandler WebBrowser2.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf PageWaiter)
While Not pageready
Application.DoEvents()
End While
pageready = False
End Sub
Private Sub PageWaiter(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
If WebBrowser2.ReadyState = WebBrowserReadyState.Complete Then
pageready = True
RemoveHandler WebBrowser2.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf PageWaiter)
End If
End Sub
【问题讨论】:
-
@Mr.Alien 不再是了 ;)
-
@Polynomial 那时我没有重新标记选项 ;)
-
@Mr.Alien Hehe,这就是拥有大量代表的好处。无论如何,我将您的编辑标记为有用:)
-
其他人已经回答了这个问题,但值得注意的是,您的屏幕截图中的工具提示不是有问题的变量。这是您分配给 的
null,而不是您分配的来源。