已经参与到欧洲LindBak POS loyalty项目中,上周开始学习Selenium,准备功能测试自动化的脚本。故有此文。
Selenium是什么?
下载:http://seleniumhq.org/download/
有一句广告词是:XX,改变了我对隔离霜的看法。我只能说,Selenium,改变了我对测试工具的看法。
Selenium分为三部分:
1.Selenium Core
2.Selenium IDE
3.Selenium RC(Remote Control)
对于Selenium Core,我在测试中没有涉及,不敢妄言。
Selenium IDE以火狐插件的形式存在;录制操作非常简便,且自动生成的脚本可转换为Java、C#、Php等多种主流的编程语言。我们可以直接在自己熟悉的IDE环境和单元测试框架(如VisualStudio NUnit)中调用Selenium提供的方法,去模拟用户操作。
Selenium RC中包括了多种语言的client-driver以及selenium server。要在VS中调用Selenium方法,需要把Selenium RC中‘dotnet-client-driver’的dll文件作为reference添加到项目中。而selenium server需要在JDK环境下启动。即: java -jar selenium-server.jar -interactive
没错,我们将Selenium IDE自动生成的C#代码稍作修改,在VS的Test Project中导入Selenium相关的dll文件,就可以直接把测试代码跑起来了
功能测试自动化,你需要考虑得更多
“功能测试”这四个字的背后,意味着:
-
一个简单的文本框,对应多次测试。这些测试的点击、输入等动作是一样的,不同的是输入的数据;
-
某一项输入导致的Fail,不能影响其他输入情况的测试
-
测试人员可以方便地更新测试数据
-
…… ……
我们还需要做什么
Test Case
我们没有采用Test runner模式,没有利用Selenium自身的测试套件去跑Case,因为这种模式是基于Selenium Core的,需要将编写好的测试套件对应的Html页面、Selenium Core,以及被测Web系统一起部署在同一服务器上。(这跟浏览器Javascript的安全限制有关,也就是所谓的‘同源策略’。详情可问Google)这种Test runner模式,可以在后期有专门的测试服务器上进行。
我们目前采用的是Driver模式。也就是基于SeleniumRC,更强大更灵活的方式。即,在VS中编写额外的测试代码作为脚本,这些脚本将通过Selenium Remote Control提供的Selenium Server,与浏览器中的Selenium Core进行通信。也就是说,我们是利用SeleniumRC解决Test runner模式下的‘同源策略’问题,对任意Web站点进行测试,而无需将测试脚本和Web系统部署于同一服务器上。
Test Result
目前最新的Selenium版本1.0.1,没有实现Report机制,官方提倡用编程语言本身提供的Report方法,或第三方Report Tool实现。由于我们是在Visual Studio环境下用C#写代码,自然而言地想到NUnit、Microsoft.VisualStudio.TestTools.UnitTesting这些单元测试框架,而事实上,这些单元测试框架产生的Test Result,并不能满足我们对功能测试Report数据的要求。原因很简单,比如,我们测试“除法”需要2个参数a,b,在外部的测试数据文件中有“a=1、b=0”和“a=4、b=2”。对于NUnit Assert的Report,如果在“a=1、b=0”时出现Failed,那么“a=4、b=2”这个case就不会继续跑下去,此其一;其二,如果“除法”的Test Method Failed,在NUnit生成的报告中没有详细的输入参数。所以,我们要跳出NUnit这个框框,自己对Excepted和actual进行判断,从而输出我们需要的信息到Test Result中。
学习资料
《Selenium私房菜》(新手入门教程) http://www.cnblogs.com/hyddd/archive/2009/05/30/1492536.html
《用 Selenium 自动化验收测试》 http://www.ibm.com/developerworks/cn/java/wa-selenium-ajax/
问题札记
Q:Firefox3 could not be found in the path
添加Firefox.exe所在的目录到Path环境变量中即可
Q:Selenium RC弹出的Firefox网页报Proxy Error 502错误(如下图)
在Firefox中设置:工具-》选项-》高级-》网络中,设置“无代理”即可
Q:如何获得Web页的Table中某行某列的值
string username=selenium.GetTable("ctl00_ContentPlaceHolder_GridViewUsers.1.2");
注:ctl00_ContentPlaceHolder_GridViewUsers是Table id;1是Row;2是Column
Q:如何获得Table最后一行某个单元格的值
string memberId = selenium.GetText("//table[@id='ctl00_ContentPlaceHolder_GridViewMbrSets']/tbody/tr[last()]/td[2]");
最后,建议大家用Firebug先定位好元素,这样,用起xPath获值就方便多了。