Aaron的测试生活小说

半两五钱,笃志向前
   :: 首页 :: 新随笔 :: 联系 ::  :: 管理

      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.xpiselenium-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

单击Selenium IDE项我们可以看到弹出Selenium IDE窗口:

Selenium

然后我们就可以使用Selenium IDE进行录制了。至于录制的详细过程我就不详细介绍了,不过还是提醒大家一下,我们可以使用Selenium IDE的菜单栏“Options”菜单中的“Format”子菜单将脚本转化为各自所需的语言类型。

Selenium

Aaron在文章接下来的部分使用C#作为示例语言。

编辑Selenium IDE脚本

       Aaron录制的脚本工作流程是:打开Firefox浏览器->打开Google首页->google搜索框中输入“google->左键单击“google 搜索”按钮->在新页面选中“图片、新闻搜索”以验证:

Selenium

最后得到的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,很遗憾我们看到了

Selenium

不用惊讶,因为我们仔细看一看代码就知道了,原来录制的脚本中引用了一些内容:

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将编译成功的脚本直接拿到了物理机上运行。打开NunitAaron使用的是NUnit-2.4.3-net-2.0版本),然后导入TestSeleniumSimple.dll(TestSeleniumSimple类库的产品),点击运行,又出错了:

Selenium

原来是服务器,还记得我们刚才引用了Selenium-RC中的两个DLL吗?Selenium RCRCRemote 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了,试着运行一下刚才失败的测试脚本,终于绿了:

Selenium

我们还可以注意到命令行工具中也有运行的信息:

Selenium

比如我们在上图的倒数第四条信息中看到了:

13:04:57.406 INFO - Command request: isTextPresent[图片、新闻搜索, ] on session

f68a3d7d0d7b4de8bfdb95ae1c553e6b

等很详细的内容。

总结

其实我们也可以不使用NUnit,而直接使用VSTSTest Edition组件来运行我们的测试脚本,为了使脚本更稳定或者运行更快,我们也可以编辑脚本对时间做一些处理。我们也可以编辑脚本已增加更多的断言以确保待测页面显示了我们想要的内容或者没有显示我们不想要的内容等等。

对于Selenium IDE录制脚本,Aaron稍微总结一下:

1,   使用Firefox

2,   编译之前添加对于NUnit.Framework.dllThoughtWorks.Selenium.Core.dll的引用

3,   记得启动Selenium Server

4,   为提高脚本质量以满足测试稳定性等需求,应该对录制的脚本进行编辑

当然,在使用Selenium的过程中,我们还会碰到其他各种奇怪的问题而导致脚本出现问题。限于篇幅和时间问题,Aaron就不继续讨论了。另外,我们也可以写一些程序来帮助我们更好的使用Selenium(比如自动启动selenium-server,自动运行脚本等等),这些内容Aaron也留给大家自己去实践~

Feedback

#1楼  回复 引用 查看   

2009-02-16 14:25 by 王德水      
<a href="http://www.cnblogs.com/cnblogsfans/archive/2008/12/23/1360320.html" class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl04_TitleUrl">Web测试:Selenium使用</a>

selenium IDE现在支持Firefox3,但selenium IDE对ajax支持不太好,不过写脚本可以解决
我的这篇文章:
<a href="http://www.cnblogs.com/cnblogsfans/archive/2008/12/23/1360320.html">Web测试:Selenium使用</a>

#2楼  回复 引用 查看   

2009-02-17 11:42 by oscarxie      
其实selenium和watiN各有优缺点,很多人不用selenium,我个人觉得有2个原因,第一个selenium需要启动server,也就是说准备工作里还有java的安装;第二个是selenium这里用到VSTS的话,还需要装Nunit,其实VSTS自己都带了单元测试的API。当然selenium的优点不言而喻。而WatiN的话,支持的浏览器和操作系统少,但是对于asp.net的项目自动化测试,我是推荐用watiN,而其他的项目selenium的兼容性会好很多,这2个工具都用过,算是一点感受吧。目前是用python+selenium RC来做自动化测试。
http://www.cnblogs.com/oscarxie/archive/2008/07/12/1241134.html

#3楼[楼主]  回复 引用 查看   

