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等事件。