三、WatiN 里常用的類
WatiN.Core.Find
普遍使用的類是Find類的,它是一個(gè)工廠類,主要使用它的靜態(tài)方法來(lái)實(shí)現(xiàn)一些查詢條件。比如像上面的例子中的這個(gè)語(yǔ)句“ie.Button(Find.ByName("btnG")).Click();”調(diào)用了Find的靜態(tài)方法ByName來(lái)查詢一個(gè)name屬性為指定值的HTML元素,然后再調(diào)用IE對(duì)象的Button方法把這個(gè)元素轉(zhuǎn)換為按鈕對(duì)象。
WatiN.Core.IE
這應(yīng)該是關(guān)鍵的類了。他常用的方法是和屬性為
屬性
HtmlDialogs 返回當(dāng)前對(duì)象用JavaScript打開的模式窗口(需然幫助文檔中說(shuō)非模式窗口也包括在內(nèi),但在試用中發(fā)現(xiàn)用window.open打開的窗口沒有被)
Frames 返回當(dāng)前的象里的所有Frames
方法
靜態(tài)方法 AttachToIE 與一個(gè)已經(jīng)找開的IE關(guān)連。
Button,TextField,Image,Div 等一系列方法。與Find對(duì)象共同使用用于返回IE中特定的按鈕,輸入框,等HTML元素。
四、應(yīng)用中的一些技巧
1、如何去捕獲一個(gè)新彈出的窗口。
背景:有些鏈接是從一個(gè)新彈出的窗口中打開的,我如果關(guān)連上這類型的窗口。
方案:下面以一個(gè)具體例子為例。系統(tǒng)中有一個(gè)登陸界面:login.aspx 登陸成功能后會(huì)調(diào)用JAVASCRIPT的window.open方法打開系統(tǒng)的主窗口,然后關(guān)閉當(dāng)前這個(gè)窗l(fā)ogin.aspx。
剛開始時(shí),我的代碼是這樣寫的
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;//注意這里,我每次執(zhí)行到這里都出錯(cuò)。下面會(huì)說(shuō)明原因。
ie = IE.AttachToIE(Find.ByTitle(new WatiN.Core.Comparers.RegexComparer(new System.Text.RegularExpressions.Regex(".*綜合信息系統(tǒng).*"))));
ie.WaitForComplete();
MainFrame = ie.Frame(Find.ByName("MainFrame_00001"));
MenuFrame = ie.Frame(Find.ById("leftMenu"));
}
看到上面的注譯沒有?那么執(zhí)行完后WatiN都會(huì)出現(xiàn)一個(gè)等待完成超時(shí)的異常,這是因?yàn)辄c(diǎn)擊了登陸按鈕后,如果登陸成功的話,系統(tǒng)已經(jīng)把這個(gè)窗口關(guān)閉了,因?yàn)樗静豢赡芡瓿伞:呛莮~```所以要修改一下。
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();//這個(gè)方法改成這樣,那點(diǎn)擊后不會(huì)等代碼IE完成了。
//下面這句是處理登陸的技巧所在,系統(tǒng)打開了另一個(gè)窗口。
//下面這句是用正則表達(dá)式捕獲這個(gè)窗口。
ie = IE.AttachToIE(Find.ByTitle(new WatiN.Core.Comparers.RegexComparer(new System.Text.RegularExpressions.Regex(".*綜合信息系統(tǒng).*"))));
ie.WaitForComplete();
MainFrame = ie.Frame(Find.ByName("MainFrame_00001"));
MenuFrame = ie.Frame(Find.ById("leftMenu"));//把系統(tǒng)里的Frame先保存下來(lái)。
}