WatiN自动化测试

系统 1908 0

 

简介

WatiN - Watir .NET 版:

http://watin.sourceforge.net/

Welcome at the WatiN (pronounced as What-in) website . Inspired   by Watir development of WatiN started in December 2005 to make a similar kind of Web Application Testing possible for the .Net languages. Since then WatiN has grown into an easy to use, feature rich and stable framework. WatiN is developed in C# and aims to bring you an easy way to automate your tests with Internet Explorer and FireFox using .Net.

 

目前最新版本: WatiN 2.0 RC 1

http://watin.sourceforge.net/releasenotes-2-0-20-1089.html

 

支持的测试环境:

 

Windows XP

Windows Vista

Windows 2003

Windows 2008

IE 6

OK

-

-

-

IE 7

OK

-

-

OK

IE 8

OK

-

-

-

Firefox 2

OK

-

-

-

Firefox 3

OK

-

-

OK

 

 

WatiN  的脚本录制器 - WatiN Test Recorder

http://watintestrecord.sourceforge.net/  

 

2.0 beta 版本需要 IE7 以上

 

WatiN vs. Selenium RC

Item

WatiN

Selenium RC

Explorer Supported

Known work

Ø   IE 6 and IE 7

Known work

Ø   IE 6 and IE 7

Ø   Firefox 1.5.0 and 2.0

Ø   Opera 8.5.4 and 9.0.2

Should work

Ø   Firefox 0.8 to 2.0

Ø   Mozilla Suite 1.6+, 1.7+

Ø   Sea monkey 1.0

System supported

Known work

Ø   Windows XP and 2003

Known work

Ø   Windows XP and 2003

Ø   Windows 2000(need to install install reg.exe in order to use IE)

Ø   Mac OS X

Ø   Linux

Language supported

Ø   C#

Ø   C#

Ø   Java

Ø   Perl

Ø   PHP

Ø   Python

Ø   Ruby

Test environment supported

Ø   Visual Studio 2005 Team System

Ø   Visual Studio 2005 Team System

AJAX

Supports AJAX website testing

l   Selenium Server communicates directly with the browser using AJAX (XmlHttpRequest)

l   The Selenium Server is great for testing complex AJAX-based web user interfaces under a Continuous Integration system

Get/Post requests

 

We can send commands directly to the Server using simple HTTP GET/POST requests

Https supported

 

Support for https

Java scrīpt Supported

Void Document.Runscrīpt(string)

l   We can write selenium RC tests in Javascrīpt with JsUnit.

l   it Allows a Selenium-enabled browser to run Javascrīpt on arbitrary websites.

HTML

Automates all major HTML elements and find elements by multiple attributes

 

HTML dialogs

Supports HTML dialogs (modal and modeless)

 

Frame

Supports frame (Cross domain) and iframes

 

Popup dialogs

Supports popup dialogs like alert, confirm, login etc

 

Screenshots

Support creating screenshots of web pages

 

 

 

对现有控件的兼容性不好。比如 文件上传 控件和日历控件就无法在 Selenium RC 中捕捉
2.
不支持 https 连接方式??

http://bbs.51testing.com/thread-84131-1-6.html

 

Developing Info

Item

WatiN

Selenium RC

Developing Language

Ø   C#

Ø   Java and so on

 

Methods Example

Item

WatiN Example

Selenium RC Example

Set   element

event

Document.button(Find.ById(btnG”)).click()

DefaultSelenium.Type(“q”,”hello world”)

Get element attributes

Document.button (Find.ById(btnG”)) .Style. Height

DefaultSelenium. GetElementHeight (“q”)

especial methods

                             

Then we can’t hanle the time used for pages loading.

                           ===

 

 

 

Ø   Link[1].Click()

Ø   Link(Find.ByIndex(1)).Click()

We can use these two methods to click the links that the value is null.

Ø   WaitForPageToLoad(“5000”)

(if we want to go to another page and get the elements in the new page, we have to use the method, or we will in the old page.)

 

 

==     We can’t find the links that the value is null

 

 

WatiN 测试 Google 的例子

 

using System;

using System.Collections.Generic;

using System.Text;

 

using WatiN.Core;

using System.Threading;

 

namespace ConsoleApplication1

{

     class Program

    {

        [ STAThread ]

        static void Main( string [] args)

