在以往的MS项目中都是用MS的内部Automation工具,最近的项目都是非MS的Web项目,所以必须寻找重新寻找一套Automation 工具,搜了一下,貌似近几年Selenium比较火,研究下来果然不错:
有2套模式供不同需求和不同级别的测试人员选择
1) 基于Firefox插件的自动化测试脚本,只需装上一个Firefox插件,按一个记录按钮,操作几下步骤,整个过程就会自动转换成test case, test case实际上就是一个脚本文件,有一点代码入门基础的人都可以很方便的理解和修改,生成test case.
同时,基于生成的test case,可以利用内置的很多AssertXXX,和VerifyXXX方法来验证整个case,而且验证的对象都是可以通过界面选中的,非常方便。
2) WebDriver的UI Automation, 针对有一定代码能力和更丰富需求的Automation tester,提供了完整的API,tester通过调用API完成各种界面操作,由于case都是代码写的,所以可以加入数据case开跑前的环境准备和case跑后的环境清理工作等步骤,非常适合创建复杂的自动化测试项目。
WebDriver的兼容性是另一个亮点,支持通过Java, C#, Python, Ruby, PHP, Perl和JavaScript来开发,支持的浏览器也很丰富:Firefox, IE, Safari, Opera, Chrome。光是这点,就比我之前用的MS Automation强大很多。
针对WebDriver, 我简单写了个在MSTest 环境下的LogIn和LogOut case:
简要步骤:
1. 通过Nuget安装Selenium WebDriver和Selenium.WebDriver.IEDriver
2. 创建IE的WebDriver
IWebDriver driver =new InternetExplorerDriver();
3.通过FindElement,By.Name, By.ClassName, By.ID, By.CssSelector等各种办法找到UI对象,然后对对象操作。
IWebElement query = driver.FindElement(By.Name("UserName"));
query.SendKeys(UserName);//填值
query = driver.FindElement(By.Name("Password"));
query.SendKeys(Password);//填值
query.Submit();//提交
4. 最后验证步骤
Assert.AreEqual("http://localhost/", driver.Url);
跑下来有几个特点:
a) 整个跑case的过程不会受到鼠标移动影响,比2010年左右用的coded UI稳定很多(现在的版本不清楚了)
b)IE的Driver比Firefox的快,其他的还没试过
完整代码(处于项目初期,代码不是很完善):
DriverManager类来创建WebDriver对象
public class DriverManager
{
static IWebDriver driver;
public static IWebDriver CreateDriver()
{
string DriverServerType = ConfigurationManager.AppSettings["BrowserType"].ToString();
if (DriverServerType == "FireFox")
{
driver = new FirefoxDriver();
}
else
{
driver = new InternetExplorerDriver();
}
return driver;
}
public static IWebDriver GetDriver()
{
return null != driver ? driver : null;
}
}
UI的每个行为的操作类
public partial class UIUtility
{
static public void LogIn(string UserName, string Password)
{
IWebDriver driver = DriverManager.GetDriver();
IWebElement query = driver.FindElement(By.Name("UserName"));
query.SendKeys(UserName);
query = driver.FindElement(By.Name("Password"));
query.SendKeys(Password);
query.Submit();
}
static public void LogOut()
{
IWebDriver driver = DriverManager.GetDriver();
IWebElement query = driver.FindElement(By.LinkText("Logout"));
query.Click();
}
}
baseCase类,被test case类继承,这样不用每次都写一遍Create和Close:
public class BaseCase
{
protected IWebDriver driver;
[TestInitialize]
public void Initialize()
{
driver = DriverManager.CreateDriver();
}
[TestCleanup]
public void CleanUp()
{
driver.Close();
}
}
最后是具体的case:
public class LogIn_LogOut:BaseCase
{
static string LogInURL = ConfigurationManager.AppSettings["ServerURL"].ToString() + "/Account/Login?ReturnUrl=%2F";
static string AdminName = ConfigurationManager.AppSettings["AdminName"].ToString();
static string AdminPassword = ConfigurationManager.AppSettings["Password"].ToString();
[Priority(0)]
[TestMethod]
[TestCategory("LogIn_Out")]
public void LogIn_LogOut_Success()
{
driver.Navigate().GoToUrl(LogInURL);
UIUtility.LogIn(AdminName, AdminPassword);
Assert.AreEqual(ConfigurationManager.AppSettings["ServerURL"].ToString(), driver.Url);
UIUtility.LogOut();
Assert.AreEqual(LogInURL, driver.Url);
}
[Priority(1)]
[TestMethod]
[TestCategory("LogIn_Out")]
public void LogInFailed_IncorrectPW()
{
driver.Navigate().GoToUrl(LogInURL);
UIUtility.LogIn(AdminName, "IncorrectPassword");
IWebElement query = driver.FindElement(By.ClassName("validation-summary-errors"));
Assert.IsTrue(query.Text.Contains("Invalid username or password."));
}
}