Web 测试实践 for .Net —WatiN。

6 篇文章 0 订阅
 

测试对于一个应用系统来说是非常关键的,但沌单元测方式(XUnit)的方式在B/S结构的信息管理系统中仍然有一些不足,比如要测试界面元素,网页导行方面,就需要其它的一些测试架框作为辅助,这两天开始查找并学习了一些网站测试方面的框架。 把学习心得发出来与大家工享。

一、几种常用框架的介绍。

1、NUnitAsp  官方网址:http://nunitasp.sourceforge.net/

优点:可以在测试代码中直接使用使用调用网页中的服务器控件。并获取该控件的属性。

缺点:不够灵活。正如他的官方网上所说的:

NUnitAsp is for unit testing ASP.NET code-behind only. It's meant for programmers, not QA teams, and it's not very good for QA-style acceptance tests. It only tests server-side logic. JavaScript and other client-side code is ignored. But if you're using ASP.NET, it's an essential part of your programmers' toolset.

NUnitAsp 主要是对后台代码进行单元测试,即它主要是用于测试服务端的逻辑,JavaScript和其它的客户端代码是被忽略的。

2、WatiN 官方网址:http://watin.sourceforge.net/

优点:非常灵活,可以模拟用户在客户端浏览器中的大部份操作,API也比较简单。

缺点:文档较少,官方网上的例子也很少。

因为我的目的是测试网站里网页的导行,主要就是要模拟用户的操作,因此选择了使用WatiN。下面的内容也主要是讲述它的使用。

二、最简单的例子

下面先看一下官司方网站上给出的一个最简单的例子。

 

[Test] 
public   void  SearchForWatiNOnGoogle()
{
 
/*这一句代码会打开一个IE浏览器,打开www.google.com网址。
 *在创建军了IE对象以后也可以用ie.GoTo(url);来转到其它网址。
 
*/

 
using (IE ie = new IE("http://www.google.com")) 
 
{
  
/*在浏览器中查找name属性为"q"的输入控件,然后调用它的TypeText方法
 *模拟用户用键盘输入"WatiN"
 *注意TypeText方法是真的模拟用户一个一个字母地输入进这个输入框的。
 *如果只是想设置该控件的内容可以把这句改为:
 *ie.TextField(Find.ByName("q")).Value="WatiN"; 
 
*/

  ie.TextField(Find.ByName(
"q")).TypeText("WatiN"); 
  ie.Button(Find.ByName(
"btnG")).Click();
  
  Assert.IsTrue(ie.ContainsText(
"WatiN"));
 }

}
 

 

 

这段代码的作用是模仿用户打开IE浏览器到GOOGLE网站查询WatiN的内容,然后确定有没有打到这些信息。

三、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元素。

 四、应用中的一些技巧

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();
}

 

总结

这个框架还是比较简单,主要要主意的事情就是HTML元素的Click与ClickNoWait方法的区别。还有对于输入框,是直接设置它的Value还是调用TypeText或AppendText方法模拟用户手工输入内容。前者不会激发该控件的任何JS事件,而后者会激KeyDown、KeyUP等事件。

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值