WatiN框架学习二——对弹窗的处理

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

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

WatiN处理confirm对话框:

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

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

1         /// <summary>
2         /// Clicks this element and waits till the event is completely finished (page is loaded
3         /// and ready) .
4         /// </summary>
5         public virtual void Click()
6         {
7             ClickImpl(true);
8         }

接下来是ClickNoWait()方法:

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

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

 1         /// <summary>
 2         /// Handles the implementation of Click and ClickNoWait
 3         /// </summary>
 4         protected virtual void ClickImpl(bool waitforComplete)
 5         {
 6             if (!Enabled)
 7             {
 8                 throw new ElementDisabledException(IdOrName, this);
 9             }
10
11             Logger.LogAction((LogFunction log) => { log("Clicking (no wait) {0} ‘{1}‘, {2}", GetType().Name, IdOrName, Description); });
12
13             Highlight(true);
14
15             if (waitforComplete)
16             {
17                 FireEvent("onclick");
18             }
19             else
20             {
21                 FireEventNoWait("onclick");
22             }
23
24             try
25             {
26                 if (waitforComplete) WaitForComplete();
27             }
28             finally
29             {
30                 Highlight(false);
31             }
32         }

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

1             if (waitforComplete)
2             {
3                 FireEvent("onclick");
4             }
5             else
6             {
7                 FireEventNoWait("onclick");
8             }

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

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

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

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

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

 1         private void FireEvent(string eventName, bool waitForComplete, NameValueCollection eventProperties)
 2         {
 3             if (!Enabled)
 4             {
 5                 throw new ElementDisabledException(IdOrName, this);
 6             }
 7
 8             Highlight(true);
 9
10             if (waitForComplete)
11             {
12                 NativeElement.FireEvent(eventName, eventProperties);
13                 WaitForComplete();
14             }
15             else
16             {
17                 NativeElement.FireEventNoWait(eventName, eventProperties);
18             }
19
20             Highlight(false);
21         }

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

1             if (waitForComplete)
2             {
3                 NativeElement.FireEvent(eventName, eventProperties);
4                 WaitForComplete();
5             }
6             else
7             {
8                 NativeElement.FireEventNoWait(eventName, eventProperties);
9             }

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

时间: 2024-11-08 13:54:57

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

Struts2框架学习(二) Action

Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器拦截请求,创建代理Action对象,执行方法,返回结果,界面跳转. 拦截器解析请求路径,获取Action的名称,到配置文件中查找action的完整类名,利用反射创建对象. 每请求一次,就创建一个对象,所以action是多例的,也是线程安全的. 2,关系 请求的路径和配置文件的对应关系: 配置文件中包

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

框架地址:https://github.com/yangfuhai/afinal 对应的源码: net.tsz.afinal.annotation.view.* FinalActivity FinalActivity是一个基础类,结合注解实现了,依赖注入(view的资源id,常用的监听器), 利用set方式注入 完全注解方式就可以进行UI绑定和事件绑定,无需findViewById和set event Listener 这个过程:initInjectedView>findViewById.set

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

PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框...   AndBase中AbActivity封装好了许多方法提供我们去使用,使得在使用的时候更加的方便,只需要传递相关参数即可..省去了我们自己使用基础的函数进行构造...   就好比进度框,Toast框,弹出框,确认框...这些基本的东西都在AndBase的AbActivity封装好了...我们只需要传递参数调用其中内部的方法就可以完成这些视

laravel框架学习(二)

在了解Laravel框架的基本结构之后,初步认识访问过程中路由的使用方法,以一套基本的学生信息增删改查来迅速学习框架开发. 首先了解几个目录文件作为开发的主要阵地: 1. /app/Http/routes.php 路由文件,一切访问从路由开始 2./app/Http/Controllers 控制器目录,我们写的控制器都放在该目录下 3./app/config Laravel配置文件夹一般修改.env文件 4./.env 经常修改配置的文件,数据库配置就在这里 5./public Laravel框

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

一.Configuration对象 功能:配置加载类,用于加载主配置,orm元数据加载. 1 //1.创建,调用空参构造(还没有读配置文件) 2 Configuration conf=new Configuration(); 3 //2.读取指令配置文件=>空参加载方法,加载src下的hibernate.cfg.xml文件 4 conf.configure(); 5 6 //3.读取指定orm元数据(扩展),如果主配置中已经引入映射配置,不需要手动加载 7 //conf.addResource(

TP框架学习(二)

简单的增删改查 1 1.创建一个index.php文件 2 定义应用App目录名 3 导入窗口入口文件 4 开启调试模式//出现错误会报告出错的详细信息 5 define("APP_DEBUG",true);//上线时要关闭的 6 2.前端后台 7 App内Home复制一份,重命名Admin后台模块 8 如果有手机端可再复制一份Api模块 9 3.修改Admin/Controller/IndexController.class.php文件 10 namespace Admin\Cont

WatiN框架学习

WatiN 是一个源于 Watir的工具,开源且用于web测试自动化的类库.Web Application Testing in .NET. WatiN 通过与浏览器的交互来实现自动化,使用起来具有轻便,简单的特点. WatiN.Core: WatiN的核心部分,与浏览器的交互都包含在此模块中. WatiN.Core.DialogHandlers: 该命名空间提供用于操作浏览器对话框的对象. WaitN.Core.Exceptions: 该命名空间里的对象用于处理各种异常. WatiN的原理和其

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

一.数据库 1.数据表 Category:类别标签表(字段Type=1为类别,Type=2为标签) Category_Post:类别标签与文章中间表 Post:文章表 Comment:评论表 2.数据库关系图 3.简单说明 Category和Post表为多对多关系 Post和Comment表 为一对多关系 二.实体类 1.Category类: // 指定数据表,Lazy为延迟加载 [ActiveRecord("Category",Lazy=true)] public class Cat

actix rust actor 框架学习 二 ping actor demo 代码

以下是官方文档的学习,了解基本的actix actor 编程模型 项目初始化 cargo 创建 cargo new actor-ping --bin 效果 ├── Cargo.toml └── src    └── main.rs 添加依赖 cargo.toml 配置 [package] name = "actor-ping" version = "0.1.0" authors = ["rongfengliang <[email protected]