Selenium全方位解读
Selenium深入浅出之一
Selenium中文参考手册--Selenium深入浅出之二
Selenium与JavaScript--Selenium深入浅出之三
Selenium—Web界面测试工具
n Selenium可以使用录制工具录制脚本,测试页面。
n Selenium可以生成类html代码,java代码,ruby代码等。
n Selenium录制工具根据id属性定位html元素
需要的软件
1, 安装Firefox,Selenium IDE插件,Firebug插件。
2, 解压Selenium的selenium-remote-control包,得到一个服务器。
3, 获取selenium-java-client-driver.jar,用于java语言的Selenium开发。
Selenium IDE的使用
1,FireFox--工具--selinum IDE
2,点击录制按钮,开始记录一个测试。可以使用浏览器进行操作。
最后点击Selenium IDE的停止录制按钮。
可以看到html,Java,Ruby等形式的脚本语言。
可以执行。
可以根据选择的浏览器,使用选择的浏览器执行脚本中的命令。
SeleniumIDE除了记录 Html请求和AJAX调用的操作。其他不涉及通讯的操作,也会被录制。其他的自动脚本录制工具,如WebLoad,LoadRunner都是只记录http请求,不能真正记录对页面的操作。
3,脚本 可以格式化为多种语言。 这个是使用.js文件实现的。
4,selinum使用xpath和css等选择html元素。
Selenium Java测试
1, java项目中,加入selenium-java-client-driver.jar。
2, 启动selenium-remote-control服务器
3,把Selenium IDE录制的Selenium脚本转换成Java格式,Java代码复制到Java项目中。
package com.example.tests;
import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;
public class NewTest extendsSeleneseTestCase {
publicvoid setUp() throws Exception {
setUp("http://auto.sohu.com/","*chrome");
}
publicvoid testNew() throws Exception {
selenium.open("/");
selenium.select("price","label=10-15万");
selenium.select("bodywork","label=SUV/越野车");
selenium.select("brand","label=B 比亚迪");
selenium.click("//form[@id='SBL']/div/div[2]/a/img");
selenium.click("link=比亚迪 F0");
}
}
看一个真实的例子:
public class ScrComplaintControllerTest extends Demo006ControllerTest {
private IProcessHtmlService processHtmlService=new ProcessHtmlService();
/*
* 下面是简单单独的测试
*
* */
@Test
public void prepareAddCase(){
this.browser.open("http://localhost:8080/macodemo/complaint/prepareAddCase.page");
Assert.assertEquals("prepareAddCase出错", "新增個案", this.browser.getTitle());
}
基类
public class Demo006ControllerTestextends SeleniumControllerTest {
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
browser = new DefaultSelenium("localhost", 4444, "*iexplore",
"http://localhost:8000/macodemo/");
browser.start();
SeleniumLoginUtil.managerLogin(browser);
}
/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
this.browser.stop();
}
}
public abstract class SeleniumControllerTest {
protected Selenium browser;
/**
* @throws java.lang.Exception
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
/**
* @throws java.lang.Exception
*/
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
}
在每一次JUnit测试之前应该执行:
Selenium browser= new DefaultSelenium("localhost", 4444, "*iexplore",
"http://localhost:8000/macodemo/");
browser.start();
结束时执行this.browser.stop();
Selenium类用来执行Selenium操作,控制浏览器执行Selenium指令。
DefaultSelenium的构造器的参数是你连接的Selenium服务器的ip地址和端口,第三个参数是用来执行Selenium指令的浏览器,最后一个参数是浏览器的起始URL。
执行简单的Selenium指令:
this.browser.open("http://localhost:8080/macodemo/complaint/prepareAddCase.page");
通过Selenium服务器向服务器所在的机器的浏览器发出指令,打开一个URL。
Assert.assertEquals("prepareAddCase出错", "新增個案", this.browser.getTitle());
返回浏览器页面的Title值,判断是否是预期的,如果不是,那么就是出现了错误。
Selenium工作原理
Selenium不同于一般的测试工具。一般的脚本测试工具录制脚本,实际上都是通过拦截浏览器收发的http请求来实现的。事实上并没有办法录制用户对html页面的操作。
当然,对那些执行压力测试的工具来说,这类模拟已经足够。
Selenium的脚本录制工具是通过监听用户对html页面的操作来录制脚本的。Selenium是真正能够监听用户对html页面的操作的录制工具。Selenium完全了解用户操作的html页面。
Selenium可以生成7种语言的脚本:html,java,C#,ruby,python,perl,php。
你可以直接在SeleniumIDE中执行html格式的脚本。你机器上的FireFox将会执行Selenium脚本。
Selenium生成的Html格式的脚本,是Selenium使用Html的语言元素自己开发的一套脚本语言。
如果你要执行其他语言格式的Selenium脚本,那么,你需要使用Selenium服务器。6种语言的使用方法都是一样的。下面,我以Java为例进行说明。
Java执行Selenium测试
首先,需要启动Selenium服务器,然后就可以执行java版本的Selenium测试。
Selenium服务器将会解释Java发来的Selenium脚本,并在Selenium服务器本地打开浏览器执行客户端发来的Selenium脚本,并把结果返回给Java客户端。
其他语言执行Selenium测试也是如此工作的。
Selenium的架构:
Java或者其他客户端,一般作为单元测试程序被执行。它们通过网络与一个或多个Selenium服务器进行通讯。
请注意,浏览器是在服务器端打开的,而不是Java或者其他客户端打开的。
我们可以把客户端看作是发号施令的主人,Selenium服务器是执行Selenium测试的奴隶。
Selenium执行内部原理
SeleniumServer通过网络与Selenium客户端通讯,接收Selenium测试指令。
SeleniumServer通过向浏览器发出JavaScript调用实现对Html页面的全面追踪,并通过网络把执行结果返回给Selenium客户端。
Selenium客户端一般使用单元测试技术实现,通过判断返回的结果与预期是否一致来决定程序是否运行正确。
Selenium是通过javascript来实现对Html页面的操作的。它提供了丰富的指定Html页面元素和操作页面元素的方法。
Selenium打开浏览器时,把自己的JavaScript文件嵌入网页中。然后Selenium的网页通过frame嵌入目标网页。这样,就可以使用Selenium的JavaScript对象来控制目标网页。
Selenium的JavaScript对象中,最重要的就是Selenium对象。它的作用是代表Java中的Selenium接口执行一系列的命令,让浏览器执行。
我应该使用哪种Selenium工具?
考虑如下功能矩阵:
| Selenium | Selenium | Selenium | Selenium |
浏览器支持 | 仅Firefox | 很多 | 所有 | 仅IE |
|
|
|
|
|
需要远程安装 | 否 | 否 | 是 | 否 |
|
|
|
|
|
支持 HTTPS/SSL | 是 | 是* | 是 | 是 |
|
|
|
|
|
支持跨域 | 是 | 是* | 否 | 是 |
|
|
|
|
|
需要Java | 否 | 是 | 否 | 否 |
|
|
|
|
|
将测试结果保存到磁盘 | 是 | 是 | 否 | 是 |
多语言支持 | 仅Selenese | 很多 | 仅Selenese | 仅Selenese |
* = Selenium RC中实验性的支持
浏览器支持:Selenium IDE仅可以在Firefox中工作。Selenium Remote Control直接支持Firefox和IE,此外还支持手动配置很多其它浏览器。Selenium Core几乎可以在任何浏览器中工作,因为它是纯粹的JavaScript。Selenium Core HTA可以在IE最高安全等级(特权)下工作,这意味着它仅能在IE下工作。
需要远程安装:Selenium Core需要在被测试应用程序(Application Under Test, AUT)的网站内安装,因为 同源安全策略,一个阻止进行跨网站脚本访问的安全策略。那意味着你不能坐在那里写一个Selenium Core测试而运行在google.com;如果要那样做,你需要在google.com安装Selenium Core。如果你不能/不会在你的被测应用程序AUT上面安装Selenium Core,不能保证它在AUT相同的服务器上公开可见,那么Selenium Core可能不适合你。
同源安全策略不会限制Selenium IDE,因为它作为Firefox扩展实现;它对于Selenium Core HTA也无效,因为它运行于IE的最高安全级别(特权)上。Selenium RC通过提供一个代理服务器来保证Selenium JS文件看似来自相同的远程服务器,从而符合同源策略;代理服务器欺骗浏览器,让它认为这里的确有像http://www.google.com/selenium/这样的目录。
支持HTTPS/SSL:最新版本的Selenium Remote Control的代理服务器可以支持HTTPS网站(当前所指版本为0.9.0),但是这个支持还是实验性的。参考使用试验性的浏览器加载器
支持跨域:同源策略意味着测试一个服务器/域不能操作另外一个服务器/域。这意味着Selenium Core不能处理跨多个不同域的应用程序。
Selenium RC可以处理切换域的问题,但是这个支持是实验性的。参考使用试验性的浏览器加载器获取更多信息。
需要Java:Selenium Core和Selenium IDE直接在浏览器中运行。Selenium RC需要安装Java(运行代理服务器)。注意,虽然Selenium RC需要Java,你也可以用.NET、Perl、Python和Ruby编写你的RC测试,但是你需要Java来运行代理。
将测试结果保存到磁盘:Selenium Core不能将任何测试结果写到磁盘上(因为它是用javascript写的,它不允许向磁盘写数据),当然你可以将测试结果发送到另外一台服务器保存。(你 可以 通过Selenium COre HTA保存测试结果。)Selenium Remote Control提明确供支持运行测试并用多种语言讲测试结果写入磁盘的功能;它还可以为Selenium Core结果处制理服务器。Selenium IDE是一个Firefox扩展,所以当然支持将测试结果存盘。
语言支持:Selenium Remote Control允许你用任何语言写测试,包括Java、.NET、Pertl、Python和Ruby。(你还可以为其它语言添加测试的支持。)Selenium IDE和Selenium Core仅支持使用"Selenese"测试, 一种简单的脚本语言。Selenese有一些严格的限制:它没有条件(没有"if"表达式),并且它没有循环(没有"For"表达式)。这会使编写复杂的测试变得困难甚至不可能。
使用SeleniumServer执行Selenium测试,是功能最强的,建议使用Unit单元测试和SeleniumServer这种方式执行测试。
Selenium Remote Control:服务器命令行参数
使用示例: java -jar selenium-server.jar [-interactive] [options]
- -port <nnnn>: selenium服务器使用的端口号(默认 4444)
- -timeout <nnnn>: 我们放弃前(超时)所等待的秒数
- -interactive: 进入交互模式。参考教程获取更多信息
- -multiWindow: 进入被测试网站都在单独窗口打开的模式,并且selenium支持frame
- -forcedBrowserMode <browser>: 设置浏览器模式(例如,所有的会话都使用"*iexplore",不管给getNewBrowserSession传递什么参数)
- -userExtensions <file>: 指定一个被载入到selenium的JavaScript文件
- -browserSessionReuse: 停止在测试间重新初始化和替换浏览器。
- -alwaysProxy: 默认情况下,我们尽量少的进行代理;设置这个标志将会强制所有的浏览器通讯都通过代理
- -firefoxProfileTemplate <dir>: 一般情况,我们在每次启动之前都生成一个干净的Firefox设置。您可以指定一个目录来让我们将您的设置拷贝过来,代替我们生成的。
- -debug: 进入debug模式,会有更多的跟踪调试信息
- -htmlSuite <browser> <startURL> <suiteFile> <resultFile>: 使用指定的浏览器(例如"*firefox")在指定的URL(例如"http://www.google.com"),运行一个单独的HTML Selenese (Selenium Core)测试套件然后立即退出。您需要指定HTML测试套件的绝对路径还有我们将会生成的HTML测试结果文件的路径。
- -proxyInjectionMode: 进入代理注入模式,这个模式中selenium服务器作为进入测试程序的所有内容的代理服务器。在这个模式下,可以跨多个域访问,并且还支持如下附加参数:
- -dontInjectRegex <regex>: 附加的正则表达式,代理注入模式能够使用它决定是否进行注入
- -userJsInjection <file>: 指定一个JavaScript文件,将它注入到所有页面中
- -userContentTransformation <regex> <replacement>: 一个正则表达式,对所有被测HTML内容进行匹配;第二个string将会对替换所有匹配的内容。这个标志能够使用多次。一个简单的适合使用这个参数的例子:如果你添加"-userContentTransformation https http"那么测试应用程序的HTML中的所有"https"字符串都会被替换为"http"。
We also support two Javasystem properties:我们还支持两种Java系统属性:-Dhttp.proxyHost和 -Dhttp.proxyPort。使用Selenium服务器作为代理服务器,Selenium RC一般重载你的代理服务器配置。使用这个参数适合在使用Selenium服务器代理的同时使用你自己的代理服务器。使用代理服务器时这样配置:
java-Dhttp.proxyHost=myproxy.com -Dhttp.proxyPort=1234 -jar selenium-server.jar
如果你的HTTP代理服务器需要验证,你还可以在http.proxyHost和http.proxyPort后面设置-Dhttp.proxyUser 和 -Dhttp.proxyPassword。
java-Dhttp.proxyHost=myproxy.com -Dhttp.proxyPort=1234 -Dhttp.proxyUser=joe-Dhttp.proxyPassword=example -jar selenium-server.jar