WatiN —— Web Application Testing In .Net

为什么会有WatiN?

给用户提供一个.Net平台下,将Web测试自动化的便捷途径。

如何通过WatiN来进行自动化测试的呢?

摆事实,讲道理,乃严谨的科学态度,到底WatiN下的自动化测试如何便捷呢?


代码
        [Test]
        public void SearchForWatiNOnGoogle()
        {
            // 打开IE浏览器,并来到Google站点   
            using (var browser = new IE("http://www.google.com"))
            {
                // 定位到搜索框,并输入WatiN   
                browser.TextField(Find.ByName("q")).TypeText("WatiN");
                // 点击“搜索”按钮   
                browser.Button(Find.ByName("btnG")).Click();
                // 验证搜索结果中是否包含关键字“WatiN”   
                Assert.IsTrue(browser.ContainsText("WatiN"));
            }
        }  

Web自动化测试的起步case,在Google中搜索关键字“WatiN”,并验证,返回结果中存在“WatiN”。

WatiN到底能做些什么?

  • 自动捕获所有主要的HTML元素
  • 通过多种元素属性来寻找,定位网页上的元素
  • 支持对于AJAX实现页面的测试
  • 支持HTML中frame和ifame
  • 支持对于各类弹出对话框的处理(Alert,Confirm,Login,Download等)
  • 支持HTML Dialogs
  • 提供控制模型和页面
  • 能对测试页面进行截图
  • 有简单的,同时也是可扩展的记录日志的机制
  • 易于与其他测试工具整合
  • 支持对于IE 6,7,8和Firefox 2,3下的测试
  • 由C#开发,熟悉C#的用户可以随时完善该测试框架

从哪里可以获取WatiN呢?

可从sourceforge下载最新版的WatiN,普通用户可下载编译好的DLL直接使用,同时,WatiN的源码也对公众开放,有兴趣的用户可任意更新添加自己需要的feature。

WatiN还有其他的相关工具吗?

有,这个真有。

IE下,IE developer toolbar,这是web应用开发也好测试也好,必备良品吧。

Firefox下,Firebug,为人不识Firebug,只用Firefox也枉然。

留到最后的未必是最好的,WatiN Test Recorder,测试代码能写还是自己写吧。这玩意儿抓出来的东西。。实在不是一个丑字能形容的啊。尽管说,不论白老鼠,黑老鼠,能吓退猫的都是牛B的老鼠。但是网页结构一旦复杂了点。自动捕获的就未必是你想要的。

WatiN应用中的一些技巧

1、如何去捕获一个新弹出的窗口。

背景:有些链接是从一个新弹出的窗口中打开的,我如果关连上这类型的窗口。

方案:下面以一个具体例子为例。系统中有一个登陆界面:login.aspx 登陆成功能后会调用JAVASCRIPT的window.open方法打开系统的主窗口,然后关闭当前这个窗login.aspx。

刚开始时,我的代码是这样写的


代码
        public void Login(string uid, string passwd)
        {
            string url = Host + "login.aspx";
            ie = new IE();
            ie.GoTo(url);
            ie.WaitForComplete();
            ie.TextField(Find.ById("txtUserName")).Value = uid;
            ie.TextField(Find.ById("txtPwd")).Value = passwd;
            ie.Button(Find.ById("btnLogin")).Click;//注意这里,我每次执行到这里都出错。下面会说明原因。
            ie = IE.AttachToIE(Find.ByTitle(new WatiN.Core.Comparers.RegexComparer(new System.Text.RegularExpressions.Regex(".*综合信息系统.*"))));
            ie.WaitForComplete();
            MainFrame = ie.Frame(Find.ByName("MainFrame_00001"));
            MenuFrame = ie.Frame(Find.ById("leftMenu"));
        }

