首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

7.2  如何判断待测Web程序何时完全加载到浏览器

问题

如何判断待测Web程序是否已经完全加载到用于测试的IE浏览器。

设计

注册一个DWebBrowserEvents2接口事件处理函数,并通过一个类作用域范围内的AutoResetEvent对象和一个方法代理(method delegate)来同步这个事件处理函数。

方案

class Class1

{

  static AutoResetEvent documentComplete = new AutoResetEvent(false);

  static void Main(string[] args)

  {

    SHDocVw.InternetExplorer ie = null;

    // 启动IE程序——参见7.1节

// 把ie对象连接到IE程序所在的进行——参见7.1节

    ie.DocumentComplete += new

      DWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete);

    Console.WriteLine("\nNavigating to the Web app");

    object nil = new object();

    ie.Navigate("http://server/path/WebApp.aspx", ref nil, ref nil,

      ref nil, ref nil);

    documentComplete.WaitOne();

  } // Main()

  private static void ie_DocumentComplete(object pDisp, ref object URL)

  {

    documentComplete.Set();

  }

} // class

编写轻量级的Web UI自动化测试程序时,如何决定待测程序何时被完全加载到用于测试的IE浏览器是需要费一些周折的。这一点是很关键的,因为否则的话,测试程序就有可能在待测程序尚未完全加载的情况下试图对其实施操作,而这么做几乎肯定会导致抛出一个异常。Shdocvw.dll里的InternetExplorer对象包含一个DocumentComplete事件,这个事件与DWebBrowserEvents2接口(这个接口取代了旧的、已经废弃了的DWebBrowserEvents接口)相关联。自动化套件可以通过实现这个接口从IE程序接收到相应的事件通知。这个解决方案中还用到了一个AutoResetEvent对象,它用来对自动化测试程序进行同步。

注解

在创建了InternetExplorer对象,并把它连接到一个正在运行的IE进程之后(如7.1节所述),可以通过DWebBrowserEvents2接口注册一个event handler,并且把这个event handler与InternetExplorer.DocumentComplete事件相关联。这个event handler的构造函数接受一个方法委托(method delegate),当DocumentComplete事件被触发时,程序的控制权会转移到作为参数的这个方法委托。在本方案中,这个方法委托在获得程序的控制权后,只是把用于同步的AutoResetEvent对象设为signaled。换句话说,当IE进程完成HTTP响应页的加载之后,会触发DocumentComplete事件,然后程序的控制权转移到方法委托,这个委托又会把AutoResetEvent对象设为signaled。因此,你可以通过插入AutoResetEvent.WaitOne()调用,在程序中的任何地方暂停自动化测试的执行。这个线程的执行会一直被阻塞,直到AutoResetEvent.Set()被调用,而只有当IE中的当前文档页面被完全加载以后,才会调用AutoResetEvent.Set()。请注意,如果有意外出现,自动化测试程序有可能会永远等待下去,并且待测Web车工内需永远也不会完全加载。为了避免发生这种情况,你可以传一个整型参数和一个布尔型标识给WaitOne()方法,整型参数用于指定最大的超时时间(以毫秒计),布尔型标识用于指定是否可以在等待结束之前退出同步域。例如:

documentComplete.WaitOne(9000, true);

一种常见的错误时,试图通过插入Thread.Sleep()语句来暂停自动化测试程序,直到待测Web程序完全加载到用于测试的IE浏览器。因为除了极少数的例外情况,IE都是在单线程下运行的,Thread.Sleep()不仅会暂停自动化测试程序,也会暂停IE。

知道了如何判断一个Web页面是否完全加载,接下来我们就可以通过InternetExplorer.Navigate()方法导航到待测的Web页面。例如:

object nil = new object();

ie.Navigate("http://server/path/WebApp.aspx", ref nil, ref nil,

              ref nil, ref nil);

Navigate()方法有5个参数。第一个参数是必填的,它是程序要转到的URL。另外4个参数都是可选的。大多数情况下,你都可以像本例中一样把一个虚假对象(dummy object)传给另外4个参数。第一个可选参数是一个对象的引用,这个对象包含一个常量用来指定是否把要导航资源加到历史列表里,是否要读写缓存(cache),以及是否在新的窗口里打开资源。第二个可选参数是一个对象的引用,这个对象包含一个字符串用来指定要显示哪个frame。第三个可选参数也是一个对象的引用,这个对象包含一个字符串用于指定HTTP POST的数据(通常是HTML form元素里的数据)。第四个可选参数还是一个对象的引用,这个对象包含一个字符串用于指定发送到Web服务器的额外的HTTP报头(header)。因为自动化测试程序通过IE的UI对它进行操纵,所以不需要传入这些可选参数。例如,我们不用填充用于表示HTTP POST数据的那个参数,因为我们是通过模拟单击与form元素相关联的submit按钮来发送数据的。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论