以IE为例,WatiN处理弹出窗口:

             IE ie = new IE("string"); //打开指定web页
ie.Button(Find.ById("string")).Click(); //点击相应的按钮弹出需要测试的窗口TestSecondWindow
IE newIE = IE.AttachTo<IE>(Find.ByTitle("TestSecondWindow")); // 查找新窗口TestSecondWindow并赋给新的IE对象
//TODO: write the code you need to test in newIE

WatiN处理confirm对话框:

          IE ie = new IE(string); //打开指定web页
ConfirmDialogHandler cdh = new ConfirmDialogHandler();
ie.AddDialogHandler(cdh); //将ConfirmDialogHandler对象与IE建立关联
ie.Button(Find.ById(string)).ClickNoWait(); //记住这里要用ClickNoWait而不能用Click,否则在模式窗口关闭之前代码不会继续执行。
cdh.WaitUntilExists();
cdh.OKButton.Click();
ie.WaitForComplete();
ie.RemoveDialogHandler(cdh); // ConfirmDialogHandler对象与IE取消关联

这里需要注意的是Click()方法与ClickNoWait()方法的区别,先来看看Click()方法

         /// <summary>
/// Clicks this element and waits till the event is completely finished (page is loaded
/// and ready) .
/// </summary>
public virtual void Click()
{
ClickImpl(true);
}

接下来是ClickNoWait()方法:

         /// <summary>
/// Clicks this instance and returns immediately. Use this method when you want to continue without waiting
/// for the click event to be finished. Mostly used when a
/// HTMLDialog or javascript popup is displayed after clicking the element.
/// </summary>
public virtual void ClickNoWait()
{
ClickImpl(false);
}

从上面两段代码上看,可以发现,它们都调用了ClickImpl(bool xxx)方法,只是一个是true一个是false,那么被定义的bool值又是什么呢?找到ClickImpl()方法:

         /// <summary>
/// Handles the implementation of Click and ClickNoWait
/// </summary>
protected virtual void ClickImpl(bool waitforComplete)
{
if (!Enabled)
{
throw new ElementDisabledException(IdOrName, this);
} Logger.LogAction((LogFunction log) => { log("Clicking (no wait) {0} '{1}', {2}", GetType().Name, IdOrName, Description); }); Highlight(true); if (waitforComplete)
{
FireEvent("onclick");
}
else
{
FireEventNoWait("onclick");
} try
{
if (waitforComplete) WaitForComplete();
}
finally
{
Highlight(false);
}
}

原来bool值表示的是WaitForComplete, 撇开其他代码,先找到下面判断语句:

             if (waitforComplete)
{
FireEvent("onclick");
}
else
{
FireEventNoWait("onclick");
}

问题转变成FireEvent()方法及FireEventNoWait()方法之间的区别,先找到FireEvent()方法:

         /// <summary>
/// Fires the specified <paramref name="eventName"/> on this element
/// and waits for it to complete.
/// </summary>
/// <param name="eventName">Name of the event.</param>
public virtual void FireEvent(string eventName)
{
FireEvent(eventName, true, null);
}

看到这段代码,想来,和FireEventNoWait()方法之间的区别可能还会是其中某个bool值的区别,果不其然,看FireEventNoWait()方法:

         /// <summary>
/// Only fires the specified <paramref name="eventName"/> on this element.
/// </summary>
public virtual void FireEventNoWait(string eventName)
{
FireEvent(eventName, false, null);
}

这两个方法都是调用FireEvent(string xxx, bool xxx, ?)方法,且区别仅在于bool值的设定,先不管,跳到这个方法看看先:

         private void FireEvent(string eventName, bool waitForComplete, NameValueCollection eventProperties)
{
if (!Enabled)
{
throw new ElementDisabledException(IdOrName, this);
} Highlight(true); if (waitForComplete)
{
NativeElement.FireEvent(eventName, eventProperties);
WaitForComplete();
}
else
{
NativeElement.FireEventNoWait(eventName, eventProperties);
} Highlight(false);
}

到这里会发现,重点在以下代码中:

             if (waitForComplete)
{
NativeElement.FireEvent(eventName, eventProperties);
WaitForComplete();
}
else
{
NativeElement.FireEventNoWait(eventName, eventProperties);
}