看到上面的注译没有?那么执行完后WatiN都会出现一个等待完成超时的异常,这是因为点击了登陆按钮后,如果登陆成功的话,系统已经把这个窗口关闭了,因为它根本不可能完成。呵呵~~```所以要修改一下。


代码
        public void Login(string uid, string passwd)
        {
            string url = Host + "frmlogon.aspx";
            ie = new IE();
            ie.GoTo(url);
            ie.WaitForComplete();
            ie.TextField(Find.ById("txtUserName")).Value = uid;
            ie.TextField(Find.ById("txtPwd")).Value = passwd;
            ie.Button(Find.ById("btnLogin")).ClickNoWait();//这个方法改成这样,那点击后就不会等代码IE完成了。
            //下面这句就是处理登陆的技巧所在,系统打开了另一个窗口。
            //下面这句就是用正则表达式捕获这个窗口。
            ie = IE.AttachToIE(Find.ByTitle(new WatiN.Core.Comparers.RegexComparer(new System.Text.RegularExpressions.Regex(".*综合信息系统.*"))));
            ie.WaitForComplete();
            MainFrame = ie.Frame(Find.ByName("MainFrame_00001"));
            MenuFrame = ie.Frame(Find.ById("leftMenu"));//把系统里的Frame先保存下来。
        }

2、对于alert 、confirm 等javascript弹出的窗口的捕获。

背景:一个系统经常会使用以上这些javascript来弹出一些提示信息,如果捕获这些窗口,并模拟用户点击这些窗口上的OK或Cancel按钮?

方案:其实WatiN在默认情况下,都会自动地去点击这些弹出式窗口上的Cancel按钮的,但如果用户要明确点击哪些事件的话可以对IE对象增加一个“查看器”()


代码
        //错误事例
        protected void f()
        {
            WatiN.Core.DialogHandlers.ConfirmDialogHandler dh = new WatiN.Core.DialogHandlers.ConfirmDialogHandler();             ie.AddDialogHandler(dh);//这句增加了一个控制器
            /**/
            /*
                 假设yzp_dic_btn_cls这个按钮的onclick事件会用JS弹出一个Confirm窗口。
                 错误,测会在这里弹出一个窗口,然后等待用户进行操作(随便点击一个按钮才继续执行)
                 然后因为用户已经点击了按钮关闭 弹出窗口。下一句的dh.WaitUntilExists(3);将会超时,抛出异常 
                 */
            doc.Button(Find.ByName("yzp_dic_btn_cls")).Click();
            dh.WaitUntilExists(3);//等待弹出窗口的出来。最多等三秒。
            dh.OKButton.Click();//点击这个窗口的OK按钮
            ie.RemoveDialogHandler(dh);
            doc.Button(Find.ByName("btn_close")).Click();
        }         //正确的示例应该是:
        protected void f()
        {
            WatiN.Core.DialogHandlers.ConfirmDialogHandler dh = new WatiN.Core.DialogHandlers.ConfirmDialogHandler();             ie.AddDialogHandler(dh);
            doc.Button(Find.ByName("yzp_dic_btn_cls")).ClickNoWait();//把原来的Click改成这个方法。
            dh.WaitUntilExists(3);//等待弹出窗口的出来。最多等三秒。
            dh.OKButton.Click();//点击这个窗口的OK按钮
            ie.RemoveDialogHandler(dh);
            doc.Button(Find.ByName("btn_close")).Click();
        }

3、关于用JS弹出的Modal窗口(模式窗口)的处理.

背景:有些地方需要弹出模式窗口来处理数据。

方解:当点击了弹出模式窗口的按钮或连接后马上用IE对像的HtmlDialogs属生来获取模式窗口。


代码
        protected void f()
        {
            //假设下面这行代码会弹出一个模式窗口把原来的Click改成这个方法。
            //记住这里要用ClickNoWait而不能用Click,否则在模式窗口关闭之前代码不会继续执行。
            ie.Button(Find.ByName("yzp_dic_btn_cls")).ClickNoWait();
            ie.HtmlDialogs[ie.HtmlDialogs.Length - 1].TextField(Find.ByName("Q")).Value = "Hello";
            ie.HtmlDialogs[ie.HtmlDialogs.Length - 1].Button(Find.ByName("btn_query")).Click();
        }

参考资料:WatiN站点(http://watin.sourceforge.net/

初识WatiN的更多相关文章

  1. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  2. 初识Hadoop

    第一部分:              初识Hadoop 一.             谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...

  3. python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)

    一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...

  4. 初识IOS,Label控件的应用。

    初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...

  5. UI篇(初识君面)

    我们的APP要想吸引用户,就要把UI(脸蛋)搞漂亮一点.毕竟好的外貌是增进人际关系的第一步,我们程序员看到一个APP时,第一眼就是看这个软件的功能,不去关心界面是否漂亮,看到好的程序会说"我 ...

  6. Python导出Excel为Lua/Json/Xml实例教程(一):初识Python

    Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...

  7. 初识SpringMvc

    初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ...

  8. 初识redis数据类型

    初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...

  9. Redis初识、设计思想与一些学习资源推荐

    一.Redis简介 1.什么是Redis Redis 是一个开源的使用ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.从2010 年 ...

随机推荐

  1. 详解jQuery的选择器

    1.基本选择器 基本选择器是jQuery中最常用的选择器,也是最简单的选择器,它通过元素id.class和标签名等来查找DOM对象.在网页中,每个id名称只能使用一次,class允许重复使用. ♠ # ...

  2. [JSOI2007]重要的城市(x)

    开始(脑残ing)诶? 暴力能过 噼里啪啦码码码 TLE TLE 啥?看错复杂度?带个25的常数 ?*……!%@……*%#…!@#!@#……*!@#& Floyd,并记录两点间的一个重要的城市 ...

  3. 【动态规划】【记忆化搜索】CODEVS 1010 过河卒 2002年NOIP全国联赛普及组

    f(i,j)=f(i-1,j)+f(i,j-1),显然可以暴力递归求解,但是很多重复的状态,所以可以记忆下来. 注意障碍点和边界的特判. #include<cstdio> #include ...

  4. [HDU6252]Subway Chasing

    题目大意: 一条直线上有n个点,两个人在直线上走,保持x的距离. 告诉你m条信息,告诉你一个人在ab之间时,另一个人在cd之间. 问这些信息是否矛盾,如果不矛盾,求相邻两点之间的最小距离. 思路: m ...

  5. Java高级架构师(一)第09节课:搭建基础的开发环境

  6. [Android 新特性] 有史来最大改变 Android 5.0十大新特性

    距离Android系统上一次重大更新不到一年的时间,谷歌再一次从KitKat升级到了Lollipop,而两次都使用糖果来命名,营销的目的显露无 遗.当我们首次看到Android 5.0 Lollipo ...

  7. RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

    消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...

  8. Vue基础知识总结(一)

    一.基本语法: 1.实例化:new Vue({}) 2.el:一定是根容器元素(vue的作用域就是这个根元素内),就是写选择器  data:用于存储数据      methods:定义方法(方法里th ...

  9. java面试题目

    1.Java中的异常处理机制的简单原理和应用.当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常.违反语义规则包括2种情况.一种是JAVA类库内置的语义检查.例如数 ...

  10. 【HTTPS双向加密认证】

    HTTPS单向认证和双向认证 nearzk-osc 发布时间: 2015/07/30 15:27 阅读: 4177 收藏: 178 点赞: 6 评论: 3 一.背景&概念 HTTPS:在htt ...