35

欠陥追跡システムの Web インターフェイスを介して、一度に複数のバグのクローンを作成するプログラムを作成しようとしています。ページが完全に読み込まれるまで待ってから続行するにはどうすればよいですか?

//This is pseudo code, but this should give you an idea of what I'm trying to do.  The
//actual code uses multi-threading and all that good stuff :).
foreach (string bug in bugs)
{
    webBrowser.Navigate(new Uri(url));
    webBrowser.Document.GetElementById("product").SetAttribute("value", product);
    webBrowser.Document.GetElementById("version").SetAttribute("value", version);
    webBrowser.Document.GetElementById("commit").InvokeMember("click");

    //Need code to wait for page to load before continuing.
}
4

11 に答える 11

33

DocumentCompletedイベントを試す:

webBrowser.DocumentCompleted +=
    new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);

void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    webBrowser.Document.GetElementById("product").SetAttribute("value", product);
    webBrowser.Document.GetElementById("version").SetAttribute("value", version);
    webBrowser.Document.GetElementById("commit").InvokeMember("click");
}
于 2009-02-24T22:30:23.007 に答える
32

このコードは私にとって非常に役に立ちました。もしかしたらそれはあなたのためでもあるかもしれません

wb.Navigate(url);
while(wb.ReadyState != WebBrowserReadyState.Complete)
{
     Application.DoEvents();
}
MessageBox.Show("Loaded");
于 2009-06-05T14:04:00.763 に答える
20

UI スレッドをブロックせずにこれを行う最善の方法は、.net 4.5 で導入された Async と Await を使用することです。
これをコードに貼り付けるだけで、ブラウザを Web ブラウザ名に変更できます。このようにして、スレッドはページが読み込まれるのを待ちます。時間がない場合は、待機を停止し、コードの実行を続けます。

private async Task PageLoad(int TimeOut)
    {
        TaskCompletionSource<bool> PageLoaded = null;
        PageLoaded = new TaskCompletionSource<bool>();
        int TimeElapsed = 0;
        Browser.DocumentCompleted += (s, e) =>
        {
            if (Browser.ReadyState != WebBrowserReadyState.Complete) return;
            if (PageLoaded.Task.IsCompleted) return; PageLoaded.SetResult(true);
        };
        //
        while (PageLoaded.Task.Status != TaskStatus.RanToCompletion)
        {
            await Task.Delay(10);//interval of 10 ms worked good for me
            TimeElapsed++;
            if (TimeElapsed >= TimeOut * 100) PageLoaded.TrySetResult(true);
        }
    }

そして、非同期メソッドまたはボタンクリックイベントで、次のように使用できます。非同期にするだけです。

private async void Button1_Click(object sender, EventArgs e)
{
   Browser.Navigate("www.example.com");
   await PageLoad(10);//await for page to load, timeout 10 seconds.
   //your code will run after the page loaded or timeout.
}
于 2014-02-23T06:39:10.620 に答える
12

WatiN プロジェクトをチェックしてください:

Watirに触発され、2005 年 12 月に開始された WatiN の開発は、.Net 言語で同様の種類の Web アプリケーション テストを可能にしました。それ以来、WatiN は使いやすく、機能が豊富で安定したフレームワークに成長しました。WatiN は C# で開発されており、.Net を使用して Internet Explorer と FireFox でテストを自動化する簡単な方法を提供することを目的としています...

于 2009-02-24T22:29:30.887 に答える
8

Browser.Task.IsCompletedをPageLoaded.Task.IsCompletedに変更する必要があることを除いて、Taskメソッドはうまくいきました。

コメントを追加するには、より高い評価が必要なため、コメントを追加しませんでした。

于 2014-05-02T15:34:51.143 に答える
2

Selenium ( http://seleniumhq.org ) または WatiN ( http://watin.sourceforge.net ) を試して、手間を省いてください。

于 2009-02-24T22:45:54.967 に答える
1

InternetExplorer.Application COM オブジェクトを使用している場合は、ReadyState プロパティの値が 4 であることを確認してください。

于 2009-02-24T22:28:56.287 に答える
1

WebBrowser コントロールのDocumentCompletedイベントは、必要な場所に移動する必要があると思います。

于 2009-02-24T22:29:45.240 に答える
1

「commit」要素が標準のフォーム送信ボタンを表していると仮定すると、イベント ハンドラを WebBrowsers Navigated イベントにアタッチできます。

于 2009-02-24T22:31:47.763 に答える