Watin框架中关于弹出提示的处理及改造

上一篇 / 下一篇  2010-08-05 23:39:45 / 个人分类:自动化测试

最近在公司的一个自动化项目中使用了开源的自动化框架Watin来开发公司的一个测试工具,在使用过程中研究了下Watin中对弹出提示的处理。

网上能搜到一些介绍Watin对弹出提示处理的文章。其实很多示例在Watin开源代码中就可以看到,如下:

 var alertDialogHandler = new AlertDialogHandler();
   using (new UseDialogOnce(Ie.DialogWatcher, alertDialogHandler))
   {
    Ie.Button(Find.ByValue("Show alert dialog")).ClickNoWait();

    alertDialogHandler.WaitUntilExists();

    var message = alertDialogHandler.Message;
    alertDialogHandler.OKButton.Click();

    Ie.WaitForComplete();
   }

其实Watin框架本身对弹出提示(javascript中的alert)使用的是另外一个线程对打开的程序进行监控,如果检索到定义的提示,就做相关的处理,但此时存在一个问题,计算机现在都是多线程运行的,新开的线程是不断的在轮循执行,此时对弹出提示的处理不一定及时,如果代码运行过快,有时可能不一定能处理。

笔者在项目应用过程中需要对弹出提示做完全的正确性校验,此时对提示信息的处理以及验证需要准确,那对于本身Watin所使用的这种方式将不能完全保证结果的正确性。所以后面研究了Watin相关处理代码,对弹出提示的处理进行了改造,直接检查是否存在弹出提示,并做关闭处理,记录提示信息:

private void CloseAlertInfo()
{
var winEnumerator = new WindowsEnumerator();
var windows = winEnumerator.GetWindows(win => true);
 string strMsg = "";
 foreach ( window in windows) {
  if (window.IsDialog() && IsWindowOfIexploreProcess(window)) {
    strMsg = window.Message;
    SendMessage(window.Hwnd, 0x10, 0, 0);
    break; 
   }
  }
}

private bool IsWindowOfIexploreProcess(Window window)
{
   return (String.Compare(window.ProcessName, "iexplore", true) == 0);
}

此段代码可以放到操作后进行提示信息的直接处理,此时效率可能较低,但对提示信息的处理及校验将是即时的(实际上是改到当前线程线性执行),对于处理和校验有要求的可以按这样来处理。如果系统弹出多个提示,对多个提示处理时,建议给出Thead.sleep(100)这样的等待时间,因为程序处理过快,可能导致提示信息不能正确捕获,读者在试用过程中可以根据实际情况进行改进,这里不进行详细论述了。

改进后的方法可能不是好的方式,这里我也是临时解决问题使用的方案,哪位读者如果有更好的解决方法,请留言告知,不胜感激!


TAG:

 

评分:0

我来说两句

日历

« 2024-05-09  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 9004
  • 日志数: 13
  • 建立时间: 2010-07-28
  • 更新时间: 2010-08-25

RSS订阅

Open Toolbar