0

我正在开发一个小型内部使用实用程序来监控几个网站的正常运行时间和响应能力。我们有非常专业的要求和测试标准,因此为此开发了一个小型应用程序。

我必须使用 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

}
4

1 回答 1

0

基于事件的模型可能是更好的方法;而不是循环。

我会将一些OnPropertyChanged事件处理程序添加到div由 ajax 查询而不是循环更新的或容器中。

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 回答