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 ...
随机推荐
- SVN(TortoiseSVN)提交时忽略bin跟obj目录
SVN(TortoiseSVN)提交时忽略bin和obj目录 一般协作开发情况下,有意思无意将bin和obj目录添加到版本管理中是很烦人的事儿,在VS中不断地编译程序集和提交将带来版本暴增问题.如果你 ...
- JAVA自动化测试数据设计
数据管理是很重要的,数据管理与方法一样,依然是有层次的,我们在测试的过程中,可能会有多个环境,每个环境的URL啊,登录名啊,数据库连接地址啊等等不一样,我们可以把这些环境每个都配置一个数据文件,里面写 ...
- <a>标签href属性与onclick事件
a标签主要用来实现页面跳转,可以通过href属性实现,也可以在onclick事件里实现. <a onclick="window.location.href='www.cnblogs.c ...
- Android Studio如何引用外部Library工程
参考: http://stackoverflow.com/questions/16588064/how-do-i-add-a-library-project-to-the-android-stu ...
- Modbus通讯协议学习 - 串口调试
概述 我们在做任何事情之前都需要获取很多 调试步骤: 1:485转换器连接硬件 2:485转换器上的USB接口连接电脑. 3:打开设备管理器 ->查看端口 4:打开串口调试工具,在串口配置的地方 ...
- 菜鸟教程之工具使用(十四)——Maven项目右击没有“Maven”菜单选项
从Git导入一个Maven项目,右击想更新Maven引用的jar包,却发现右键菜单根本没有“Maven”菜单项.怎么办?很简单,按如下步骤操作即可: 从Git导入后,右击项目没有“Maven”菜单项: ...
- Sql中的Merge和output
先看merge, 不用merge时: --更新 update TA Value ) --插入没有的数据 insert into TA ,,Value from TB ) and TypeName=@v ...
- ffmpeg安装的问题
php语音转换需要安装ffmpeg文件 参考地址: http://thierry-xing.iteye.com/blog/2017864 http://diogomelo.net/blog/11/en ...
- mac 自动配置java版本
首先输入命令:vi .bash_profile ,添加如下内容: # Mac默认 JDK (Mac默认自带了一个jdk6版本) export JAVA_6_HOME=`/usr/libexec/jav ...
- windows 程序设计自学:窗口正中显示Hello,World
#include <windows.h> LRESULT CALLBACK MyWndProc( HWND hwnd, // handle to window UINT uMsg, // ...