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 ...
随机推荐
- [转]Java Spring的Ioc控制反转Java反射原理
转自:http://www.kokojia.com/article/12598.html 学习一个东西的时候,如果想弄明白,最好想想框架内部是如何实现的,如果是我做我会怎么实现.下面我就写一个Ioc ...
- JavaScript学习汇总
对于JavaScript,还是无法割舍,有心无力,时间总是匆匆,暂且都放在这里吧 javascript中this的使用 写的很不错的一偏文章,简单看了下,mark了吧 原文:http://davids ...
- 【转载】UEditor前端配置项说明
UEditor 的配置项分为两类:前端配置项 和 后端配置项 后端配置项具体看这个文档L:后端配置项说明 本文档介绍如何通过设置前端配置项,定制编辑器的特性,配置方法主要通过修改ueditor.con ...
- php中抓取网页内容的代码
方法一: 使用file_get_contents方法实现 $url = "http://news.sina.com.cn/c/nd/2016-10-23/doc-ifxwztru695114 ...
- 将自己写的windows服务加入到windows集群中
最近发现windows集群能进行很多自定义,比如在集群中加入自己编写的服务. 能自定义的可不少,截个图: 本次演示中,只想用“通用服务”这个类型. 先列下步骤 编写一个记录时间的Windows服务,这 ...
- Splunk - 如何在WebFramework之CORS模式下你的网站和splunk web进行交互
1. 修改配置文件以支持CORS 进入/Applications/Splunk/etc/system/local 修改server.conf 在最后加入如下: [httpServer]crossOri ...
- 用ASP.NET Core 1.0中实现邮件发送功能-阿里云邮件推送篇
在上篇中用MailKit实现了Asp.net core 邮件发送功能,但一直未解决阿里云邮件推送问题,提交工单一开始的回复不尽如人意,比如您的网络问题,您的用户名密码不正确等,但继续沟通下阿里云客户还 ...
- 有时候为了方便sql语句的对比和查询,我们可以使用declare来定义变量 上下篇的问题
--定义一些参数 declare @nodeId int,@ekid int ,@ecid int,@eid int,@pid int --列表 SELECT * FROM ( SELECT *,RO ...
- Javascript sleep 函数
此函数仅适合在10秒内 sleep(5) 超过10秒CPU 会吃不消 <script type="text/javascript"> function sleep(se ...
- EF Repository Update
问题描述: 解决办法: http://www.cnblogs.com/scy251147/p/3688844.html 原理: Attaching an entity of type '' faile ...