简介
WatiN - Watir 的 .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
中捕捉
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 主页:
作者: 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/