zoukankan      html  css  js  c++  java
  • 初识WatiN

    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/

  • 相关阅读:
    Rsa加密类
    Des加密类
    AES对称加密解密类
    用字符串生成二维码
    ViedoUtil获取视频的缩略图
    UmUtils得到友盟的渠道号
    UiUtils
    StringUtils
    ShockUtil振动工具类
    SHA加密
  • 原文地址:https://www.cnblogs.com/wangchuang/p/3610408.html
Copyright © 2011-2022 走看看