        {

            // Open a new Internet Explorer window and

            // goto the google website.

            IE ie = new IE ( "http://www.google.com.hk" , true );

 

             // Find the search text field and type Watin in it.

            ie.TextField( Find .ByName( "q" )).TypeText( "WatiN" );

 

            // Click the Google search button.

            ie.Button( Find .ByValue( "Google 搜索" )).Click();

 

            // Uncomment the following line if you want to close

            // Internet Explorer and the console window immediately.

            //ie.Close();

        }

    }

 

}

 

获取页面元素内容:

            // Open an new Internet Explorer Window and

            // goto the google website.

            IE ie = new IE ( "http://www.google.com.hk" , true );

 

            // Find the search text field and type Watin in it.

            ie.TextField( Find .ByName( "q" )).TypeText( "WatiN" );

 

            // Click the Google search button.

            ie.Button( Find .ByValue( "Google 搜索" )).Click();

 

            // Find the table cell which shows the search result statistics.

            Element element = ie.Element( Find .By( "id" , "resultStats" ));

            string resultStats = element.Text;

 

            // Write these statistics to the console window.

            Console .WriteLine(resultStats);

 

            // Uncomment the following line if you want to close

            // Internet Explorer and the console window immediately.

            //ie.Close();

 

参考:

Getting started with WatiN

http://watin.sourceforge.net/gettingstarted.html

WatiN and Thread.ApartmentState

http://watin.sourceforge.net/apartmentstateinfo.html

 

 

WatiN 支持的页面元素

 

Html element

WatiN Class

WatiN Collection

Example

Version

 

 

 

 

 

<a />

Link

LinkCollection

Ie.Link(linkId)

0.7

<area />

Area

AreaCollection

ie.Area(Find.ByAlt(alttext))

1.2

<button />

Button

ButtonCollection

Ie.Button(buttonId)

0.9

<div />

Div

DivCollection

Ie.Div(divId)

0.7

<form />

Form

FormCollection

Ie.Form(formId)

0.7

<frame />

Frame

FrameCollection

Ie.Frame(frameId)

0.7

<frameset />

-

FrameCollection

Ie.Frames

0.7

<iframe />

Frame

FrameCollection

Ie.Frame(iframeId)

0.9

<img />

Image

ImageCollection

Ie.Image(imageId)

0.7

<input type=button/>

Button

ButtonCollection

Ie.Button(buttonId)

0.7

<input type=checkbox/>

CheckBox

CheckBoxCollection

Ie.CheckBox(checkboxId)

0.7

<input type=file/>

FileUpload

FileUploadCollection

Ie.FileUpload(fileuploadId)

0.9

<input type=hidden/>

TextField

TextFieldCollection

Ie.TextField(hiddenId)

0.7

 

 

 

 

no longer supported as of 2.0 beta 1

<input type=image/>

Image

ImageCollection

Ie.Image(imageId)

0.9.5

<input type=password/>

TextField

TextFieldCollection

Ie.TextField(passwordId)

0.7

<input type=radio/>

RadioButton

RadioButtonCollection

Ie.RadioButton(radioId)

0.7

<input type=reset/>

Button

ButtonCollection

Ie.Button(resetId)

0.7

<input type=submit/>

Button

ButtonCollection

Ie.Button(submitId)

0.7

<input type=text/>

TextField

TextFieldCollection

Ie.TextField(textId)

0.7

<label />

Label

LabelCollection

Ie.Label(elementId)

0.7

<option />

Option

OptionCollection

Ie.Select(selectId).Options

1.0

<p />

Para

ParaCollection

Ie.Para(pId)

0.7

<select />

Select

SelectCollection

Ie.Select(selectId)

0.7

<span />

Span

SpanCollection

Ie.Span(spanId)

0.7

<table />

Table

TableCollection

Ie.Table(tableId)

0.7

<tbody />

TableBody

TableBodyCollection

Ie.TableBody(tablebodyId)

Ie.Table(tableid).TableBodies

1.0

<td />

TableCell

TableCellCollection

Ie.TableCell(tablecellId) or

Ie.Table(TableId).TableRows[0].TableCells[0]

0.7

<textarea />

TextField

TextFieldCollection

Ie.TextField(textareaId)

0.7

<tr />

TableRow

TableRows

Ie.TableRow(tablerowId) or

Ie.Table(TableId).TableRows[0]

0.7

All elements, also the ones not mentioned in this list

Element and

ElementsContainer

ElementCollection

Ie.Element(elementId)

Ie.Element(tagname, elementId)

0.9

 

1.2

 

HTML Mapping Table

