在测试岗位也混迹了3个多年头了,从最开始接触微软的自动化测试,到手工测试,一直很想好好学习一下自动化测试来着,可惜由于工作限制,总是偶尔私下折腾,一会UIA,一会Test complete,也没折腾出啥效果来,挫败。。。 茶几。。。 就不说了!
现在终于下定决心,开始折腾一下网页自动化测试(对于一个都没做过网页测试滴人,自己也不晓得说啥了,呵呵。。。),查找了一些关于网页自动化测试的工具,最后选定了selenium,这也是开发出生的心态作祟吧
开始看selenium的时候,已经和webdriver合并了,所以之前滴什么RC1.0 2.0之类滴,咱就不考虑了。只知道之前主要是通过java script的注入来控制浏览器,现在主要都是通过调用浏览器自身接口,更加方便合理。
下载了webdriver后,开始啃文档了,当然要从官方网站开始,比如说http://seleniumhq.org/docs/03_webdriver.html。理所当然,文档上滴示例肯定是俺滴第一个程序啦!
//WebDriver.dll
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
//WebDriver.Support.dll
using OpenQA.Selenium.Support;
using OpenQA.Selenium.Support.UI;
namespace SeleniumDemo1
{
class Program
{
static void Main(string[] args)
{
IWebDriver driver = new FirefoxDriver();
driver.Navigate().GoToUrl(@"http://www.google.com.hk");
IWebElement query = driver.FindElement(By.Name("q"));
query.SendKeys("Cheese");
query.Submit();
WebDriverWait wait = new WebDriverWait(driver, System.TimeSpan.FromSeconds(10));
wait.Until((d) => { return d.Title.ToLower().StartsWith("cheese"); });
System.Console.WriteLine("Page title is: " + driver.Title);
driver.Quit();
}
}
}
由于本人有个习惯,就是喜欢手打code,不喜欢直接copy,这就导致了一开始运行程序时,firefox启动后怎么也不打开google,尝试直接赋值给driver.Url,但是调试时发现url一直木有赋值成功,调试中的exception现实参数格式不正确,这才发现原来我输入的网址是www.google.com.hk,前面没有添加http://,运行时程序并不会报错,也不会抛出异常,真是个杯具!
就咱这剩下的还木有还给老师的丁点csharp知识,遇到 wait.Until((d) => { return d.Title.ToLower().StartsWith("cheese"); }); 又要开始哭了!查看webdriverwait.until的定义,发现其参数 system.func乃是委托一枚,但=>这又是何方妖孽,我勒个去,out到家了都!
行,咱又开始啃文档吧,=>这个是lambda表达式,一般读作goes to,左边是参数,右边可看做函数体。until的参数定义为func<in T, out TResult> condition,在此,可以看出其调用的函数体就是=>右边的函数体,参数就是左边的d,(d)是隐式类型IWebDriver。由此,我们可以直接声明委托,定义并调用一个参数为IWebDriver并拥有相同函数体的函数,相信同样可以实现。
//WebDriver.dll
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
//WebDriver.Support.dll
using OpenQA.Selenium.Support;
using OpenQA.Selenium.Support.UI;
namespace SeleniumDemo1
{
class Program
{
static void Main(string[] args)
{
IWebDriver driver = new FirefoxDriver();
driver.Navigate().GoToUrl(@"http://www.google.com.hk");
IWebElement query = driver.FindElement(By.Name("q"));
query.SendKeys("Cheese");
query.Submit();
WebDriverWait wait = new WebDriverWait(driver, System.TimeSpan.FromSeconds(10));
System.Func<IWebDriver, bool> t = test;
wait.Until(t);
System.Console.WriteLine("Page title is: " + driver.Title);
driver.Quit();
}
public static bool test(IWebDriver d)
{
return d.Title.ToLower().StartsWith("cheese");
}
}
}
我们定义了一个委托t,并让它调用test函数,但是菜鸟又发现为何我没有传任何参数给它,它也能自动找到我的firefoxdriver呢,抬眼一看,发现我们定义wait时,就已经指定好了,用于等待的instance就是我们要用的driver啦!
Note:StartsWith有些奇怪,如果是Cheese它反而找不到,cheese却可以顺利通过 先睡觉了,留待下次解决吧!
继续努力......