私は、いくつかの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
}