0

私の問題は単純ですが、なぜ if/loop 内で機能しないのかわかりません。ここではいくつかの例を示します。

働くもの:

private void button1_Click(object sender, EventArgs e)
{
    webBrowser1.Document.GetElementById("login").SetAttribute("value", "something");
    webBrowser1.Document.GetElementById("password").SetAttribute("value", "something");
}

動作していないもの:

if (webBrowser1.IsBusy == false)
{
    webBrowser1.Document.GetElementById("login").SetAttribute("value", "something");
    webBrowser1.Document.GetElementById("password").SetAttribute("value", "something");
}

「if」ステートメントが何であれ、機能しません。また、「for」で試し、「for」のループから抜け出そうとしましたが、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが引き続き発生します。

4

1 に答える 1

1

情報が少ないので推測で。

プロパティを設定した直後にページを変更しようとしていると思いますUrl。Web ページはまだ読み込まれていないため、取得するコントロールはまだ利用できません。

DocumentCompletedのイベントにコードを追加してみてくださいWebBrowser。このイベントは、ドキュメントが完全に読み込まれた直後にトリガーされ、要素が利用可能になります。

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
  var loginControl = webBrowser1.Document.GetElementById("login");
  var passwordControl = webBrowser1.Document.GetElementById("password");

  if (loginControl != null)
    loginControl.SetAttribute("value", "something");

  if (passwordControl != null)
    passwordControl.SetAttribute("value", "something");
}

詳細: http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.documentcompleted.aspx

アップデート

についてのあなたの仮定IsBusyは完全には正しくありません。false何もロードされていない状態から始まります。設定すると、Urlプロパティはすぐに に設定されませんtrue

リクエストした別の方法として、ロードが完了したときReadyStateに値を持つプロパティを使用できます。WebBrowserReadyState.Complete次の例を使用できます。なんらかの理由でページが読み込めないときに無限ループのリスクがあるため、個人的には好きではありません。DocumentCompleted可能であればを使用することをお勧めします。その例を修正して、ログインしていないページも正しく処理できるようにしました。

while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
{
  Thread.Sleep(0);
  Application.DoEvents();
}
于 2012-09-29T23:02:31.903 に答える