2

さて、私はここで新しいので、間違って投稿したり、少し漠然としている場合は、事前にお詫び申し上げます。私の問題は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()という新しい関数( WebBrowserが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
4

3 に答える 3

5

WebBrowser2.Navigateドキュメントの読み込みには時間がかかりますが、非同期です。これは、ドキュメントの読み込みが完了する前に次のコードが実行されることを意味します。

したがって、次の行でGetElementByIdは、まだターゲット要素を見つけることができず、を返しますNothing。これを防ぐには、呼び出し後にコードを実行することはできません。Navigate代わりに、ドキュメントの読み込みが完了すると発生するイベントのイベントハンドラーを作成し、そこでコードを実行する必要があります。–これはDocumentCompletedイベントです。

于 2012-07-26T14:16:47.330 に答える
1

特にその行では...

  • Documentになり得るnull
  • の結果はであるGetElementById("loginUsername")可能性がありますnull
于 2012-07-26T14:11:15.943 に答える
0

usernameなぜそれがヌルだと思いますか?

私はそれWebBrowser2.Document.GetElementById("loginUsername")が戻るに違いないnull

他の可能性はDocumentnullになることです。

于 2012-07-26T14:11:06.343 に答える