Selenium是一个很好用的Web自动化测试工具。Aaron很久以前使用过Selenium,不过仅仅用了其提供的API来写测试代码,也在blog上发过一个简单的代码示例。近来有好几个博友加我MSN问我有关Selenium录制的问题,可惜以前没有使用过,爱莫能助。鉴于此,昨天晚上磨叽了一阵子终于让脚本给跑起来了。Aaron希望对于那些博友及其他人会有帮助。
Selenium IDE简介和安装
Selenium录制功能是由Selenium IDE实现的。根据官方网站当前的介绍:
Selenium IDE is a Firefox add-on that records clicks, typing, and other actions to make a test, which you can play back in the browser.
上面已经写的很清楚了,Selenium IDE可以帮助我们记录下点击,输入等行为并可以支持在浏览器中回放。
当然还有一点想必读者已经看出来了,Selenium IDE是一个Firefox插件,所以Selenium当前的版本(2009-1-18)是不支持IE的录制的,当然这对于脚本的使用影响并不是很大——除非你是想录制之后直接使用,那你就会失望了,selenium当前的版本并没有达到那种强悍的程度。
Selenium IDE的安装很简单,如果使用Firefox 2.0,可以直接将官网上下载的文件(例如selenium-ide-1.0-beta-2.xpi)置于Firefox安装路径下的extensions文件夹(默认安装路径C:\Program Files\Mozilla Firefox\extensions,而Firefox1.5的默认路径在C:\Program Files\Firefox Plus\App\firefox\extensions)下,然后关闭当前打开的Firefox窗口,重新打开即可执行自动安装。Aaron在使用过程中并未出现过安装失败的情况。
如果你使用的是Firefox 3.0,恭喜你中奖了:你会失败,原因也很简单,selenium IDE目前支持的最高版本还没有达到我们3.0的高度。(更正:感谢一楼提醒,Aaron已验证1.0 beta 2版本的Selenium IDE可以在Firefox3中安装成功,给大家造成的误导Aaron表示诚挚的歉意)
另外,需要提醒的是:使用最新版本的Selenium IDE录制可能会导致录制失败(selenium-ide-1.0-beta-1.xpi,selenium-ide-1.0-beta-2.xpi版本在Aaron使用过程中均会出现错误,提示:table view is not available in this format),这个bug已经被人提交到Selenium论坛上面去了,提交者使用的是Win XP,而Aaron使用的是Win 2003,因此为了避免大家浪费时间——尽管只是一种可能性的浪费,Aaron推荐暂时使用我试验中使用的0.8.7版本。
声明:因为随着版本的变化,本文中的部分内容与最新版本的使用可能会不一致,因此Aaron介绍的内容适用于于2009-1-18之前的selenium版本:
Project |
Release Date |
Version |
Selenium Core |
Jan 12, 2009 |
1.0 beta 2 |
Selenium IDE |
June 3 |
2008 1.0 beta 2 |
Selenium RC |
Jan 12, 2009 |
1.0 beta 2 |
Selenium Grid |
Nov 30, 2008 |
1.0.3 |
Selenium IDE脚本录制
好了,安装完成了,接下来我们就直接使用IDE来录制吧。启动Firefox浏览器,在Firefox菜单栏中单击“工具”菜单,我们会看到Selenium IDE是其子菜单:
单击Selenium IDE项我们可以看到弹出Selenium IDE窗口:
然后我们就可以使用Selenium IDE进行录制了。至于录制的详细过程我就不详细介绍了,不过还是提醒大家一下,我们可以使用Selenium IDE的菜单栏“Options”菜单中的“Format”子菜单将脚本转化为各自所需的语言类型。
Aaron在文章接下来的部分使用C#作为示例语言。
编辑Selenium IDE脚本
Aaron录制的脚本工作流程是:打开Firefox浏览器->打开Google首页->在google搜索框中输入“google”->左键单击“google 搜索”按钮->在新页面选中“图片、新闻搜索”以验证:
最后得到的C#脚本如下:
using System; using System.Text; using System.Text.RegularExpressions; using System.Threading; using NUnit.Framework; using Selenium; namespace SeleniumTests { [TestFixture] public class NewTest { private ISelenium selenium; private StringBuilder verificationErrors; [SetUp] public void SetupTest() { selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com"); selenium.Start(); verificationErrors = new StringBuilder(); } [TearDown] public void TeardownTest() { try { selenium.Stop(); } catch (Exception) { // Ignore errors if unable to close the browser } Assert.AreEqual("", verificationErrors.ToString()); } [Test] public void TheNewTest() { selenium.Open("http://www.google.cn/"); Assert.AreEqual("Google", selenium.GetTitle()); selenium.Type("q", "google"); selenium.Click("btnG"); selenium.WaitForPageToLoad("30000"); Assert.AreEqual("google - Google 搜索", selenium.GetTitle()); try { Assert.IsTrue(selenium.IsTextPresent("图片、新闻搜索")); } catch (AssertionException e) { verificationErrors.Append(e.Message); } } } } |
一般情况下,这些录制的脚本在Selenium IDE中会重新运行成功,但如果我们将脚本直接拿出来在我们自己的IDE下会怎么样呢?
为了更方便编辑我们录制的脚本,将这段代码拷贝到VS中:新建一个类库项目TestSeleniumSimple,并将类库项目下的class1.cs文件中的内容用录制的脚本覆盖。编译我们的类库项目TestSeleniumSimple,很遗憾我们看到了
不用惊讶,因为我们仔细看一看代码就知道了,原来录制的脚本中引用了一些内容:
using NUnit.Framework;
using Selenium;
对于第一个我们需要安装NunitFramework,这个可以到Nunit官网上下载,如果你同时下载了Selenium-RC,你可以在\Selenium-RC\selenium-remote-control-1.0-beta-2-dist\selenium-remote-control-1.0-beta-2\selenium-dotnet-client-driver-1.0-beta-2文件夹下找到它,同时也可以找到我们“using Selenium”所需要的ThoughtWorks.Selenium.Core.dll,添加对这两个dll的引用,然后再编译。这个时候就可以生成成功了。
在测试框架中回放脚本
好事总是多磨,我们编译成功的脚本很可惜,不能运行。在编译完脚本后出现Nunit不能使用的问题,不知道是偶然还是有必然因素。还好Aaron的脚本是在虚拟机中录制的,所以Aaron将编译成功的脚本直接拿到了物理机上运行。打开Nunit(Aaron使用的是NUnit-2.4.3-net-2.0版本),然后导入TestSeleniumSimple.dll(TestSeleniumSimple类库的产品),点击运行,又出错了:
原来是服务器,还记得我们刚才引用了Selenium-RC中的两个DLL吗?Selenium RC中RC是Remote Client的意思,既然有Client那么一定是有Server了,实际上还真有这样一个Selenium-server,一个用来启动web浏览器的家伙。我们找到Selenium-RC的目录下的Server子目录A:
\Selenium-RC\selenium-remote-control-1.0-beta-2-dist\selenium-remote-control-1.0-beta-2\selenium-server-1.0-beta-2
里面由一个selenium-server.jar文件,我们需要在命令行下启动这个server。
在命令行下定位到子目录A处,接着输入:
Java –jar selenium-server.jar
这个时候我们可以看到我们顺利启动了Selenium Server了,试着运行一下刚才失败的测试脚本,终于绿了:
我们还可以注意到命令行工具中也有运行的信息:
比如我们在上图的倒数第四条信息中看到了:
13:04:57.406 INFO - Command request: isTextPresent[图片、新闻搜索, ] on session
f68a3d7d0d7b4de8bfdb95ae1c553e6b
等很详细的内容。
总结
其实我们也可以不使用NUnit,而直接使用VSTS中Test Edition组件来运行我们的测试脚本,为了使脚本更稳定或者运行更快,我们也可以编辑脚本对时间做一些处理。我们也可以编辑脚本已增加更多的断言以确保待测页面显示了我们想要的内容或者没有显示我们不想要的内容等等。
对于Selenium IDE录制脚本,Aaron稍微总结一下:
1, 使用Firefox
2, 编译之前添加对于NUnit.Framework.dll和ThoughtWorks.Selenium.Core.dll的引用
3, 记得启动Selenium Server
4, 为提高脚本质量以满足测试稳定性等需求,应该对录制的脚本进行编辑
当然,在使用Selenium的过程中,我们还会碰到其他各种奇怪的问题而导致脚本出现问题。限于篇幅和时间问题,Aaron就不继续讨论了。另外,我们也可以写一些程序来帮助我们更好的使用Selenium(比如自动启动selenium-server,自动运行脚本等等),这些内容Aaron也留给大家自己去实践~