3

私は c# とその概念に慣れていないので、この質問がばかげている場合は申し訳ありません。winforms webbrowser コントロールを使用して自動化を試みます

elements = webBrowser1.Document.GetElementsByTagName("input");
foreach (HtmlElement element in elements)
{
    if (element.GetAttribute("value") == "Anzeigen")
    element.InvokeMember("click");
}

while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents();

// do some math on recived html
// ......

// show results
MessageBox.Show(numPlanets.ToString() );

説明すると、「Anzeigen」という値のボタンを探してクリックをシミュレートし、新しいページが読み込まれるまで待ってから計算を行います。残念ながら、私の計算は、ページが読み込まれるのを待っていないため、古い HTML コンテンツで行われます。奇妙なことに、Thread.Sleep(5000); を入力すると、foreach ループの後、クリックがシミュレートされる前にこの Sleep が実行され、計算も失敗します。

イベントを使用せずに、そのクリックに対して同期動作が必要なだけです。

あなたがそれで私を助けてくれることを願っています、私の悪い英語でごめんなさい

編集:次のように解決しました:クラス内の変数bool webbbrowserfinished = false、同期動作が必要な場合は、次のようにします:

   webbrowserfinished = false;
   // do navigation here

   while (!webbrowserfinished)
   {
      Application.DoEvents();
      Thread.Sleep(100);
   }
   webbrowserfinished = false;
4

3 に答える 3

5

WebBrowser.DocumentCompleted イベント は、WebBrowser コントロールがドキュメントの読み込みを終了したときに発生します。

private void Form1_Load(object sender, EventArgs e)
{
   webBrowser1.Navigate("google.com");
   webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
}

void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
   MessageBox.Show("Completed Now!");
}
于 2012-09-27T18:04:28.893 に答える
0

それは最善の解決策ではありませんが、Web ブラウザーがナビゲートするときにいつでもタイマーを開始し、timer1.Tick3000 のような値に設定してから、timer1_Tickメソッド内で新しいページで計算を行うことができますtimer1.Stop();

おそらくイベントを使用したより良い解決策があると思いますが、私自身 Web ブラウザーはあまり得意ではありません。

于 2012-09-27T17:19:25.160 に答える