1

C# で初めて WebBrowser コントロールを使い始めました。テキストボックスにテキストを書き込んでから、ログイン用のボタンをクリックするという、非常に単純なことをしようとしています。

WebContest wc_class = new WebContest();
...

 wc_class.wbThread1.Navigate("http://www.mysite.com");
        while (wc_class.wbThread1.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents();

ここで、ログインページの ReadyState は完全に機能します。次に、テキストボックスにテキストを書き続けてからボタンをクリックします

wc_class.wbThread1.Document.GetElementById("field_email").SetAttribute("value", tbLogin.Text);
wc_class.wbThread1.Document.GetElementById("field_password").SetAttribute("value", tbPassword.Text);
wc_class.wbThread1.Document.GetElementById("field_remember").InvokeMember("click");
wc_class.wbThread1.Document.GetElementById("hook_FormButton_button_go").InvokeMember("click");

今回は、ログイン後にページからリンクを抽出する必要があります。このようなことをしてください:

...
foreach (HtmlElement link in wc_class.wbThread1.Document.Links)
            {
                string href = link.GetAttribute("HREF");
                string fileName = "links.txt";
                using (FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write))
                using (StreamWriter sw = new StreamWriter(fs))
                {
                    sw.WriteLine(href);
                } 

そして問題は、DocumentComplete イベントを期待することです。ログイン後のページはロード待ちではありません。なんで?ログインボタンをクリックした後、ページの ReadyState を確認するにはどうすればよいですか?

そして、ページナビゲーションのすべてのイベントに対してそれを行う方法は?

4

1 に答える 1

0

私はこの問題を抱えていて、タイマーを使って解決しました。タイマーを数秒間開始した後InvokeMember("click");、タイマーの目盛りでReadyState. 完了した場合 - タイマーを停止します。それ以外の場合は、再び起動します。

System.Windows.Forms.Timer yesTimer;
yesTimer.Interval = 2000;

public Main()
{
  webBrowser1.Navigate("http://www.mysite.com");
  yesTimer.Start();
}

  private void yesTimer_Tick(object sender, EventArgs e)
  {
     if (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
     {
        return;
     }

     yesTimer.Stop();
     //do here whatever you want then webBrowser1 is completed
  }
于 2012-12-20T16:09:09.110 に答える