专注于自动化测试,性能测试.......

发布新日志

  • 总结的WatiN的资料

    2014-03-08 21:40:02

       好久没有更新博客了,心血来潮的把以前总结的关于WatiN的资料上传。好久没玩这个了,估计以后也不会玩了,算是告别吧,呵呵。
  • 学习WatiN源代码之前做的一些准备

    2011-12-15 17:13:26

    近日完成了基于Selenium2的自动化测试框架KDATFFS v1.0的开发,虽有不尽人意之处,不过也确实在工作中运行良好,也修复和改进了一些bug。对2.0的一些新功能和应用也有了一些新的想法和计划,但也都想好好的沉淀一段时间,对KDATFFS整体的框架做更为合理的设计和重构。
     
    其实对WatiN这个工具一直是比较关注的,之前也写过WatiN使用的系列文章。记得几年前就研究过WatiN的源代码,那时还是WatiN 1.*,看的颇为吃力,大家都清楚看别人的代码是一件非常吃力不讨好的事情,尤其是开源项目,没有现成的概要,设计文档供你参考,当时就中途放弃了。现在 却又重新提起了兴趣,毕竟这么经典的开源项目,错过了确实可惜。
     
    那么在学习WatiN源代码之前,还是要做些准备工作的,主要是C#语言的一些新特性的使用的相关知识的学习,还有就是代码分析工具的使用。
      
    粗略的概览了一下WatiN的源代码,关于C#语言的需要增强学习的大概有:
      1.
    特性编程
      2.
    泛型编程
      3.
    委托,Lambda表达式
      4. Win32
    一些API的编程
      5. Interop.SHDocVw
    Microsoft.mshtml程序集
     
    辅助工具:
      AQtime
      
    好了,就记录这些,放在这里备忘,有遗漏以后再补充。

  • WatiN系列之七 WatiN与Gaillo有个约会(原创)

    2011-11-16 12:12:11

    WatiN与Gaillo有个约会

    本文为作者原创,如需转载请声明作者及出处。

      又有大半年的时间没有来更新51Testing的博客了,开博已经4年多了时间了,博客的文章也就50多篇,实在是少的可怜。其实心中有很多的内容想写,想分享,可一贯的惰性使然,也就成了现在这样了。这大半年的时间,工作生活一如既往的平淡,动车脱轨了,日本地震了,物价上涨了,而作为IT人依然平淡的活着,为加薪高兴,为房子发愁,为孩子操心….. 生活就是如此吧。好了,发了一通的感慨,言归正传,之前我写了一个关于WatiN的系列文章,介绍了WatiN一些使用的基本知识和应用。我在一些项目中也会应用WatiN,感觉这个工具还是不错的,但是要灵活,方便的使用它越是也要花些心思。之前说过,它结合NunitVSTS单元测试工具一起使用,可以增加它的易用性,但总是觉得力有未逮,直到我遇到了Gallio,一切问题都迎刃而解。

     有人要问Gallio是什么?官方的说法是“Gallio自动化测试平台是一个开放、可扩展的中间平台,为 .NET 提供一个通用的测试用的对象模型、运行时服务和工具”。好的,我们注意到了,它是一个自动化测试平台,确切的来说它是一个开放式的单元测试平台,它支持众多的.NET单元测试工具,比如Nunit,CsunitMbunit等等。现在Gallio已经整合了自家的单元测试工具Mbnuit,这同样是一款非常优秀的单元测试工具,具有很多NUnit,MSunit不具备的超强功能,以后我会提到。为什么要选择GallioMbunit呢?这是有原因滴。

      VSTS的单元测试必须依赖Visual Studio这个IDE,运行起来太麻烦,日志功能也薄弱

      Nunit运行起来方便,但是同样的,日志输出不给力,过于简陋,工具功能也太简单。

      Gallio就不一样了,它具有一个非常优秀的Icarus GUI Test Runner工具,也具有一个命令行的工具(有了它,可以进行无人值守的计划任务测试)。而与它配套的Mbunit同样是一款优秀的单元测试工具,除了一般单元测试功能外,它还提供了多种数据源的数据驱动测试功能,日志输出功能,截图和视频功能等等。

     

    下面我们就跟根据一个实例来讲解一下Gallio+WatiN的使用。

    1)首先安装Gallio,可以到Gallio的官方网站下载: http://www.gallio.org/Downloads.aspx

    2)在Visual Studio建立一个类库项目,这里命名“WatiNAndGallio”,然后添加一个类,这里命名“SearchBaidu,添加对于WatiN,Gallio的引用,Gallio直接在添加引用的弹出框中的.NET中找即可。如图

    3)再添加一个类,命名为“BrowserHelper”,这个类里定义了方法,用于截图。

    4)在“SearchBaidu”中编写测试代码,代码如下:

    using System;

    using System.Collections.Generic;

    using System.Text;

    using MbUnit.Framework;

    using MbUnit;

    using Gallio.Framework;

    using Gallio.Framework.Data;

    using WatiN.Core;

    namespace WatiNAndGallio

    {

        [TestFixture]

        public class SearchBaidu

        {

            BrowserHelper bh = new BrowserHelper();

            //使用CsvData数据驱动,Gallio中还包含其他类型的数据驱动,详细参考Gallio的帮助文档

            //Test:不用说了吧,用于标识测试的属性

            //Order:可选,用户表示执行测试的顺序

            //FilePath:文件路径

            //HasHeader:是否有列名行

            [Test(Order = 1), CsvData(FilePath = @"D:\\OpenSource\\WatiNAndGallio\\Data.csv", HasHeader = true)]

            public void SearchSomeThing(string url,string someThing)

            {

     //使用自定义的BrowserHelperConfigureWatiNSettings方法,WatiN的动作进行跟踪,在Log可以看到

                bh.ConfigureWatiNSettings();

                IE ie = new IE(url);

                ie.TextField(Find.ById("kw")).TypeText(someThing);

                ie.Button(Find.ById("su")).Click();

           //输出日志,TestLog类中有很多的方法用于输出不同类型的日志,详细可以参考Gallio的帮助文档

                TestLog.WriteLine(string.Format("完成了\"{0}\"的搜索",someThing));

    //使用自定义的BrowserHelperEmbedBrowserSnapshot方法,对浏览器内的内容进行截图,在Log可以看到

                bh.EmbedBrowserSnapshot(someThing,ie);

            }

        }

    }

    5) 对这个类型进行编译后,打开GallioIcarus GUI Test Runner工具,加载编译的这个DLL,如图

     

    它是按照在Visual Studio中的目录结构进行显示的,最底层的一级就是Test,你可以勾选以用来选择你希望运行的测试。

     

    6)这时,我们就可以点击Start,运行测试了,运行后会自动显示日志和测试结果,报告统计和写的很详细,更好的是这些报告可以导出多种格式,如图

    测试结果

    测试执行日志

     

     

    就这样,一个测试就完成了,其实步骤和原理与NUnit,VSTS都是差不多了的,只不过Gallio提供了一些更为人性化的强大功能。

     在本文的最后的附件里有这个事例的源代码,有兴趣的可以下载下来研究一下。由于大小的原因,引用的WatiN,Gallio类库都被删除了,需要自己重新引用。

    WatiNAndGallio.rar(16.9 KB)

  • WatiN自定义TextField对象

    2011-02-16 09:20:24

      今天遇到一个问题,Watin在运行过程中定位一个日期输入框时,无法找到该控件。报错信息为“ Could not find INPUT (hidden) or INPUT (password) or INPUT (text) or INPUT (textarea) or TEXTAREA element tag matching criteria”。

      该控件的Html代码为“<input type="calendar" mod_calendar_rangestart="#" mod_notice_tip="mm-dd-yyyy" mod="notice|calendar" name="depart_date" id="depart_date" class="pubglobal_input pubglobal_inputfix" style="color: gray;" autocomplete="off">”。经过查找原因,发现该控件的Type属性为自定义的“calendar”,而致使Watin无法查找到该控件。这样的话只能通过自定义一个calendar类,来继承TextField类来扩展发现该控件。具体做法如下:

    1.创建一个自定义的类,这里比如创建calendar类,继承于TextField类,代码如下:

     [ElementTag("input", InputType = "calendar", Index = 2)]
         public class calendar:TextField
        {
            public   calendar(DomContainer domContainer, ElementFinder finder):base( domContainer,  finder)
            { }
            public calendar(DomContainer domContainer, INativeElement element)
                : base(domContainer, element)
            { }

    2.然后就可以在测试代码中编写代码来定位到该类型的控件,代码如下:

      var depart_date = ie.ElementOfType<calendar>("depart_date");
                depart_date.TypeText("Feb-15-2011");

    这样就可以查找并定位到该控件了。这仅仅是针对“type=‘calendar’”类型的控件,同理如果type类型为别的类型也是通过类似的方法实现。

     

  • Watin系列之六 Watin与Httpwatch工具结合进行测试

    2010-09-14 23:41:01

    概述

       Httpwatch是一款强大的网页数据分析工具,安装后集成在IEFirefox工具栏中。它可以在不改变浏览器和网络设置的基础上捕捉HttpHttps数据。查看底层的HTTP数据,包括headers,cookies,cache等等,同时统计发送接收请求的时间,并提供完备的日志记录系统。同时该款工具具有完备的COM接口,用于给用户通过编程的方式操纵httpwatch

    Httpwatch自动化对象介绍

     Httpwatch自动化对象的结构如下:

    Controller

      Controller类总是控制的起点,它用于创建Httpwatch插件接口或者读取log文件,通过IE属性和Firefox属性的new()方法或者Attch()方法返回Plugin实例对象

    Plugin

      Plugin类是Httpwatch与浏览器交互的接口。它提供了方法用于开始和停止http流量的记录。还有很多方法和属性用于管理Httpwatch的日志文件和配置自动化记录。

    Log

      Plugin对象的Log属性是Log对象的入口。它包含了一系列通过Httpwatch记录的日志。Log对象中具有很多重要的类,比如Pages,Entries类。

     

    Entry

    每个Log对象都包含一组Entry对象,它代表的是单个HTTP事务的详情。(比如http请求)

    后面我们会通过实例来进一步说明该类的方法和属性。

     

    通过把WatinHttpwatch结合进行自动化测试,可以很大程度的扩展自动化测试的范围,比如在自动化测试过程中验证链接的连通性,网页传输的速率和时间,查看网页的详细信息等等。


    使用C#操作Httpwatch

      使用C#操纵httpwatch大致分为以下几个步骤:

    1)  添加HTTPwath 自动化类库到你的项目中

    2)  创建与Httpwatch工具的联系

    创建新的IE接口

    HttpWatch.Controller controller = new HttpWatch.Controller();

    HttpWatch.Plugin plugin = controller.IE.New();

    创建新的Firefox接口

    HttpWatch.Controller controller = new HttpWatch.Controller();

    HttpWatch.Plugin plugin = controller.Firefox.New("");

    附加一个已存在的IE窗口

    SHDocVw.IWebBrowser2 ieBrowser = new SHDocVw.InternetExplorer();

    ieBrowser.Visible = true;    // Required to see the new window

     . . .

    HttpWatch.Controller controller = new HttpWatch.Controller();

    HttpWatch.Plugin plugin = controller.IE.Attach(ieBrowser);

    附加一个已存在的Firefox窗口

    HttpWatch.Controller controller = new HttpWatch.Controller();

    HttpWatch.Plugin plugin = controller.Firefox.Attach("FirefoxProfileName");

     

    3)  通过接口读取HTTP详细信息

    plugin.Log.Save("E:\\baidu.hwl");

    foreach (HttpWatch.Page page in plugin.Log.Pages)

    {

    Console.WriteLine(page.Title);//输出网页的标题

    }

     

    WatinHttpwatch结合

      我们依然以访问百度网站为例,并进行查询操作.最后输出访问过程中HTTP请求各个资源的时间和状态。我们可以加入判断,判断哪些请求的状态有异常,哪些请求的时间过长。(请使用IE6,IE7好像有些问题)具体代码如下:

     

     using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using WatiN.Core;

    namespace ConsoleApplication1
    {
        class Program
        {
            [STAThread]
            static void Main(string[] args)
            {
                //新建IE实例
                IE ie = new IE();
                //建立Httpwatch控制类
                HttpWatch.Controller controller = new HttpWatch.Controller();
                //将ie实例附加到Httpwatch接口,从而使Watin和httpwatch与同一IE建立关联
                HttpWatch.Plugin plugin = controller.IE.Attach((SHDocVw.IWebBrowser2)ie.InternetExplorer);
                //Httpwatch开始记录
                plugin.Clear();
                plugin.Record();
                //导航到百度
                ie.GoTo("www.baidu.com");
                //搜索“watin”
                ie.TextField(Find.ById("kw")).TypeText("Watin");
                ie.Button(Find.ById("su")).Click();
                //停止httpwatch记录
                plugin.Stop();
                //创建Log实例
                HttpWatch.Log log = plugin.Log;
                //输出请求异常的url
                Console.WriteLine("请求异常的地址:");
                foreach (HttpWatch.Page page in log.Pages)
                {
                   
                    Console.WriteLine("------------"+page.Title+"--------------");
                    foreach (HttpWatch.Entry entry in page.Entries)
                    {
                        if (entry.Result != "200" & entry.Result != "(Cache)")
                        {
                            Console.WriteLine(entry.URL + " : " + entry.Result);
                        }
                    }
                   
                }
                Console.WriteLine("\r\n\r\n");
                //输出请求超过0.1s的url
                Console.WriteLine("请求超过0.1s的地址:");
                foreach (HttpWatch.Page page in log.Pages)
                {
                   
                    Console.WriteLine("------------" + page.Title + "--------------");
                    foreach (HttpWatch.Entry entry in page.Entries)
                    {
                        if (entry.Time > 0.1)
                        {
                            Console.WriteLine(entry.URL + " : " + entry.Time + "s");
                        }
                    }
                }

                Console.ReadLine();
            }
        }
    }

    结果显示如下:

     

    结束语

     我在本篇文章中只是列举了httpwatch的一些简单应用,有对http信息分析有更深入需求的可以参考HttpWatch Automation Reference ,进一步了解httpwatch的自动化对象。

     

    资源及资源

    1.       Httpwatch官网

    2.       Using HttpWatch with WatiN

  • WatiN系列之五 Watin与Nunit结合进行测试

    2010-09-12 10:12:37

    概述

      上篇文章中介绍了在VSTS中如何使用watin。本篇文章介绍如何在NUnit中使用Watin

    Nunit作为一款老牌的单元测试工具,在开发人员中得到广泛的应用。

     

    准备工作

      在开始介绍如何在Nunit中使用Watin之前,需要做一些准备工作。

    l  下载及安装NUnit

    l  创建演示Web程序

    l  创建及配置测试程序

      下载及安装Nunit

        NUnit官方站点下载Window Installer

      创建演示Web程序

    我们将创建一个ASP.NET网站,接下来的测试代码将是针对这个简单Web站点的。先创建一个新项目。

    接下来在解决方案中创建业务逻辑层的类库BusinessLayer,其中添加一个类Arithmetic,用于一些算术操作。

    创建及配置测试程序

    然后在解决方案中创建一个新的类库WebAppUITesting,这个就是测试程序。

    在类库WebAppUITesting中添加应用配置文件App.config,内容如下:

    <?xml version="1.0" encoding="utf-8" ?>

    <configuration>

      <configSections>

        <sectionGroup name="NUnit">

          <section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>

        </sectionGroup>

      </configSections>

      <NUnit>

        <TestRunner>

          <!-- Valid values are STA,MTA. Others ignored. -->

          <add key="ApartmentState" value="STA" />

        </TestRunner>

      </NUnit>

    </configuration>

     备注:Watin只能在STA下运行,Nunit确是在MTA下运行的。所以直接在Nunit中运行watin代码会报错,所以为了解决这个问题,在测试程序中加入App.config配置文件可以解决这个问题。

     

    在类库WebAppUITesting中添加引用

    然后右键点击该类库,在右键菜单中选择“属性”,在属性->调试面板中,“启动外部程序”设置为Nunit.exe。这样在调试代码后会自动打开Nunit

    最后解决方案的目录结构如下:

    编写测试程序,运行测试

     准备工作完成之后,把生成的被测试演示Web程序(WebApp)部署到IIS中,当然你也可以使用VS中自带的web服务器。Web页如下

     这个站点的功能很简单,就是输入两个数字,然后提交后返回相加的结果。

    然后我们就可以编写针对这个站点功能的测试代码了。我们主要编写测试用例。

     用例一 输入两个数字,验证加法是否正确

    用例二 输入非数字字符,验证异常处理是否正确

    测试代码如下:

    using System.Diagnostics;

    using WatiN.Core;

    using NUnit.Framework;

    using System;

    using BusinessLayer;

    namespace WebAppUITesting

    {

        [TestFixture]

        public class UITesting

        {

            IE ie=null;

            [TestFixtureSetUp]

            public void InitTest()

            {

                ie = new IE("http://localhost/WebApp/Default.aspx");

            }

            //测试加法

            [Test]

            public void AdditionTest()

            {

                    int number1 = 1;

                    int number2 = 2;

                    //Watin测试代码

                    ie.ShowWindow(NativeMethods.WindowShowStyle.Maximize); 

                    ie.TextField(Find.ById("num1")).TypeText(number1.ToString());

                    ie.TextField(Find.ById("num2")).TypeText(number2.ToString());

                    ie.Button(Find.ById("btnCheck")).Click();                              

                    //预期结果

                    Arithmetic ac = new Arithmetic();

                    string expected =  ac.addition(number1,number2).ToString();

                    //实际结果

                    string actual = ie.Span(Find.ById("lblResult")).Text;

                    //断言测试结果是否正确

                    Assert.AreEqual(expected,actual);        

            }

            //测试异常处理

            [Test]

            public void ExceptionTest()

            {

                //Watin测试代码

                ie.TextField(Find.ById("num1")).TypeText("A");

                ie.TextField(Find.ById("num2")).TypeText("1");

                ie.Button(Find.ById("btnCheck")).Click();

                //预期结果

                string expected = "输入字符格式不正确!";

                //实际结果

                string actual = ie.Span(Find.ById("lblResult")).Text;

                //断言测试结果是否正确

                Assert.AreEqual(expected, actual);

            }

            [TestFixtureTearDown]

            public void ClearTest()

            {

                ie.Close();

            }

        }

    }

     

    测试结果如下:

    结束语

      Nunit中使用Watin测试思路就是这样的。如果有兴趣的话可以自己动手试试看,这是学习的最佳途径。也可以下载附件中的代码进行学习。

  • Watin系列之四 Watin与VSTS单元测试工具结合

    2010-09-10 17:20:30

       概述

    Watin是做一个UI自动化测试工具进行开发的而非单元测试工具。但并不意味着单元测试中不可以使用Watin。有时候作为纯粹单元测试的补充,适当的UI测试也是必要的。在VSTS单元测试工具和Watin结合使用具有很多。

    1)   VSTS测试工具提供了良好的运行和结果查看工具以及其它强大的功能

    2)   MSunit具有丰富的断言语句进行结果判断

    3)   可以在单元测试代码中穿插VSTS web测试代码,以丰富WatinUI测试

    4)  Watin进行UI测试可以使单元测试更直观易懂。

     

      VSTS中使用Watin的大体步骤

    1)       VSTS中创建测试项目,然后创建单元测试

    2)       测试项目中引用WatiN.core,创建StaticBrowserInstanceHelper

    3)       编写测试代码,加入断言

    4)       运行测试,查看测试结果

        如何创建测试项目,如何创建单元测试这里就不赘述了,下面从第2步骤讲起。

     

      为何使用StaticBrowserInstanceHelper

       在第二步骤中创建了StaticBrowserInstanceHelper类(该类代码在附件中)。创建这个类没有别的目的,就是解决一个在VSTS中运行watin会出现的一个问题。按照平常思路,我们直接创建单元测试,在其中编写测试代码,如下:

            //定义静态IE对象

            private static IE ie;

            //单元测试初始化

            [ClassInitialize]

            public static void testInit(TestContext testContext)

            {

                ie = new IE("http://baidu.com");

            }

    [TestMethod]

    [TestMethod]

    ………

    使用上述编写代码思路是对的,但是会出现一个问题(Watin本身的问题),运行第一个测试方法可以通过,其他测试方法均为失败。大家可以自己试一下,确实是这样。所以Watin开发人员给出了解决方案是编写一个StaticBrowserInstanceHelper类用于解决这个问题。你在编写初始化代码时,就可以这样写

     

           static StaticBrowserInstanceHelper<IE> ieStaticInstanceHelper;

            [ClassInitialize]

            public static void testInit(TestContext testContext)

            {

                ieStaticInstanceHelper = new StaticBrowserInstanceHelper<IE>();

                ieStaticInstanceHelper.Browser = new IE("http://baidu.com");

            }

            public IE IE

            {

                get { return (IE)ieStaticInstanceHelper.Browser; }

                set { ieStaticInstanceHelper.Browser = value; }

            }

            [ClassCleanup]

            public static void MyClassCleanup()

            {

                ieStaticInstanceHelper.Browser.Close();

                ieStaticInstanceHelper = null;

    }

    [TestMethod]

    [TestMethod]

     

    编写测试代码,加入断言

     单元测试初始化准备代码编写之后,就可以编写测试方法了。以百度页面为例来演示测试代码编写。

      验证页面是否存在指定文本文字

            [TestMethod]

            public void testOne()

            {    //页面是否包含“百科”文字

                Assert.IsTrue(IE.ContainsText("百科"));

    }

     验证页面中指定元素的Value是否正确

            [TestMethod]

            public void testThree()

            {

                Assert.AreEqual("MP3", IE.Link(Find.ByUrl("http://mp3.baidu.com/")).Text);

    }

     

    运行测试,查看测试结果

    在测试列表编辑器中运行单元测试

     

    勾选需要测试的测试方法后,右键菜单中选择“运行选择的测试”进行测试。然后开始运行测试。测试运行结果后,会在“测试结果”面板中列出测试结果,如下

    双击每项测试结果可以查看测试详细信息。

     

    至此,在VSTS测试中使用Watin的整个过程就是这样。限于篇幅限制,只能对大体的过程做些简单的介绍。

     

  • WatiN系列之三 Watin如何处理Web页面弹出窗口,对话框,提示框

    2010-09-09 18:10:26

    WatinWeb页面弹出窗口,对话框,提示框的处理

     

    处理弹出窗口

      首先创建一个web页,用于演示弹出窗口。

     

    <input id="Button1" type="button" value="button" onclick ="openwindow()" />

        <script type ="text/javascript">

        function openwindow()

          {

              window.open("http://localhost/Test/test2.htm");

          }

        </script>

    上述代码,点击“Button1”后,弹出窗口test2.htm.我们要做的是如何处理test2.htm页面

    Watin处理代码如下:

    IE ie = new IE("http://localhost/Test/");

    //点击按钮,打开新窗口test2

    ie.Button(Find.ById("Button1")).Click();

    //查找新窗口test2并赋给新的IE对象

    IE newie = IE.AttachTo<IE>(Find.ByTitle("test2"));

    //使用新的IE对象就可以继续对新窗口进行操作了

    newie.TextField(Find.ById("Text1")).TypeText("this is new ie");

     

     

      处理confirm弹出框

      首先创建一个web页,用于演示confirm对话框。

    <input id="myButton1" type="button" value="this is a button"

          onclick="confirmMe(); return false;"><br>

        <script>

          function confirmMe() {

            var answer = confirm ("Are you having fun?")

            if (answer)

              document.getElementById("myButton1").value="Clicked OK";

            else

              document.getElementById("myButton1").value="Clicked Cancel";

          }

        </script>

     

    相应的Watin测试代码如下:

     

    IE ie = new IE("http://localhost/Test/");

    //创建一个ConfirmDialogHandler对象

    ConfirmDialogHandler cdh = new ConfirmDialogHandler();

    //ConfirmDialogHandler对象与ie建立关联

    ie.AddDialogHandler(cdh);

    //点击按钮,这里需要注意的是:使用的是ClickNoWait()方法

    ie.Button(Find.ById("myButton1")).ClickNoWait();

    //等待Confirm对话框出现

    cdh.WaitUntilExists();

    //点击Confirm对话框的OK按钮

    cdh.OKButton.Click();

    ie.WaitForComplete();

    //ConfirmDialogHandler对象与ie取消关联

    ie.RemoveDialogHandler(cdh);

    Console.WriteLine(ie.Button(Find.ById("myButton1")).Value);

    Console.ReadLine();

     

    处理Alert弹出框

    首先创建一个web页,用于演示Alert对话框。

    <input id="myButton2" type="button" value="this is a button2"

          onclick="alertMe(); return false;"><br/>

        <script>

          function alertMe() {

            var answer = alert("this is a alert dialog");

            if(answer)

              document.getElementById("myButton2").value="Clicked OK";

          }

        </script>

     

    相应的Watin测试代码如下:

    IE ie = new IE("http://localhost/Test/");

    //创建一个AlertDialogHandler对象

    AlertDialogHandler adh = new AlertDialogHandler();

    //ConfirmDialogHandler对象与ie建立关联

    ie.AddDialogHandler(adh);

    //点击按钮,这里需要注意的是:使用的是ClickNoWait()方法

    ie.Button(Find.ById("myButton2")).ClickNoWait();

    //等待Alert对话框出现

    adh.WaitUntilExists();

    //点击Alert对话框的OK按钮

    adh.OKButton.Click();

    ie.WaitForComplete();

    //AlertDialogHandler对象与ie取消关联

    ie.RemoveDialogHandler(adh);

    Console.WriteLine(ie.Button(Find.ById("myButton2")).Value);

    Console.ReadLine();

     

    处理Fileupload弹出框

    首先创建一个web页,用于演示Fileupload对话框。

    <input id="File1" type="file" /></p>

    相应的Watin测试代码如下:

                IE ie = new IE("http://localhost/Test/test2.htm");

                //打开文件对话框并加载指定文件

                ie.FileUpload(Find.ById("File1")).Set(@"D:\Data.txt");

     

  • WatiN系列之二 解析Watin

    2010-09-09 18:00:32

     概述

    Watin作为一个自动化测试库,具有轻便,灵活的特点。而这都建立在对复杂操作封装的基础之上。Watin的原理和其它web自动化测试工具基本类似,就是通过操纵浏览器和web页面中的DOM对象来实现模拟用户操作网页。Watin封装了复杂的DOM操作并提供了大量的扩展,使对web网页的操作更灵活,更简便。本篇文章并不能做到深入解析Watin具体的原理,内部架构,也没必要去深究。我们要做的就是以使用者的角度去分析如何使用watin并不断在工作中完善。

     

    HTML元素与Watin类的映射

       在介绍watin类和方法用途之前,大家最好对HTML元素与watin类的映射关系进行一个大体的了解。因为你在编写测试代码之前,首先是通过工具查看web页面中元素的信息,确定该元素的类型时候,通过映射关系才能确定使用watin中的哪个类。所以这个映射关系很重要。

     

    详细的映射关系,请查看映射表

     

    Web页面常用元素操作

       介绍Watin如何对web页面中常见的一些元素进行操作。以及watin相关类和方法的介绍。在详细说明之前,首先创建一个页面,其中加入常用的页面元素(比如inpu,label),用来演示测试代码。具体代码见附件。

       然后再介绍一下,在编写测试代码过程中常用的类和主要的方法。

    Watin中常用的类和方法

       IE:最基础,最重要的一个类,用于访问Web页面中的元素以及操纵IE浏览器。

    Goto( string): 导航到某个地址的网页。

    Close() :关闭浏览器

    ContainsText(String): 是否包含指定的文本文字

    CaptureWebPageToFile(string): 对当前web页截图并保存到指定位置

    ClearCache(): 清除Cache

    ClearCookie(): 清除Cookie

    ……… 

     Find:也是必须用到的一个类,用于查找并定位web页面中的元素。

    Byid() : 通过元素的id属性进行查找

    Byname():通过元素的name属性进行查找

    ………

     其它类和方法请详见 MSDN style. online documentation  

     Watin对常用页面元素的操作

    <A>元素

     

     <a>标签对应DOM中的Anchor对象。表示Html中的超链接。

    <a id ="baidu" href = "http://wwww.baidu.com">百度</a>

    Watin操作<a>元素的代码如下

    ie.Link(Find.Byid("baidu")).Text; //返回超链接文字

    ie.Link(Find.Byid("baidu")).Url; //返回超链接的Url

    ie.Link(Find.Byid("baidu")).Click();//点击超链接

    备注:有些开发不规范的web页,有可能只有href属性存在的现象,这时只有通过Find.ByUrlurl)进行查找。

     

    <input type="text"> 元素

     <input type="text">元素对应HTML DOM中的 Text对象。表示一个单行的标准输入框。

    <input id="Text1" type="text" />欢迎!</p>

    Watin操作<a>元素的代码如下

    ie.TextField (Find.Byid("Text1")).Value; //返回输入框中的文字

    ie.TextField (Find.Byid("Text1")).TypeText("Watin"); //输入框中输入Watin

     

     

    <input type="button">元素

    <input type="button">元素对应HTML DOM中的 Button对象。表示一个按钮

    <input id="btn" type="button" />登录</p>

    Watin操作<a>元素的代码如下

    Ie.Button (Find.Byid("btn")).Text; //返回按钮中的文字

    ie.Button (Find.Byid("btn")).Click(); //点击按钮

     

     

    <input type="checkbox">元素

    <input type="Checkbox">元素对应HTML DOM中的 Checkbox对象。表示一个选择框

    <input id="chk" type="checkbox" />勾选</p>

    Watin操作<a>元素的代码如下

    Ie.CheckBox (Find.Byid("chk ")).Text; //返回选择框的文字

    ie.CheckBox (Find.Byid("chk ")).Click(); //点击选择框

    ie.CheckBox (Find.ById("chk ")).Checked = true; //设置Checkbox的勾选状态

     

    <area>元素

    <area>标签对应HTML DOM中的area对象。表示图像映射的一个区域(图像映射指的是带有可点击区域的图像)

    <img src="map/map.jpg" alt="校区地图" width="1004" height="601" border="0" usemap="#Map" />

    <map name="Map" id="Map">

    <area  shape="rect" alt ="a1" coords="134,59,255,92" href="edushiMap.html"  />

    <area shape="rect" alt ="a2" coords="345,122,464,160" href="edushiMap.html" />

    </map>

     

    Watin操作<area>元素的代码如下

    ie.Area(Find.ByAlt("a1")).Url; //返回area区域的url

    ie.Area(Find.ById("area1")).Click();//点击area区域

    ie.Area(Find.ByAlt("a1")).Click();//点击area区域

     

    <Select>元素

    <Select>元素对应HTML DOM中的 Select对象。表示一个下拉列表

    <select id="Select1">

        <option>1</option>

        <option>2</option>

    </select>

    Watin操作<Select>元素的代码如下

    ie.SelectList(Find.ById("Select1")).Select(string); //返回选择框的某项

     

     

    <table>元素

    <table>元素对应HTML DOM中的 table对象。表示一个表格

    <table style="width: 100%;" id ="table1"  class = "class1">

        <tr>

            <td class="style1">

                第1行第1列</td>

            <td class="style1">

                &nbsp;

                第1行第2列</td>

        </tr>

        <tr>

            <td>

                第2行第1列</td>

            <td>

                &nbsp;

                第2行第2列</td>

        </tr>

        </table>

    Watin操作<table>元素的代码如下

    ie.Table(Find.ByClass("class1")).TableRows[0].TableCells[1].Text; //返回表格中项的数据

     

  • WatiN系列之一 初识Watin

    2010-09-09 10:41:19

    简介

    WatiN是一个开源的用于Web测试自动化的类库,从watir中获得的灵感,使用C#开发。WatiN通过与浏览器的交互来实现自动化,使用起来具有轻便,简单的特点。目前最新版本为2.0,加入了对Firefox的支持,使其功能更趋于完善和多样。

      在具体介绍如何使用WatiN之前,要先了解一下WatiN.Core这个类库下主要的命名空间。

    WatiN.Core: Watin的核心部分,与浏览器的交互都包含在此模块中。

    WatiN.Core.DialogHandlers:该命名空间提供用于操作浏览器对话框的对象。其中包括AlertDialogHandler, ConfirmDialogHandler, FileUploadDialogHandler, PrintDialogHandler, and LogonDialogHandler

    WatiN.Core.Exceptions:该命名空间里的对象用于处理各种异常,比如: ElementNotFoundException, IENotFoundException, TimeoutException, and a generic WatiNException

    开始

      我们先以一个简单的示例为例来介绍说明Watin是如何与浏览器交互,watin有哪些主要的部分组成的。

      在介绍这个示例之前,大家需要到Watin官网上下载Watin。同时,为了更好的协助你的工作,你需要下载安装IE Developer Toolbar,用来查看网页的元素信息。

      下面是一段Watin代码, 效果是打开百度网页,然后在搜索 “Watin”,最后返回搜索结果。

    我们编写Watin代码一般使用Vistual Studio作为IDE,在建立一个项目后,要把之前下载的Watin.Core.dll引用到项目中,并在代码之前加“using WatiN.Core”。

     

     具体代码如下:

     

                //实例化IE类,可以把实例化的ie看成是页面,以后的操作基本都是它打交道

                IE ie = new IE("http://www.baidu.com/");

                //找到搜索输入框,并输入“Watin”

                ie.TextField(Find.ById("kw")).TypeText("Watin");

                //找到搜索按钮并点击

                ie.Button(Find.ById("su")).Click();

                //查询结果中找到搜索的相关信息

                string result = ie.Table(Find.ByClass("bi")).TableRows[0].TableCells[1].Text;

                //打印搜索信息

    Console.WriteLine(result);

                Console.ReadLine();

    上段代码大体的作用应该比较清楚了,其中具体的类和方法的用法将会在下一章中介绍。

     

    资料及资源:

    资料:

    资源:

     

Open Toolbar