以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. Win7任务栏图标大小调整为等宽

    打开注册表,找到HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics,新建DWORD,输入MinWidth,大图标设为56,小图标设定为36: 参 ...

  2. Linux--Ubuntu12.04安装NDK

    前言 本篇博客将介绍如何在Ubuntu12.04下安装Android NDK,在其他版本的Ubuntu下,方法也类似.由于Android NDK不能单独作为Android应用程序来运行,因此,使用An ...

  3. 用C#通过反射实现动态调用WebService 告别Web引用

    我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...

  4. Android学习笔记----Activity的生命周期图示

    转载,一目了然.

  5. searchableselect不支持onchange的问题

    1.找到jquery.searchableSelect.js 2.找到selectItem函数 修改里面的方法,加入自定义你要回调的函数 selectItem: function(item){ //L ...

  6. Foundation和UIKit框架组织图

    转自:http://fantom.iteye.com/blog/1776558

  7. 如何在终端实时展现git分支

    在微博上看到ghosTM55在终端可以实时展现出当前运行的分支,觉得很奇特,于是google了一把.这里面存在两个内容,第一个bash,第二个是git bash基础: 了解到linux的shell存在 ...

  8. java之接口interface

    接口 1.多个无关的类可以实现同一个接口 2.一个类可以实现多个无关的接口 3.与继承关系类似,接口与实现类之间存在多态性 4.定义java类的语法格式 < modifier> class ...

  9. iOS开发之企业发布无线安装APP

    前提是注册成为企业开发者(¥299),申请到证书并安装到本地,可以正常使用Xcode在IOS移动设备上进行Debug. 首先build看是否报错.如无错 执行下一: 执行Product—Archive ...

  10. 经典SQL语句大全(网络资源共享)

    下列语句部分是Mssql语句,不可以在access中使用.  SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)  DML—数据操纵语言(SELECT,DELET ...