http://watin.sourceforge.net/htmlelementmapping.html

 

WatiN 中所有的控件以及控件的识别方法

WatiN 的源代码中可以看到所有的控件识别设计类都是在继承了与 element 相关的类

包括 Element, ElementAttributeBag, ElementCollection, ElementContainer, ElementSupport, ElementTag

首先来看 Element 的类可以看到它继承 IAttributeBag , Elemental 类中写到的方法有 :

1. Classname: Get the name of the stylesheet class assigned to this element; 得到传输给此控件默认格式类的名称。返回值为 string.

2. Complete: Boolean Value, Get a value indicating whether the element is completely loaded; 得到一个波尔值 , 查看是否此对当前控件的操作完全加载。返回值为波尔值 .

3. Enabled: Get a Value indicating whether this element is enabled. 得到一个波尔值来确认当前的控件是否是可用的 . 返回值为波尔值 .

4. ID: Get the if of this element as specified in the HTML , 返回当前控件在此 HTML 页面中的识别 ID, 返回值为 string

5.TEXT: Get the inner text of this element(or all the inner text of all the elements contained in this elment). 返回当前控件中的文本 , 或者是返回当前控件所包含的控件中的所有文本 , 返回值为 string.

6.TextBefore: Returns the text displayed before this element when it s wrapped in a Label element, otherwise it returns null. 返回当前控件前面的 Label 的文本内容 , 如果当前控件前面的控件不是 Label 则返回 null, 返回值为 string.

7. InnerHtml: Gets the inner HTML of this element. 返回当前控件的内部 HTML 代码。返回值不用说当然为 string.

8. OuterText: Gets the outer text, 返回外部文档 , 返回值为 string.

    Shit, 这个控件我还真不知道怎么用 , 呵呵。查了一下解释如下:

InnerText: 不包括标志,标志以内的纯文本   

  OuterText: 包括标志,连标记及标志内的文本   

  InnerHtml: 不包括标志,标志以内的 Html 内容   

  OuterHtml: 包括标志,连标记及标志内的 Html 内容

9. TagName: Gets the tag name of this element 返回当前控件的标签。返回值为 string.

10. Title: Get the title. 返回当前页面的标题。返回值为 stieng.

11. NextSibling: Gets the next sibling of this element in the Dom of the HTML page. 返回当前标签在此 HTML 页面 Dom 控件中的下一个兄弟控件。返回值为控件即 (element)

12. PreviousSibling: Gets the previous sibling of this element in the Dom of the HTML page. 返回当前标签在此 HTML 页面 Dom 控件中的下一个兄弟控件 , 返回值为控件即 (element)

13. Parent: Gets the parent element of this element, If the parent type is known you can cast it to that type. 返回当前控件的父级控件 , 如果父级的控件类型知道 , 可以定义一个和父级同类型的变量控件。返回类型为控件 (element). 这个比较难理解 , 下面是举例 :

      Div

        a id="watinlink" href="http://watin.sourceforge.net" /

                  a href="http://sourceforge.net/projects/watin" /

        Div

      上面的 HTML 所示第二个超链接没有 id, 如何点击它来实现超链接?这时可以使用 Parent 这个方法 :

         首先定义一个变量 Div, 然后把这两个超链接所在的 div 赋值给这个 Division 变量。

  Div watinDiv = ie.Link(“watinlink”).Parent;

然后去找第二个 Link, 可以把第一个 Link 看做是 Links[0], 那么第二个 Link 就是 Link[1]

watinDiv.Links[1].Click();

14.Style: Style is the element s style, 返回当前控件的格式。返回类型为 Style.

15.GetAttributeValue: This method can be used is the attribute is not available as a property of the element of a subclass of the element. Need a parameter’attributeName’, this parameter should be the name of the property exposed by IE on it’s element object. The return is the value of the attribute if available, otherwise null is returned. 当控件的属性不存在或者或者属性属于此控件的一个子类时此方法可以使用。但是需要传递给此方法一个参数即属性名称 ( 它应该是被 IE 暴露的一个空间实体 ), 返回值为控件的属性值或者为 null.

16. ToString: Returns a string that represents the current object, or null. 返回代表当前实体的值 , 如果没有则返回空。返回类型为 string.

17.Click: Click this element and waits till the event is completely finished(Page is loaded and ready). 点击当前控件然后等待 , 知道整个事件完成即 : 页面被完全加载。无返回值 .

