0

Web アプリケーションで WebBrowser コントロールを使用しています。DocumentCompleted イベントで、文字列に DocumentText が必要です。私の DocumentCompleted イベントは次のようなものです。

void IEBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    string str = IEBrowser.DocumentText;
}

今問題は、DocumentCompleted イベントで取得できない DocumentText です。DocumentCompleted イベントの後に処理を行う JavaScript がいくつかあると思います。そこで、コードを次のように変更します。

void IEBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    Thread th = new Thread(new ThreadStart(startthread));
    th.Start();              
}

public void startthread()
{
   //To Wait untill WebBrowser run that javascript
   Thread.Sleep(5000);
   string str = IEBrowser.DocumentText; 
}

このコードを使用すると、「指定されたキャストは無効です。」というメッセージが表示されます。WebBrowser が実行されているスレッドを待機させるにはどうすればよいですか?

4

2 に答える 2

1

これは良い方法だとは思いませんが、1 つの方法は、これを DocumentComplete で処理しないことです。次のようにします。

  1. 必要なことは何でもしてください...その後、ある時点で、ブラウザはURLに移動する必要があります(構文を確認する必要がある場合があります。ヘッダーから入力するだけです):

                IEBrowser.Navigate(url);
            bool flag = true;
            int times = 0;
            while (flag)
            {
                Sleep(500);
                Application.DoEvent();
    
                if (IEBrowser.ReadyState == WebBrowserReadyState.Complete)
                {
                    times ++;
                }
                else
                {
                    times = 0;
                }
    
                if (times >= 10)
                {
                    flag = false;
                }
            }
    
            string str = IEBrowser.DocumentText;
    

繰り返しますが、これは試行するための単なる回避策です。目的にもよりますが、これは大幅に改善できます。しかし、これと同様の手順を多くのスクレイピング作業に使用しましたが、うまく機能します。ページによっては、documentComplete が複数回発生する場合があります。

幸運を

于 2012-10-11T17:36:00.270 に答える
0

ここで何をしているのかよくわかりませんが、そのスレッドを開始することは正しい解決策ではないことを保証できます.

私の経験では IEBrowser_DocumentCompleted を数回呼び出す必要があるため、これを試してください...

void IEBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {     
if (IEBrowser.ReadyState = WebBrowserReadyState.Complete)         
     {
       //Do my stuff
     }
}

これがうまくいくかどうかはわかりませんが、私は過去に成功しました...

于 2012-10-11T17:18:18.433 に答える