Selenium
IDE是一个firfox插件,录制相当方便,而且效果不错,很多录制后不需要修改即可回放.编辑也相当简单,一行就是一个完整的命令.十分适合于编程基
础较薄的测试人员使用.但是由于所用的语言是selenese即是类html脚本语言而非程式语言,于组织脚本不够灵活,所形成的功能不如
selenium RC 强大,而且对脚本组织也不方便.更重要的是暂时只支持 firefox浏览器.所以一般情况下是以selenium IDE
来熟悉 selenium功具.然后利用IDE 来录制脚本作为selenium
core的脚本文件或更多的是用IDE录制而保存为drive脚本即是程式语言脚本如java 脚本.但无论如何 selenium
IDE是学习selenium的必修课,因为日后录制脚本需要它,即使用selenium
rc也可用它录制部分脚本并可方便用于调试.下面将简单介绍Selenium IDE的整个使用过程.
1>
Selenium IDE 安装. 从其官方网站下载安装:http://selenium-ide.openqa.org/,跟普通frifox
插件安装没有什么两样(注意是firefox安装插件不是IE哦..).安装完成后,在浏览器"工具"菜单栏即可见Selenium IDE 工具.
3> Selenium
IDE编辑脚本.你可以在Table中修改,点击相应命令行,所在行内部便会出现在下方,即可方便修改,如选择相应的command.当然你也可以在
Sourece中修改,但人必须对 Selenium命令很熟悉. 现在修改下刚才录制的脚本,将第二行命令的value 修改为Selenium.
4>Selenium IDE脚本运行. 修改完后即可点击运行按钮运行.运行刚才修改过的脚本,你会发现其迅速打开google浏览器并输入"Selenium"并点击进行搜索.此时运行结束.
6>打开 seleniumIDE脚本并运行.这个就非常简单了....
到此,Selenium IDE录制并修改运行整个过程完成了,你已经可以轻松方便使用selenium
IDE进行录制运行脚本了.但是要运用到测试中去尚需要时间熟悉,如都有什么命令啊,如何进行定位啊,如何用assert来验证验证点啊,这也是
selenium 测试主要学习的三点.如果这三占都搞明白了,熟悉了,恭喜你,你已经可以用selenium进行测试了.
作为使用selenium IDE 工具并不复杂,而在于如何更熟悉它并用于测试中去.况且如前面提到只用Selenium IDE
进行测试局限性太高,所以建议借学习selenium IDE 了解并熟悉selenium工具,然后用其录制脚本并用 selenium
其它工具进行测试如selenium Core, selenium RC,selenium
Grid.于本人使用经验而言,建议使用selenium
RC.当然并不是说其它不好,其它有自己的优势或是功能也是RC不具备的.从学习与使用方面考虑是先学习 selenium IDE,
然后转向Selenium RC. 所以接下来将介绍Selenium RC.
Part Two --- Selenium Introduction 1
其实几天前就看了一下Selenium,不过因为之前写别的东西,就拖到了今天。
Selenium包括三部分,Selenium core,Selenium IDE和Selenium RC。Selenium
core自然就是他的核心代码,Selenium
IDE是用JavaScript写成的Firefox插件,可以录制脚本,转换成其他语言,并且回放等。但是喵喵在这里主要想说的是Selenium
RC,即Selenium Remote Control,以及它和ant的集成使用。
Selenium Remote Control现在最新的是0.9.2,可以在http://www.openqa.org/selenium-rc/下
载。Selenium Remote Control可以允许你使用编程语言(Java, .NET, Perl, Python, and
Ruby)实现自动化web应用UI的测试,它提供了一个Selenium
Server,它可以自动的start/stop/control所有支持的浏览器(Windows平台上为Internet Explorer
6.0 and 7.0, Firefox 1.5.0.8 and 2.0, Opera 8.5.4 and 9.0.2)。
Selenium Server必须跑在JRE1.5以上版本,可以通过java -version查看当前的JRE版本。
启动Selenium Server:java -jar selenium-server.jar
可以通过-interactive参数使之以interactive mode启动,当然,在此喵喵不采用这种方式,而是用java编写testcase来进行测试。
代码如下:
import com.thoughtworks.selenium.*;
import junit.framework.*;
public class GoogleTest extends TestCase {
private Selenium browser;
public void setUp() {
browser = new DefaultSelenium("localhost",
4444, "*firefox", http://www.google.com);
browser.start();
}
public void testGoogle() {
browser.open(http://www.google.com/webhp?hl=en);
browser.type("q", "hello world");
browser.click("btnG");
browser.waitForPageToLoad("5000");
assertEquals("hello world - Google Search", browser.getTitle());
}
public void tearDown() {
browser.stop();
}
}
启
动Selenium
Server以后,就可以运行上面的testcase了。相信大家也都看到了,这个testcase是继承了junit的testcase。所以下面要讲
的用ant进行自动化的编译和测试就和前面的ant学习笔记(一)中提到的<junit>task完全一样了。
ant脚本片段如下:
<!-- 编译selenium test文件 -->
<target name="compileselenium">
<mkdir dir="${dist.selenium}"/>
<javac destdir="${dist.selenium}" deprecation="on">
<src path="${src.selenium}"/>
<classpath refid="classpath"/>
<classpath refid="proj.libs"/>
</javac>
</target>
<!-- 运行selenium -->
<target name="selenium" depends="compileselenium">
<junit printsummary="yes" haltonfailure="yes">
<classpath>
<path refid="classpath"/>
<pathelement location="${dist.selenium}"/>
</classpath>
<formatter type="plain"/>
<test name="GoogleTest" haltonfailure="no" outfile="result"/ >
</junit>
</target>
Part Three -- Selenium学习笔记
最近准备用Selenium自动化录制测试脚本,稍微总结一下。
Selenium的主页是
http://seleniumhq.org
Selenium包括很多组件,其中我现在用的是Selenium RC和Selenium IDE。Selenium IDE是Firefox的一个插件,我们可以使用它录制页面操作。
Selenium
IDE安装完毕之后,可以从工具菜单中激活,然后我们就可以在firefox中访问需要测试的网页,进行各种页面操作,Selenium
IDE在这个过程中会记录我们的页面控件和动作。完成录制之后,Selenium IDE生成一个HTML文件保存脚本,比如
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head profile="http://selenium-ide.openqa.org/profiles/test-case">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="selenium.base" href="http://www.baidu.com/" />
<title>baidu</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">baidu</td></tr>
</thead><tbody>
<tr>
<td>open</td>
<td>/</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>kw</td>
<td>ckword</td>
</tr>
<tr>
<td>clickAndWait</td>
<td>sb</td>
<td></td>
</tr>
</tbody></table>
</body>
</html>
我们可以导出成Java文件,比如:
package com.example.tests;
import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;
public class NewTest extends SeleneseTestCase {
public void setUp() throws Exception {
setUp("http://www.baidu.com/", "*chrome");
}
public void testNew() throws Exception {
selenium.open("/");
selenium.type("kw", "ckword");
selenium.click("sb");
selenium.waitForPageToLoad("30000");
}
}
只要导入相应的selenium和Junit包就可运行。
有一点需要注意的是在回放脚本时,应该添加setSpeed方法,参数是ms,因为Selenium
IDE虽然可以选择回放速度(慢——中——快),但实际上即使选择慢速,Selenium
IDE仍然运行的有些快,导致其在顺序执行用户操作时,可以发生没等到页面加载完毕就执行下一个命令的现象,导致下一个命令找不到响应的页面控件。除了
setSpeed之外,Selenium IDE还可以添加大量的命令。具体见Selenium IDE界面。
另外一个关键是如何识别页面控件。自动化的核心是录制的控件识别方法可以复用,Selenium
IDE支持的识别格式包括ID、Name、XPath:attributes、DOM index和XPath :
position,而且允许正则表达式,所以非常灵活,根据我使用的情况来看,对于富客户端应用,控件ID通常都增加了一个随机数,不适合做识
别,Name还不错,但是如何这个控件Name带有版本信息,比如控件在不断升级,从1.3升到1.4,那么Name可以会失效,要小心。XPath:
position我用的最多,也觉得定位最准。但是Selenium
IDE有时抓不到某些操作,比如,可以某一个Logout链接,是由span来实现的,此时Selenium
IDE抓不到,此时可以XPath:attributes识别,这样写://span[text()='Log out'],搞定。
对于Selenium IDE,还有很多细节需要学习,比如正则表达式的应用,如何写出通用的识别方法,等等。我准备使用Selenium IDE录制脚本,然后导出成java文件,做一些修改之后用Selenium RC驱动。
原文
http://www.ckword.com/blog/?p=36
Part Four --- About Selenium
优势:
1. 记录测试过程中,所见 即是所得,selenium 的所有内部程序都是用Javascipt编写的。
[Javascrīpt: 由Netscape Communications 和Sun Micorsystems公司共同开发的一种描述语言,与Java 的关系比较松散。Javascrīpt 能为Web页添加基本的联机应用程序和功能,但它不是一种真正的面向对象语言。
它的工作特点是,当client端发出一个JS的请求时,它不必从web server下载,而直接由浏览器做出响应。]
2. 支持多种操作系统,如windows, Mac, Linux,也支持多种浏览器,如IE,Firefox, Mozilla.
若使用Selenium IDE进行web 自动记录测试用例录制,只能是在Firefox (笔者还没试过Mozilla,嘿嘿)是先录制好脚本,再在其它浏览器执行测试用例,进行测试。
3.
执行两种开发脚本,test runner,需要安装Selenium
Core,执行的文件为.HTML后缀名。另一种是driven(脚本语言编写),支持多种语言:JAVA,.NET, Perl, Python,
Ruby.(在下用的是ruby, 没办法,谁叫它既简洁又明了呢!^ ^)
劣势:
较难处理逻辑关系强的业务测试。
Selenium 实质:
通过HTTP协议,发送请求来完成测试用例的。
Selenium 命令:只有两种
1. 操作(action):用于模拟用户与web的交互。
2. 断言(assertion):验证一个命令的预期结果。(类似于watir^ ^)
Selenium 的组成:
Selenium IDE:firefox 的 plug-in。 是浏览器的工具,不能安装在IE上。
Selenium Core:纯粹由Javascrīpt组成的,有assertion机制的test suit runnner.
Selenium Remote Control:
一个代理与控制端, 可代替Selenium core 和IDE 的client端。
下载地址:http://www.openqa.org/
一个使用Selenium IDE的测试例子脚本:
class NewTest
def test_foo
open "/intl/zh-CN/"
assertTitle "Google"
type "q", "selenium"
clickAndWait "btnG"
assertTitle "selenium - Google 搜索"
clickAndWait "link=高级搜索"
assertTitle "Google 高级搜索"
type "as_epq", "iccer"
select "lr", "label=简体中文"
clickAndWait "btnG"
assertTitle "selenium "iccer" - Google 搜索"
click "link=测试| 软件测试| 软件缺陷跟踪| 软件配置工具| 测试用例设计| Web测试 ..."
end
end
将脚本拷下,存为.HTML文档,再在firefox的selenium IDE工作中打开,执行就OK了。(执行不了就多试几次吧。^ ^)
迟点要添加用selenium core的例子。
《Selenium简介》
中讲过,Selenium
RC支持多种语言编写测试案例,如:C#,Python。在工作中,我倾向于是用Python这类动态语言编写测试案例,因为这样的测试案例无需编
译:>,试想如果你有1000个测试案例,每个都要编译,那会给编译服务器很大的压力,而且案例修改后,还得重新编译才能运行:<。但在本系
列的文章中,我还是打算使用C#编写示范例子。
Selenium RC下载:http://seleniumhq.org/download/
写Selenium RC的测试案例
上一篇《Selenium IDE的使用》中,提到了Selenium IDE可以把录制的脚本转为其他语言的脚本,所以我继续用上一篇的脚本为例子,下面是把脚本语言转换为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, "*chrome", "http://change-this-to-the-site-you-are-testing/");
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("/");
selenium.Type("kw", "hyddd");
selenium.Click("sb");
selenium.WaitForPageToLoad("30000");
try
{
Assert.IsTrue(selenium.IsTextPresent("hyddd - 博客园"));
}
catch (AssertionException e)
{
verificationErrors.Append(e.Message);
}
selenium.Click("//table[@id='1']/tbody/tr/td/a/font");
}
}
}
在这里,转换后的脚本使用了NUnit测试框架,为了简化,我用VS的Test Project代替(当然你也可以用Console Application建立测试工程的),步骤如下:
1.建立Test Project
2.导入DLL引用
把selenium-dotnet-client-driver-1.0-beta-2目录中的ThoughtWorks.Selenium.Core.dll,ThoughtWorks.Selenium.IntegrationTests.dll,ThoughtWorks.Selenium.UnitTests.dll加入项目:
3.把上面自动生成的代码再改一下
using System;
using System.Text;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Selenium;
namespace SeleniumTest
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void Test()
{
//127.0.0.1为Selenium测试服务器位置。
//4444为Selenium测试服务器监听端口。
//*iexplore为启动浏览器类型,我把它改为了IE浏览器。
//http://www.baidu.com为源地址。
ISelenium selenium = new DefaultSelenium("127.0.0.1", 4444, "*iexplore", "http://www.baidu.com");
selenium.Start();
selenium.Open("/");
selenium.Type("kw", "hyddd");
selenium.Click("sb");
selenium.WaitForPageToLoad("30000");
Assert.IsTrue(selenium.IsTextPresent("hyddd - 博客园"));
selenium.Click("//table[@id='1']/tbody/tr/td/a/font");
selenium.Close();
selenium.Stop();
}
}
}
4.启动Selenium测试服务器
打开cmd进入selenium-server-1.0-beta-2目录,输入“java -jar selenium-server.jar”(需要先安装JRE),启动Selenium测试服务器。
5.运行测试案例
(1).运行测试案例:
(2).测试结果:
恩,案例Pass了,如果案例失败的话,Error Meesage会说明失败的原因。
(注
意:和Firefox一样,IE下也有屏蔽弹出网页功能,修改设置方法:MenuBar->Tools->Popup
Blocker->Turn off Popup Blocker,或者在Popup Blocker Settings里面配置。)
Part Six -- 配置 selenium rc for HTTPS 测试
1。选择工具
selenium有好几种,首先需要确定的是哪种工具适合
* selenium IDE: 是一个firefox的plug-in,这个基本上对任何
测试都有用,主要是因为可以省下大量的手写测试的时间。根据我的经验,最新的版本(1.0 beta)在RHEL 5.0上不能用,所以我用的是0.87版本。
在这里下载:http://selenium-ide.openqa.org/download.jsp不过它只能在firefox上用
* selenium rc : 这个是用来遥控的。(rc = remote controller)如果你需要在一台电脑上控制
其它几台电脑进行测试,我用的就是这个。不过我用它的主要原因是它支持比较多的脚本语言(perl,python。。。)写自动测试程序比较容易
* selenium core : 只能支持Selenese语言(a simple scrīpting language. Selenese
has a number of strict limitations: it has no conditionals (no "if"
statements), and it has no loops (no "for" statements). This can make
writing complicated tests difficult or even
impossible.)如果需要知道比较具体的区别的话,还是看它们自己的文件:http://wiki.openqa.org/pages
/viewpage.action?pageId=7632
2。配置
配置有很多步骤和方面,首先需要了解的是selenium rc的
工作流程
图片看起来好像复杂,但是实际上我们可以将所有的部件放到一台机器上。我们需要了解的是它的工作流程。
selenium包含三个部件:
测试程序(testing scrīpt)
selenium rc (selenium
server)
browser (firefox, in my case)
他们之间的关系如下
testing scrīpt <=>selenium server <=> browser
(1)测试程序将HTTP/HTTPS请求发给selenium server
(2)selenium server将请求转发(also called proxing)给browser,
(3)browser 执行请求,得到执行结果,然后回复给selenium server
(4)selenium server 将回复转发给测试程序*
(5)测试程序检验测试结果,记录之,然后执行下一个测试
这个过程中,selenium server和browser必须要在同一台机器上,但是测试程序可以随意。我的配置是三者都在同一台机器上。
测试环境配置 (testing environment configuration)
* perl (我使用的是perl)
用perl写selenium的测试程序需要首先安装必要的module:
Test::WWW::Selenium
我的安装方式如下:
$> yum install perl.CPAN.386
-- yum 是
linux里面的程序包安装程序
$> perl -MCPAN -e "install Test::WWW::Selenium"
--安装Selenium会同时要求你同时安装一些其它的module,比如Test::Mock Test::MockObject
Test::More Test::Exception Test::Mock:LWP Test::Pod.
如果你的CPAN配置好了的话,这些安装都是自动的,安装过程中如果有提问,直接回车就好,一般不会有太多问题 (如果需要重新配置perl
CPAN,比如说我
$> perl -MCPAN -e "
shell"
CPAN> o conf init
*
JAVA
Selenium server 是用Java写的,所以你需要有JAVA。我开始用的是
IBM JAVA 1.5后来才发现不行,就转到了SUN的JRE1.6
* Selenium Core : 在selenium rc 的网站上说需要 selenium core,但是我的经验是不必管它
* Selenium Server:
** 下载: Selenium 1.0
Major release
** unzip selenium-remote-control-1.0-beta-1-dist.zip
** 到这里其实就可以了,但是让程序跑起来,这里需要一个额外的配置: 将firefox-bin放到系统路径里面去
$> export PATH=$PATH:/usr/lib/firefox-1.5.0.9*
* HTTPS
前面的都很简单。如果你不需要测试HTTPS,那么前面的配置就足够了。但是要让selenium server用HTTPS,还需要将一个专门用于测试的cert放到firefox里面去。步骤如下:
** open firefox
** import certificates:
*** go to "Edit->Preference"
-> open "Advanced" tab
-> click "Security" (or "Encryption" )
-> click "view certificates", a new window will open,
-> then select "Web Sites" tab
-> then click "import"(图片如下)
3。最后一步,就是怎么让程序跑起来。这里有三个问题需要注意:
1> selenium rc beta 1。0 的SSL cert已经过期了(4/18/2008),所以我们需要将我们的系统时间改回到过期之前。
$> date 041800002007
2> 需要用让selenium server使用刚刚设定好的firefox profile
3> 需要设置一个特定的参数(trustAllCertificates),让所有的SSL请求能够顺利通达。[这条在selenium正式的网站上没有写出来,是通过看源程序找到的]
我的命令如下:
让selenium server跑起来:
java -jar ~/server/selenium-server.jar "
-log /tmp/selenium.log "
-trustAllSSLCertificates "
-multiWindow "
-firefoxProfileTemplate /opt/ipatest.profile
15:52:10.698 INFO - Writing debug logs to /tmp/selenium.log
15:52:10.699 INFO - Java: Sun Microsystems Inc. 10.0-b19
15:52:10.699 INFO - OS: Linux 2.6.18-8.el5 i386
15:52:10.702 INFO - v1.0-beta-1 [2201], with Core v1.0-beta-1 [1994]
15:52:10.758 INFO - Version Jetty/5.1.x
15:52:10.760 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver]
15:52:10.762 INFO - Started HttpContext[/selenium-server,/selenium-server]
15:52:10.763 INFO - Started HttpContext[/,/]
15:52:10.772 INFO - Started SocketListener on 0.0.0.0:4444
15:52:10.773 INFO - Started org.mortbay.jetty.Server@5ac072
让测试程序跑起来:
perl test.pl
我的test.pl 程序开头部分如下:
----------------------------
#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes qw(sleep);
use Test::WWW::Selenium;
use Test::More "no_plan";
use Test::Exception;
my $sel = Test::WWW::Selenium->new( host => "localhost",
port => 4444,
browser => "*firefox",
browser_url => "https://some.com");
$sel->open_ok("/testpage");
$sel->click_ok("link=Add User");
$sel->wait_for_page_to_load_ok("30000");
$sel->type_ok("form_title", "auto001");
$sel->type_ok("form_givenname", "selenium");
$sel->type_ok("form_sn", "001");
$sel->type_ok("form_krbprincipalkey", "redhat123");
$sel->type_ok("form_krbprincipalkey_confirm", "redhat123");
$sel->click_ok("document.form.submit[1]");
$sel->wait_for_page_to_load_ok("30000");
$sel->is_text_present_ok("s001 added!");
$sel->click_ok("link=Find Users");
$sel->wait_for_page_to_load_ok("30000");
$sel->type_ok("uid", "s101");
$sel->click_ok("//input["@value='Find Users']");
$sel->wait_for_page_to_load_ok("30000");
$sel->type_ok("uid", "s001");
---------------------------
我其实没有写什么东西,上面的程序都是selenium IDE自动录的。