三、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先保存下来。
}