在定义的变量上混淆System.NullReferenceException错误 - VB

Oma*_* J. 2 vb.net exception

好吧所以我是新来的,所以如果我发布错误或者有点模糊,我会提前道歉.我的问题是,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
Run Code Online (Sandbox Code Playgroud)

以下是正在发生的事情的快照:

截图

------------编辑:解决方案-------------------

    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"
Run Code Online (Sandbox Code Playgroud)

所以我创建了一个新函数(信用转到BGM,如何等待WebBrowser在VB.NET中完全加载?),名为WaitForPageLoad(),它实际上循环检查页面是否准备就绪,然后一旦它被杀死处理程序,以便登录成功,页面不循环.这是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
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 5

WebBrowser2.Navigate需要一些时间来加载文档,但是是异步的.这意味着下一个代码在文档完成加载之前执行.

因此,在下一行中,GetElementById还无法找到目标元素并返回Nothing.为了防止这种情况,您无法在调用后执行代码Navigate- 相反,您需要为文档加载完成后触发的事件创建事件处理程序,并在那里执行代码.- 这是DocumentCompleted事件.