而最主要的在于WaitForComplete()方法的调用上,也就是在ClickNoWait()方法边上注释上所说的,如果用Click()方法,代码在往下走之前一定会等待模式窗口关闭,一旦关闭才是WaitForComplete()完成,因此,使用Click()方法的话,表面看起来整个程序会停着不动,从而达不到对对话框的处理效果。

WatiN框架学习二——对弹窗的处理的更多相关文章

  1. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  2. Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...

    PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框...   AndBase中AbActivity封 ...

  3. WebGL------osg框架学习二

    今天我们继续来学习osg.js框架.上一篇我们介绍了DrawActor对象绘制操作类和Drawable可绘制对象类,我们大致知道了osg对Drawable可绘制对象的绘制流程管理.今天我们要继续介绍S ...

  4. Hibernate框架学习(二)——api详解

    一.Configuration对象 功能:配置加载类,用于加载主配置,orm元数据加载. //1.创建,调用空参构造(还没有读配置文件) Configuration conf=new Configur ...

  5. python flask框架学习(二)——第一个flask程序

    第一个flask程序 学习自:知了课堂Python Flask框架——全栈开发 1.用pycharm新建一个flask项目 2.运行程序 from flask import Flask # 创建一个F ...

  6. Castle ActiveRecord框架学习(二):快速搭建简单博客网站

    一.数据库 1.数据表 Category:类别标签表(字段Type=1为类别,Type=2为标签) Category_Post:类别标签与文章中间表 Post:文章表 Comment:评论表 2.数据 ...

  7. Spring框架学习(二)

    一.依赖注入的三种注入方式 Spring框架为我们提供了三种注入方式:set注入.构造方法注入和接口注入. 1.set注入 规律:无论给什么赋值,配置文件中<property>标签的nam ...

  8. WatiN框架学习

    WatiN 是一个源于 Watir的工具,开源且用于web测试自动化的类库.Web Application Testing in .NET. WatiN 通过与浏览器的交互来实现自动化,使用起来具有轻 ...

  9. Android Afinal框架学习(二) FinalActivity 一个IOC框架

    框架地址:https://github.com/yangfuhai/afinal 相应的源代码: net.tsz.afinal.annotation.view.* FinalActivity Fina ...

随机推荐

  1. Convert IPv6 Address to IP numbers (C#)

    URL: http://lite.ip2location.com/ Use the code below to convert the IP address of your web visitors ...

  2. ARM中C和汇编混合编程及示例(转)

    在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...

  3. HTTP 错误 500.21 - Internal Server Error 处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    导致这个错误出现的原因是因为.net Framework4.0没有注册 解决方法:打开运行命令行,运行下面的命令: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30 ...

  4. 支持取消操作和暂停操作的Backgroundworker

    这也是今天讨论的话题.取消是默认就支持的,而暂停则默认不支持.但通过ManualResetEvent可以对其进行干预. using System; using System.Collections.G ...

  5. 所有文章都迁移到我自己的博客了:http://blog.neazor.com

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  6. WPF之DataGrid

    1.WPF 4 DataGrid 控件(基本功能篇) 基本使用,绑定数据展示 2.WPF 4 DataGrid 控件(自定义样式篇) 定义行,列,头,单元格等样式 3.WPF 4 DataGrid 控 ...

  7. MMO之禅(二)职业精神

    MMO之禅(二)职业精神 --心态 目标 信仰 Zephyr 201304 继续上篇,继续讲什么?打了很多腹稿点滴,从引擎架构,到上层数据.逻辑模块规划,想了很多,临起笔,却总发觉四顾心茫然,乱不可言 ...

  8. DMSFrame 之SqlCacheDependency(二)

    上篇文章介绍的是通知模式的缓存机制,这里介绍的是数据库轮循模式处理,这种模式对SQL2005以下的支持还是比较好的 引擎源码如下: /// <summary> /// 轮循模式 /// 数 ...

  9. 常用的sql语句(找不同位数,找重复)

    1.SQL找不同位数 select length(aae135),count(1) from ac01 group by  length(aae135) ; ————————————————————— ...

  10. VC6.0 error LNK2001: unresolved external symbol _main解决办法

    学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过.产生连接错误的原因非常多,尤其LNK2001错误 ...