2、對于alert 、confirm 等javascript彈出的窗口的捕獲。
背景:一個系統(tǒng)經(jīng)常會使用以上這些javascript來彈出一些提示信息,如果捕獲這些窗口,并模擬用戶點擊這些窗口上的OK或Cancel按鈕?
方案:其實WatiN在默認情況下,都會自動地去點擊這些彈出式窗口上的Cancel按鈕的,但如果用戶要明確點擊哪些事件的話可以對IE對象增加一個“查看器”()
//錯誤事例
protected void f()
{
WatiN.Core.DialogHandlers.ConfirmDialogHandler dh = new WatiN.Core.DialogHandlers.ConfirmDialogHandler();
ie.AddDialogHandler(dh);//這句增加了一個控制器
/**/
/*
假設(shè)yzp_dic_btn_cls這個按鈕的onclick事件會用JS彈出一個Confirm窗口。
錯誤,測會在這里彈出一個窗口,然后等待用戶進行操作(隨便點擊一個按鈕才繼續(xù)執(zhí)行)
然后因為用戶已經(jīng)點擊了按鈕關(guān)閉 彈出窗口。下一句的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();
}
正確的示例應(yīng)該是:
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、關(guān)于用JS彈出的Modal窗口(模式窗口)的處理.
背景:有些地方需要彈出模式窗口來處理數(shù)據(jù)。
方解:當點擊了彈出模式窗口的按鈕或連接后馬上用IE對像的HtmlDialogs屬生來獲取模式窗口。
protected void f()
{
//假設(shè)下面這行代碼會彈出一個模式窗口把原來的Click改成這個方法。
//記住這里要用ClickNoWait而不能用Click,否則在模式窗口關(guān)閉之前代碼不會繼續(xù)執(zhí)行。
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();
}
總結(jié)
這個框架還是比較簡單,主要要主意的事情是HTML元素的Click與ClickNoWait方法的區(qū)別。還有對于輸入框,是直接設(shè)置它的Value還是調(diào)用TypeText或AppendText方法模擬用戶手工輸入內(nèi)容。前者不會激發(fā)該控件的任何JS事件,而后者會激KeyDown、KeyUP等事件。