在网上搜索了许久,没找到有具体的配置,只是简单了写了几个步骤,自己琢磨了一下,于是,就想整理一篇文章,便于以后温习。
本文是参照官网的步骤进行了,当然了,也不完成相同。在这里我要说的是java的环境,如查你是使用的其它语言,请参考其它文章。
下面我们通过eclipse 来搭建自己的环境。
======================环境准备========================================
Eclipse sdk:这个很容易找就不贴连接了。
Junit 4:https://github.com/KentBeck/junit/downloads 我用的是最新版本的,你随意。
Selenium RC:http://seleniumhq.org/download/ 这是官网链接
Firefox:firefox 6.0.2 虽然官方说任意版本都可以,但我的firefox7.0.1中安装selenium IDE一直不成功,好吧。再次鄙视一下自己。
selenium IDE: selenium IDE 1.3.0
Selenium IDE :
先来简单说说,他作为firefox浏览器的一个插件存在,依附于firefox浏览器,打开它的录制功能,它会忠实的记录,你对firefox的操作,并可以回放它所记录的你的操作。类似于QTP的自动录制功能。你懂的!我这里就不多讲了。
方法一:
下面我们先来安装selenium IDE...
打开firefox 浏览器,进入官方网址:http://seleniumhq.org/download/
找到selenium IDE的下载链接,firefox会有提示安装插件,点击安装即可。
方法二:
如果你的开发机器不能联网,可以从http://seleniumhq.org/download/的Selenium IDE节点下下载selenium-ide-multi.xpi安装文件,然后在firefox的菜单栏中选择tools (工具)--->add-ons Manager(添加组件) 然后选择“从文件安装附加组件”或(搜索selenium IED ) 点击下载安装重启即可。
Selenium IDE使用:
打开插件,出现如下selenium控制窗口,大致步骤有:
1、在selenium IDE窗口中新建一个Test Case,并且点击录制功能按钮,然后将selenium IDE窗口切换到后台,这样Selenium将会在后台为我们录制测试步骤了;
2、在firefox浏览器中打开一个新的标签----输入需要测试web测试地址-----然后按照测试需要操作网页即可;
3、切回到selenium IDE的主窗口,点击录制按钮,完成上述的测试案例的录入工作,下次就可以使用回访了;
======================================================================
Selenium RC:
Selenium RC 当然没有selenium IDE 那么傻瓜了,表面看它是更专业、功能更强,不在局限于firefox浏览器的插件上那么简单,而且还是支持多种语言的哦。(ps : QTP是只支持VBS脚本的噢!)。Selenium RC 支持java、scharp、python、ruby、php、perl等语言环境,貌似很强的说。
下面是亮点,搭建我们java环境。
打开eclipse sdk 工具。
第一步:创建一个项目,new---Project...
第二步:导入我们需要的包
右键点击我们创建的项目-----Build Path-----Add External Archives...
完成之后如下:
Junit-4.10.jar :在我们下载的junit 4 压缩包里。
selenium-remote-control-1.0.3.jar包下载地址:http://download.csdn.net/detail/javadxz/5356187
Selenium-java-client-driver.jar:在我们下载的selenium-remote-control-1.0.3文件夹下。
.(....\selenium-remote-control-1.0.3\selenium-java-client-driver-1.0.1\)
Selenium-server.jar :在我们下载的selenium-remote-control-1.0.3文件夹下。
.....\selenium-remote-control-1.0.3\selenium-server-1.0.3\
下面把我们录制的脚本导出并放置到入出。
将代码出为junit 4 类型的代码,我这里保存为test.java 并复制到我的项目中。
Src文件夹下的com.test包中:
代码内容如下:
package com.test;
import com.thoughtworks.selenium.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.regex.Pattern;
public class test extends SeleneseTestCase {
@Before
public void setUp() throws Exception {
selenium = new DefaultSelenium("localhost", 4444, "*chrome", "http://www.baidu.com/");
//这里如果运行不了,修改浏览器为 *firefox 或 *iexplore
selenium.start();
}
@Test
public void testTest() throws Exception {
selenium.open("/");
//selenium.open("/index.html"); 可以增加页面类型
//selenium.windowsMaximize(); 将来浏览器窗口放大
selenium.type("id=kw", "selenium");
selenium.click("id=su");
//selenium.waitForPageToLoad("30000");
}
@After
public void tearDown() throws Exception {
selenium.stop();
}
}
下面要启动服务。
开始---运行---cmd 打开命令提示符
定位到…selenium-remote-control-1.0.3\selenium-server-1.0.3> 目录下。
输入:java -jar selenium-server.jar 回车。服务就启动了。
这种方式比较麻烦,我们可以写一个批处理,完成上面的工作。
打开一个记事本,输入java -jar selenium-server.jar命令。保存为 .bat文件。下次双击这个文件就启动了。
命令后面的 “-interactive”是另一种selenium RC的启动方式。
selenium server启动后,回到eclipse中,右击test.java文件,已testunit方式运行,将自动调用我们的浏览器开始运行了。
上面比较详细讲述了如何使用Selenium RC进行Web测试,但到底Selenium RC是什么?或者它由哪几部分组成呢??
一.Selenium RC的组成:
关于这个问题,我拿了官网上的一幅图来说明这个问题。
Selenium RC主要由两部分组成:
(1).Selenium Server:
Selenium Server负责控制浏览器行为,总的来说,Selenium Server主要包括3个部分:Launcher,Http Proxy,Selenium Core。其中Selenium Core是被Selenium Server嵌入到浏览器页面中的。其实Selenium Core就是一堆JS函数的集合,就是通过这些JS函数,我们才可以实现用程序对浏览器进行操作。
(2).Client Libraries:
写测试案例时用来控制Selenium Server的库。
二.Selenium RC与Testcase的关系
先看下图:
(1).测试案例(Testcase)通过Client Lib的接口向Selenium Server发送Http请求,要求和Selenium Server建立连接。
为什么要通过发送Http请求控制Selenium Server而不采用其他方式呢?从上文可以看出,Selenium Server是一个独立的中间服务器(确切地说是代理服务器),它可以架设在其他机器上!所以测试案例通过发送HTTP请求去控制Selenium Server是很正常的。
(2).Selenium Server的Launcher启动浏览器,把Selenium Core加载入浏览器页面当中,并把浏览器的代理设置为Selenium Server的Http Proxy。
(3).测试案例通过Client Lib的接口向Selenium Server发送Http请求,Selenium Server对请求进行解析,然后通过Http Proxy发送JS命令通知Selenium Core执行操作浏览器的动作。
(4).Selenium Core接收到指令后,执行操作。
(5).浏览器收到新的页面请求信息(因为在(4)中,Selenium Core的操作可能引发新的页面请求),于是发送Http请求,请求新的Web页面。
由于Selenium Server在启动浏览器时做了手脚,所以Selenium Server会接收到所有由它启动的浏览器发送的请求。
(6).Selenium Server接收到浏览器的发送的Http请求后,自己重组Http请求,获取对应的Web页面。
(7).Selenium Server的Http Proxy把接收的Web页面返回给浏览器。
继续前一篇的问题,为什么Selenium RC中的Selenium Server需要以这种代理服务器的形式存在?其实,这和浏览器的“同源策略”(The Same Origin Policy)有关。
一.什么是同源策略
同源策略,它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript的浏览器都会使用这个策略。
为什么需要同源策略,这里举个例子:
假设现在没有同源策略,会发生什么事情呢?大家知道,JavaScript可以做很多东西,比如:读取/修改网页中某个值。恩,你现在打开了浏览器,在一个tab窗口中打开了银行网站,在另外一个tab窗口中打开了一个恶意网站,而那个恶意网站挂了一个的专门修改银行信息的JavaScript,当你访问这个恶意网站并且执行它JavaScript时,你的银行页面就会被这个JavaScript修改,后果会非常严重!而同源策略就为了防止这种事情发生,看下图:
比如说,浏览器的两个tab页中分别打开了http://www.baidu.com/index.html和http://www.google.com/index.html,其中,JavaScript1和JavaScript3是属于百度的脚本,而JavaScript2是属于谷歌的脚本,当浏览器的tab1要运行一个脚本时,便会进行同源检查,只有和www.baidu.com同源的脚本才能被执行,所谓同源,就是指域名、协议、端口相同。所以,tab1只能执行JavaScript1和JavaScript3脚本,而JavaScript2不能执行,从而防止其他网页对本网页的非法篡改。
二.Selenium Server为什么以这种代理服务器的形式存在
上面说了同源策略,那同源策略的Selenium Server有什么关系呢??呵呵,上一篇说过,Selenium Core是一堆JS函数的集合,它是我们操作浏览器的基础。当存在同源策略时,便出现一些问题,看下图:
因为Selenium Core的JS脚本的“源”是localhost,所以浏览器会阻止Selenium Core的JS脚本在测试页面上执行,这就是为什么在本系列第一篇中说,如果只使用Selenium Core进行测试,需要把Selenium Core安装到远程服务器上。
为了解决上面这个问题,Selenium RC中的Selenium Server就以代理服务器的形式出现了,下图说明它是如何借助代理的身份蒙骗浏览器的:>
Selenium Server以代理的形式存在,通过修改WebSite的源信息,从而达到欺骗浏览器的目的,就这样,Selenium RC就轻松绕过了同源策略。在上图中,浏览器会认为WebSite和Selenium Core来自同一个“源”----代理服务器!
本篇主要是想更进一步介绍Selenium Server的工作原理,这次我们从Selenium Server的交互模式开始。
在《第一个Selenium RC测试案例》中,我们以命令“java -jar selenium-server.jar”启动了Selenium Server,其实在启动Selenium Server时,我们还可以加上各种参数(具体的参数请参考《Selenium RC服务器命令行参数列表》), 而开启Selenium Server交互模式的命令为“java -jar selenium-server.jar -interactive”。交互模式,是Selenium Server提供的一种快速的测试方法,你可以对Selenium Server输入命令从而直接启动测试。
1.启动Selenium Server交互模式
2.在命令行中输入:cmd=getNewBrowserSession&1=*iexplore&2=http://www.google.com。控制Selenium Server启动浏览器,以及创建Session。
(1).---> Requesting http://localhost:4444/selenium-server/driver?cmd=getNewBrowserSession&1=*iexplore&2=http://www.google.com
看过《深入了解Selenium RC工作原理(1)》的应该了解:我们所编写的测试案例,其实是通过发送Http请求实现对Selenium Server的控制,而测试案例所发送的请求就正是:---> Requesting http://localhost:4444/selenium-server/driver?cmd=getNewBrowserSession&1=*iexplore&2=http://www.google.com。我们可以再打开一个IE浏览器,在地址栏输入:http://localhost:4444/selenium-server/driver?cmd=getNewBrowserSession&1=*iexplore&2=http://www.google.com,回车!看,Selenium Server又为此产生了一个Session了!呵呵:>
(2).这里,Selenium Server为上面的请求随机生成了一个Session ID:9505f5f8c52041c28f4cdc1f8e59f769(由于写这篇文章的时候中途重启了Selenium Server,所以这里和上图的Session ID不同,并且下文会继续使用Session ID:9505f5f8c52041c28f4cdc1f8e59f769)。
(3).如果一切正常,Selenium Server最后会出现Get Result Ok的字样,并出现如下两个框框:
3.控制浏览器访问www.google.com/webhp,输入:cmd=open&1=http://www.google.com/webhp&sessionId=9505f5f8c52041c28f4cdc1f8e59f769
噢,浏览器成功访问http://www.google.com/webhp了:>。
总结一下:
(1).在Selenium Server中输入命令的格式为:cmd=Command&1=Target&2=Value&SessionID=…,这和Selenium IDE的案例语句很像。
(2).在输入命令后,Selenium Server会发条Http请求给自己,请求的URL格式也是固定的:http://localhost:4444/selenium-server/driver?cmd=Command&1=Target&2=Value&SessionID=…,我们完全可以用浏览器发送请求控制Selenium Server进行测试。
(3).另外,sessionId是很重要的一个参数,当一个Selenium Server同时运行多个测试案例时,Selenium Server就是通过sessionId判断到底该操作哪个浏览器窗口。而在下面的C#代码中:
ISelenium selenium = new DefaultSelenium("127.0.0.1", 4444, "*iexplore", "http://www.google.com");
selenium.Start();
selenium.Open("/webhp");
selenium就相当于上文中的sessionId。
(4).在Selenium Server启动一个Session时,必须先指定一个 “源”(原因见《深入了解Selenium RC工作原理(2)》),在上面的代码中http://www.google.com就是“源”了,然而这是可能出现问题,请看下面代码:
ISelenium selenium = new DefaultSelenium("127.0.0.1", 4444, "*iexplore", "http://www.google.com");
selenium.Start();
selenium.Open(http://www.baidu.com);
我们在启动Session时,定义了源为http://www.google.com,但在后来的操作中,我们打开的却是http://www.baidu.com,由于二者非同源,所以接下来的操作就可能会出现各种问题,故此Selenium Server会给出以下警告:
Selenium Server提示说;如果测试案例是运行在*iehta或者*chrome上,或者改变Selenium Server的运行模式为proxy injection mode即可避免问题出现。
恩,在这里,我不得不承认之前在《深入了解Selenium RC工作原理(1)》中,为了简化问题,我故意少写了一些东西!
其实,Selenium Server其实有2种运行模式:
(1).Heightened Privileges Browsers
(2).Proxy Injection
现在Selenium Server启动的默认模式为:Heightened Privileges Browsers。如果要启动Proxy Injection模式,可以加参数“-proxyInjectionMode”。而之前在《深入了解Selenium RC工作原理(1)》中介绍Selenium RC与Testcase关系,其实就是在描述Proxy Injection的工作模式,因为我个人认为Proxy Injection设计模式更为合理,所以只对Proxy Injection模式作介绍。在这里我补充说明一下,为什么Heightened Privileges Browsers模式不能避免上面的问题。先看看Selenium Server在Heightened Privileges Browsers模式下的工作流程图:
和Proxy Injection模式不一样,在Heightened Privileges Browsers模式下,Browser对Web的请求没有经过Http Proxy,所以返回的Web页面就有可能和Selenium Core不同源了(一般的情况下,Open都应该只获取“源”下的某个子页面,用Open获取其他“源”的页面在测试中应该是极少数的,因为在这种情况下,我们还应该再new一个新的ISelenium selenium进行处理,虽然用Open获取其他“源”的页面出现的机会极少,但如果真的需要这样的话,也只能启动-proxyInjectionMode模式了,虽然这样的效率会低一些)。