我正在开发一个小型内部使用实用程序来监控几个网站的正常运行时间和响应能力。我们有非常专业的要求和测试标准,因此为此开发了一个小型应用程序。
我必须使用 WebBrowser 控件来加载网站,因为它在 JavaScript 和所需的插件上具有良好的性能。(测试必须尽可能真实)因此,我的测试必须在 GUI 线程中运行,目前在“DocumentCompleted”事件中。
此外,我正在测试的网站是 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
}