0

私は、いくつかのWebサイトの稼働時間と応答性を監視するための小さな内部使用ユーティリティを開発しています。テストするための非常に専門的な要件と基準があるため、このための小さなアプリケーションを開発しています。

Webブラウザコントロールを使用してWebサイトをロードする必要があります。これは、必要なJavaScriptとプラグインが適切であるためです。(テストは可能な限り現実の世界で行う必要があります)その結果、私のテストはGUIスレッドで、現在は「DocumentCompleted」イベント内で実行する必要があります。

さらに、テストしているWebサイトはAJAXが重いため、ロジック内に待機期間を実装して、DOMが期待どおりに読み込まれるようにする必要があります。たとえば、whileループを使用して、ログオンページにタグが存在することを確認します。

私の概念実証は期待どおりに機能し、結果に非常に満足しています。しかし、私はこれをより「タスク指向」にする方法に苦労しています。たとえば、タイムアウト期間と、ユーザーが何が起こっているのかをキャンセルする機能を実装する必要があります。たとえば、ログオンページが失敗した可能性があるため、正しい入力が表示されることはありません。

現時点で私が見ることができる唯一の方法は、UserCancel変数をチェックするかストップウォッチをチェックするために、すべてのステップでロジックを実装することです。

アプリケーションのアーキテクチャーで根本的に悪い選択をしたのではないかと心配しているので、上記を実装してコードを改善する方法についてのアドバイスを探しています。


private void TestSite(string url){

webBrowser.Naviate(url);
stopwatch.Start();

}

private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {

if(stopwatch.Elapsed.Seconds > timeOutValue || userCancel){
//Task timed out, or user has cancelled
return;
}

//Switch to the relevant application logic
//siteStatus is defined by where I expect the website to be at any particular time. 
switch(siteStatus)
{

     case siteStatus.LogonPage:
     if(DocumentTitle != ExpectedDocumentTitle){

     //Page is unexpected. Handle this and return

     }


     //Title is correct, wait until website has built the DOM
     while(stopwatch.Elapsed.Seconds < timeOutValue || !userCancel || webBrowser1.Document.GetElementsByTagName("input").Count() < 2){

     //Carry on
     Application.DoEvents();

     } 

     if(stopwatch.Elapsed.Seconds > timeOutValue){ return; }
     if(userCancel){ return; } 

     //Business logic goes here. Reports on time taken, ensures correct elements are on the page

     break;

     case siteStatus.Menu:

     //Essentially as above with different logic and tests

     break;

    //etc etc

}
4

1 に答える 1

0

イベント ベースのモデルは、おそらくより優れたアプローチです。ループではなく。

ループではなく、ajax クエリによって更新される or コンテナーにいくつかのOnPropertyChangedイベント ハンドラーを追加します。div

private void DocumentCompletedHandler(object sender, EventArgs e)
{

    HtmlElement elem = webctrl.Document.GetElementById("ajaxDiv");

    if (elem != null)
    {
          elem.AttachEventHandler("onpropertychange", new EventHandler(ajaxEvent));
    }

}

ハンドラーと

private void ajaxEvent(Object sender, EventArgs e)
{
      HtmlElement div = webctrl.Document.GetElementById("ajaxDiv");
      if (div == null) return;  // Not Found!?
      String contentLoaded = div.InnerHtml; // get the content loaded via ajax
}

同じ構造を念頭に置いて、割り込みイベントなどを発生させて操作を中止することができます。または、コマンドを使用stopして Web コントロールのすべての処理を停止することもできます。ただし、これにより ajax 処理が停止するかどうかはわかりません。

private void BtnAbort_Click(Object sender, EventArgs e)
{
   webctrl.Stop();
   // TODO : Remov any event handlers
}
于 2013-01-14T10:32:27.050 に答える