2009-02-17 12:34 by Aaron Wu      
--引用--------------------------------------------------
oscarxie: 其实selenium和watiN各有优缺点,很多人不用selenium,我个人觉得有2个原因,第一个selenium需要启动server,也就是说准备工作里还有java的安装;第二个是selenium这里用到VSTS的话,还需要装Nunit,其实VSTS自己都带了单元测试的API。当然selenium的优点不言而喻。而WatiN的话,支持的浏览器和操作系统少,但是对于asp.net的项目自动化测试,我是推荐用watiN,而其他的项目selenium的兼容性会好很多,这2个工具都用过,算是一点感受吧。目前是用python+selenium RC来做自动化测试。
--------------------------------------------------------
我第一次使用Selenium的时候是读了selenium手册之后,调用
Selenium.Core写的测试脚本,没有使用过录制功能。对比一下WatiN,Selenium要稳定一些。我在使用WatiN写的脚本,如果IE不是默认浏览器,而是将使用IE内核的360安全浏览器,遨游浏览器设为默认,会抖出COM组建调用的异常,脚本无法运行。

#4楼[楼主]  回复 引用 查看   

2009-02-17 13:21 by Aaron Wu      
@oscarxie
你发的那个链接中的内容是我在08年2月份写的~

#5楼  回复 引用 查看   

2009-03-19 13:01 by 八位机      
我想请问 如果我录了一个脚本 一个正常的脚本

但是在某天跑到时候 在点击button的时 我客户端验证不过 需要用selenium直接停下来 告诉我验证有问题 请问该如何去修改脚本呢?

我试过在waitforpageload之前做check 但是做完check后 就是做waitforpageload的操作
时间等的是超长

#6楼[楼主]  回复 引用 查看   

2009-03-19 18:59 by Aaron Wu      
@八位机
既然你只需要验证客户端脚本,那么做了check之后,就不需要waitforpageload了直接进入TestCleanup操作就行了,这个有什么问题吗?

这种情况下很可能是你的代码在客户端验证之后就没有继续向服务器提交请求了,自然也不会收到response了,这会导致加载页面超时

#7楼  回复 引用   

2009-06-28 23:54 by ku1ai[未注册用户]
你好!我用了你的代码运行了一下,在Nunit出现:
SeleniumTests.NewTest.TheNewTest:
System.Net.WebException : 远程服务器返回错误: (500) 内部服务器错误。
提示的错误行是selenium.start()
这个是什么错误???selenium server我已经启动了

#8楼[楼主]  回复 引用 查看   

2009-06-29 18:40 by Aaron Wu      
@ku1ai
请查看一下你的Selenium Server是否启动成功了,另外需要检查一下初始化Selenium时候的参数,尤其是端口号是否有问题

#9楼  回复 引用 查看   

2009-07-17 22:30 by Testblog      
请教一下 在使用代理进入到测试环境时,运行selenium编写的测试脚本,打开的浏览器,浏览器本身的代理丢失,请问怎么解决! 谢谢
是要在selenium server启动配置什么参数吗??

#10楼[楼主]  回复 引用 查看   

2009-07-18 10:42 by Aaron Wu      
引用Testblog:
请教一下 在使用代理进入到测试环境时,运行selenium编写的测试脚本,打开的浏览器,浏览器本身的代理丢失,请问怎么解决! 谢谢
是要在selenium server启动配置什么参数吗??

你可以尝试一下下面的命令行:
java -jar selenium -server.jar -Dhttp.proxyHost=yourproxy -Dhttp.proxyPort=yourproxyport -Dhttp.proxyuser=yourusername -Dhttp.proxyPassword=yourpassword

#11楼  回复 引用 查看   

2009-07-21 01:32 by Testblog      
好像不行哟, 没有试成功!
我的设置如下:
java -jar selenium -server.jar -Dhttp.proxyHost=71.33.897.58 -Dhttp.proxyPort=52000 -Dhttp.proxyuser=fff.dffddf-Dhttp.proxyPassword=fddfdf

selenium server 提示:
Setting system property http.proxyHost to 71.33.897.58
Setting system property http.proxyPort to 52000
Setting system property http.proxyuser to fff.dffddf
Setting system property http.proxyPassword to fddfdf

感觉是配置成功了,但运行脚本还是打不开代理环境的url

我这边的设置不知可有什么不正确的地方 ,郁闷!


#12楼  回复 引用 查看   

2010-04-28 13:24 by cindyliuxl      
hi,按您说的步骤做了,在运行Java –jar selenium-server.jar这一句时报这个Exception in thread "main"java.lang.NoClassDfFoundError:-jar 错误,网上说是java_home的路径配置错误,我检查了一下没有错,不知道楼主能否指点一二,我现在使用的命令行工具是cmd.exe 文件,不知道是否有影响

#13楼  回复 引用 查看   

2010-12-21 19:47 by 姝晖      
你好,问个问题哈,我在公司自己用selenium rc做个测试,公司用的是代理服务器,测试时我的网页打不开,如何解决啊?firefox