Web 测试实践 for .Net —WatiN

发表于:2011-8-11 11:47

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  刚开始时,我的代码是这样写的

  publicvoidLogin(stringuid,stringpasswd)
  ...{
  stringurl=Host+"login.aspx";
  ie=newIE();
  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(newWatiN.Core.Comparers.RegexComparer(newSystem.Text.RegularExpressions.Regex(".*综合信息系统.*"))));
  ie.WaitForComplete();
  MainFrame=ie.Frame(Find.ByName("MainFrame_00001"));
  MenuFrame=ie.Frame(Find.ById("leftMenu"));
  }

  看到上面的注译没有?那么执行完后WatiN都会出现一个等待完成超时的异常,这是因为点击了登陆按钮后,如果登陆成功的话,系统已经把这个窗口关闭了,因为它根本不可能完成。呵呵~~```所以要修改一下。

  publicvoidLogin(stringuid,stringpasswd)
  ...{
  stringurl=Host+"frmlogon.aspx";
  ie=newIE();
  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(newWatiN.Core.Comparers.RegexComparer(newSystem.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对象增加一个“查看器”()

  //错误事例
  protectedvoidf()
  ...{
  WatiN.Core.DialogHandlers.ConfirmDialogHandlerdh=newWatiN.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();

  正确的示例应该是:

  protectedvoidf()
  ...{
  WatiN.Core.DialogHandlers.ConfirmDialogHandlerdh=newWatiN.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属生来获取模式窗口。

  protectedvoidf()
  ...{
  //假设下面这行代码会弹出一个模式窗口把原来的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等事件。
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号