WatiN 是一个源于 Watir的工具,开源且用于web测试自动化的类库。Web Application Testing in .NET. WatiN 通过与浏览器的交互来实现自动化,使用起来具有轻便,简单的特点。
WatiN.Core: WatiN的核心部分,与浏览器的交互都包含在此模块中。
WatiN.Core.DialogHandlers: 该命名空间提供用于操作浏览器对话框的对象。
WaitN.Core.Exceptions: 该命名空间里的对象用于处理各种异常。
WatiN的原理和其他web自动化测试工具基本类似,通过操纵浏览器和web页面中的DOM对象来实现模拟用户操作网页。WatiN封装了复杂的DOM操作并提供了大量的扩展,使对web网页的操作更灵活,更简便。
HTML元素与WatiN类的映射:
在编写测试代码之前,首先通过工具查看web页面中元素的信息,确定该元素的类型再通过映射关系确定使用WatiN中的类。
IE类:最基础,最重要的一个类,用于访问web页面中的元素以及操纵IE浏览器。
Goto(string): 导航到某个地址的网页
Close(): 关闭浏览器
ContainsText(string): 是否包含指定文本
CaptureWebPageToFile(string): 对当前web页截图并保存到指定位置
ClearCache(): 清除Cache
ClearCookie(): 清除Cookie
备注:使用IE类意味着在IE上做测试,由于WatiN最新版本也支持Firefox, 可以定义出一个Browser来从config文件中决定使用哪个浏览器:
第一步:定义IEStatic类,用于在Browser方法中定义IE浏览器时使用:
1 public class IEStatic 2 { 3 private Browser browser; 4 private int browserThreadId; 5 private string browserHandle; 6 7 public Browser Browser 8 { 9 get 10 { 11 var currentThreadId = GetCurrentThreadId(); 12 if (currentThreadId != browserThreadId) 13 { 14 browser = IE.AttachTo<IE>(Find.By("hwnd", browserHandle)); 15 browserThreadId = currentThreadId; 16 } 17 return browser; 18 } 19 set 20 { 21 browser = value; 22 browserThreadId = GetCurrentThreadId(); 23 browserHandle = browser.hWnd.ToString(); 24 25 } 26 } 27 28 private int GetCurrentThreadId() 29 { 30 return Thread.CurrentThread.GetHashCode(); 31 } 32 }
第二步:在WatiNTest类中定义Browser方法:
1 public class WatiNTest 2 { 3 static Browser browser; 4 static IEStatic ieInstance; 5 public static string classPropertyName = "Classname"; 6 public static Browser Browser 7 { 8 get 9 { 10 string browserType = ConfigurationManager.AppSettings["BrowserType"].ToString().ToLower(); 11 browserType = browserType ?? "ie"; 12 switch (browserType) 13 { 14 case "ie": 15 if (browser == null) 16 { 17 try 18 { 19 browser = new IE(); 20 } 21 catch 22 { 23 CloseInternetExplorers(); 24 browser = new IE(); 25 } 26 ieInstance = new IEStatic(); 27 ieInstance.Browser = browser; 28 Logger.LogAction("New IE instance created, hWnd=" + browser.hWnd.ToString()); 29 } 30 else 31 { 32 browser = ieInstance.Browser; 33 } 34 classPropertyName = "Classname"; 35 break; 36 case "firefox": 37 if (browser == null) browser = new FireFox(); 38 classPropertyName = "Class"; 39 break; 40 41 } 42 return browser; 43 } 44 } 45 46 public static void CloseInternetExplorers() 47 { 48 var processes = from process in Process.GetProcesses() 49 where process.ProcessName == "iexplore" 50 select process; 51 52 foreach (var process in processes) 53 { 54 try 55 { 56 process.Kill(); 57 process.WaitForExit(); 58 process.Close(); 59 process.Dispose(); 60 } 61 catch { } 62 } 63 browser = null; 64 65 } 66 }
将 Goto(string)重写成以下方法:
1 public static void Navigate(string url) 2 { 3 browser.GoTo(url); 4 }
其他常用方法:
ClearCookie方法:
1 public static void ClearCookie() 2 { 3 using (IE ie = new IE()) 4 { 5 ie.ClearCache(); 6 ie.ClearCookies(); 7 } 8 }
Close方法:
1 public static void Close() 2 { 3 if (browser != null) 4 { 5 browser.Close(); 6 browser.Dispose(); 7 if (ieInstance != null) 8 { 9 ieInstance.Dispose(); 10 ieInstance = null; 11 } 12 browser = null; 13 } 14 }
Find类:也是必须用到的一个类,用于查找并定位web页面中的元素
ById(), ByName(), ByClass(), ByAlt(), ByText()….
一些例子,使用上面定义过的Browser方法来举例:
Link:
1 Link link = WatiNTest.Browser.Link(Find.ByClass("string").Or(Find.ById("string"))); 2 string linkText = link.Text; 3 string url = link.Url; 4 link.Click();
Button:
1 Button button= WatiNTest.Browser.Button(Find.ById("string")); 2 string buttonText = button.Text; 3 button.Click();
Div:
Div div = WatiNTest.Browser.Div(Find.ByClass("string"));