18.ClickNoWait: Click 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 HTML Dialog is displayed after clicking the element. 触发事件并立刻返回信息然后去判断需要如何执行 , 通常是在点击或者跳转页面还没完成时你需要其它操作。一般情况下是在当弹出对话框时使用这个方法。无返回值。

19.Focus: Gives the input focus to this element. 聚焦在当前这个输入控件,我不是很明白这个方法。无返回值。

20.DoubleClick: Doubleclicks this element. 双击当前的控件。无返回值。

21.KeyDown, KeyPress, KeyUp 三个方法分别为按下键盘不放 , 按一下键盘 , 和松开按键盘。很绕口 . 这个应该是从 .Net 继承的。

22. Blur: Fires the blur event on this element. 这个应该是和 focus 相反的方法。取消对这个控件的 focus.

 

 

QTP + WatiN

 

Set IE = DotNetFactory.CreateInstance("WatiN.Core.IE","C:\Documents and Settings\Administrator\ 桌面 \WatiN-2.0.10.928-net-2.0\WatiN-2.0.10.928-net-2.0\bin\WatiN.Core.dll")
Set Find=DotNetFactory.CreateInstance("WatiN.Core.Find","C:\Documents and Settings\Administrator\
桌面 \WatiN-2.0.10.928-net-2.0\WatiN-2.0.10.928-net- 2.0\bin\WatiN.Core.dll")
IE.GoTo(" http://www.zbitedu.com ")
IE.WaitForComplete
IE.TextField(Find.ByName("searchkey")).TypeText("vbs
测试 webservice")
IE.Button(Find.ByName("subjectsearch")).Click()
Set   IEpage = IE.AttachToIE(Find.ByUrl(" http://www.zbitedu..com "))
Set LinkObj = IEpage. Link(Find.ByUrl(" http://www.zbitedu.com/ )
IF LinkObj.Exists    Then
     LinkObj.Click()
   ' IE.AttachToIE(Find.ByUrl(" http://www.zbiteducom )
   Set  ConsoleObj= DotNetFactory.CreateInstance("System.Console","System")
   Consoleobj.Write("PASS")
     ' Msgbox("PASS")
else
          Msgbox("FAILL")
End If
IE.Close
IEpage.Close
IE.AttachToIE(Find.ByUrl(" http://www.zbitedu.com).Close

 

 

WatiN 中常用的类

 

WatiN.Core.Find


最普遍使用的类就是 Find 类的,它是一个工厂类,主要使用它的静态方法来实现一些查询条件。比如像上面的例子中的这个语句 “ie.Button(Find.ByName("btnG")).Click();” 就调用了 Find 的静态方法 ByName 来查询一个 name 属性为指定值的 HTML 元素,然后再调用 IE 对象的 Button 方法把这个元素转换为按钮对象。

WatiN.Core.IE

这应该是最关键的类了。他常用的方法是和属性为
属性
HtmlDialogs
返回当前对象用 JavaScript 打开的模式窗口(需然帮助文档中说非模式窗口也包括在内,但在试用中发现用 window.open 打开的窗口没有被)
Frames
返回当前的象里的所有 Frames
方法
静态方法 AttachToIE 与一个已经找开的 IE 关连。
Button,TextField,Image,Div
等一系列方法。与 Find 对象共同使用用于返回 IE 中特定的按钮,输入框,等 HTML 元素。

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 插件 – QAliber

http://www.qaliber.net/Wiki/index.php?title=WatinN_Plug-in

 

Qaliber 主页:

http://qaliber.net/index.php

作者: Benny Cohen

包括两个版本,其中 QAliber Test Developer 版本作为 VS.NET 的插件使用:

QAliber Test Developer (free open source) is a Visual Studio plug-in.

Create test cases as an integral part of your development solution.

QAliber Test Builder (free open source) is a robust testing framework for creating and executing tests with no coding skills.

 

TestAndTry.com 对这款工具的评价是“ Very Fast GUI Automation With Free QAliber ”:

http://www.testandtry.com/2010/03/04/very-fast-gui-automation-with-free-qaliber/

 

主要特点:

Create test cases as an integral part of your development solution.

Create GUI / API level test quick!

Record / Play GUI automation.

Supports Win32 / .NET forms / WPF / WEB GUI testing.

Run on all windows platforms with .NET framework 3.0 and up (XP,Vista,Win 7)

Write C#/VB.net code, use the .NET framework capabilities.

 

下载地址:

http://sourceforge.net/projects/qaliber/files/

 

 

 

WatiN自动化测试


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论