WatiN框架学习二——对弹窗的处理
以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框架学习二——对弹窗的处理的更多相关文章
- Struts2框架学习(二) Action
Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...
- Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...
PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框... AndBase中AbActivity封 ...
- WebGL------osg框架学习二
今天我们继续来学习osg.js框架.上一篇我们介绍了DrawActor对象绘制操作类和Drawable可绘制对象类,我们大致知道了osg对Drawable可绘制对象的绘制流程管理.今天我们要继续介绍S ...
- Hibernate框架学习(二)——api详解
一.Configuration对象 功能:配置加载类,用于加载主配置,orm元数据加载. //1.创建,调用空参构造(还没有读配置文件) Configuration conf=new Configur ...
- python flask框架学习(二)——第一个flask程序
第一个flask程序 学习自:知了课堂Python Flask框架——全栈开发 1.用pycharm新建一个flask项目 2.运行程序 from flask import Flask # 创建一个F ...
- Castle ActiveRecord框架学习(二):快速搭建简单博客网站
一.数据库 1.数据表 Category:类别标签表(字段Type=1为类别,Type=2为标签) Category_Post:类别标签与文章中间表 Post:文章表 Comment:评论表 2.数据 ...
- Spring框架学习(二)
一.依赖注入的三种注入方式 Spring框架为我们提供了三种注入方式:set注入.构造方法注入和接口注入. 1.set注入 规律:无论给什么赋值,配置文件中<property>标签的nam ...
- WatiN框架学习
WatiN 是一个源于 Watir的工具,开源且用于web测试自动化的类库.Web Application Testing in .NET. WatiN 通过与浏览器的交互来实现自动化,使用起来具有轻 ...
- Android Afinal框架学习(二) FinalActivity 一个IOC框架
框架地址:https://github.com/yangfuhai/afinal 相应的源代码: net.tsz.afinal.annotation.view.* FinalActivity Fina ...
随机推荐
- WPF UI虚拟化
ComboBox
- ubuntu 16.04下安装oracle jdk 1.7
网上搜索了下,知道了大概,不能用apt装了,oracle也不再提供deb包了.只能下tar.gz包自己装. 先下载下来jdk:http://www.oracle.com/technetwork/jav ...
- jQuery Mobile 移动开发中的日期插件Mobiscroll使用说明
近期在移动方面的开发,使用jQuery Mobile ,移动方面的插件不如Web 方面的插件多,选择的更少,有一些需要自己去封装,但功力尚不足啊. 日期插件JQM也提供了内置的,但样式方面不好看,只好 ...
- .net微信公众号开发——快速入门
作者:王先荣 最近在学习微信公众号开发,将学习的成果做成了一个类库,方便重复使用. 现在微信公众号多如牛毛,开发微信的高手可以直接无视这个系列的文章了. 使用该类库的流程及寥寥数行代码得到的结果如下. ...
- Pro ASP.NET MVC –第六章 MVC的基本工具
在本章,我们将介绍每个MVC程序员"武器库"的三个重要工具:依赖注入容器.单元测试框架和mock工具.在本书,对于三个工具分别都只用了一种方式实现,但每个工具都还有其他的实现方式. ...
- 解决企业In-House安装APP需HTTPS支持的问题(转载)
同事写的一篇文章,感觉不错,转过来. 解决企业In-House安装APP需HTTPS支持的问题 问题背景: 能否通过应用服务器发布企业应用: 解决iOS7.1后,发布地址必须为HTTPS服务器. 写作 ...
- cocos2dx的lua绑定
一.cocos2dx对tolua++绑定的修正 A.c对lua回调函数的引用 在使用cocos2dx编写游戏时,我们经常会设置一些回调函数(时钟.菜单选择等).如果采用脚本方式编写游戏的话,这些回调函 ...
- NFC 与 Windows Phone 的那点事儿
说起NFC这个词儿应该已经不陌生了,在我们的生活中有很多使用场景都是使用的这项技术,例如公交卡,门禁,还有银联的闪付卡等等.并且近些年在移动设备上使用的场景也越来越多,例如 对 NFC TAG 的读写 ...
- LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium
题目: Given a , and there exists one unique longest palindromic substring. 解题思路:1.简单思路:暴力破解法,时间复杂度O(n^ ...
- 验证 Xcode 是否来自正规渠道
由于最近的 Xcode Ghost 事件的发生,所以我们有必要在安装完 Xcode 时验证其是否来自正规渠道. 在终端系统上运行以下命令启用检测: spctl --assess --verbose ...