现在的位置: 首页 > 综合 > 正文

Selenium全方位解读–Selenium深入浅出之一

2012年02月17日 ⁄ 综合 ⁄ 共 8120字 ⁄ 字号 评论关闭

 

                                         Selenium全方位解读

                                                                                   Selenium深入浅出之一

 

 

                                                                                      By  沈东良

                                                                                 http://blog.csdn.net/shendl/ 

 




 Selenium全方位解读--Selenium深入浅出之一

 Selenium中文参考手册--Selenium深入浅出之二 

 SeleniumJavaScript--Selenium深入浅出之三


 

 



Selenium—Web界面测试工具

n  Selenium可以使用录制工具录制脚本,测试页面。

n  Selenium可以生成类html代码,java代码,ruby代码等。

n  Selenium录制工具根据id属性定位html元素

 

需要的软件

1,  安装FirefoxSelenium IDE插件,Firebug插件。

2,  解压Seleniumselenium-remote-control包,得到一个服务器。

3,  获取selenium-java-client-driver.jar,用于java语言的Selenium开发。

 

Selenium IDE的使用

1FireFox--工具--selinum IDE

2,点击录制按钮,开始记录一个测试。可以使用浏览器进行操作。

最后点击Selenium IDE的停止录制按钮。

可以看到html,Java,Ruby等形式的脚本语言。

可以执行。

    可以根据选择的浏览器,使用选择的浏览器执行脚本中的命令。

 

SeleniumIDE除了记录 Html请求和AJAX调用的操作。其他不涉及通讯的操作,也会被录制。其他的自动脚本录制工具,如WebLoadLoadRunner都是只记录http请求,不能真正记录对页面的操作。

 

3,脚本  可以格式化为多种语言。  这个是使用.js文件实现的。

 

4selinum使用xpathcss等选择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 extends
SeleneseTestCase {

         public
void setUp() throws Exception {

                   setUp("http://auto.sohu.com/",
"*chrome");

         }

         public
void 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 Demo006ControllerTest
extends 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的架构:

 

Selenium结构图

 

        Java或者其他客户端,一般作为单元测试程序被执行。它们通过网络与一个或多个Selenium服务器进行通讯。

请注意,浏览器是在服务器端打开的,而不是Java或者其他客户端打开的。

我们可以把客户端看作是发号施令的主人,Selenium服务器是执行Selenium测试的奴隶。

 

Selenium执行内部原理

SeleniumServer通过网络与Selenium客户端通讯,接收Selenium测试指令。

SeleniumServer通过向浏览器发出JavaScript调用实现对Html页面的全面追踪,并通过网络把执行结果返回给Selenium客户端。

Selenium客户端一般使用单元测试技术实现,通过判断返回的结果与预期是否一致来决定程序是否运行正确。

Selenium是通过javascript来实现对Html页面的操作的。它提供了丰富的指定Html页面元素和操作页面元素的方法。

Selenium打开浏览器时,把自己的JavaScript文件嵌入网页中。然后Selenium的网页通过frame嵌入目标网页。这样,就可以使用SeleniumJavaScript对象来控制目标网页。

SeleniumJavaScript对象中,最重要的就是Selenium对象。它的作用是代表Java中的Selenium接口执行一系列的命令,让浏览器执行。

 

我应该使用哪种Selenium工具?

考虑如下功能矩阵:

 

Selenium
IDE

Selenium
Remote Control

Selenium
Core

Selenium
Core HTA

浏览器支持

Firefox

很多

所有

IE

 

 

 

 

 

需要远程安装

 

 

 

 

 

支持
HTTPS/SSL

*

 

 

 

 

 

支持跨域

*

 

 

 

 

 

需要Java

 

 

 

 

 

将测试结果保存到磁盘

多语言支持

Selenese

很多

Selenese

Selenese

* = Selenium RC中实验性的支持

浏览器支持Selenium IDE仅可以在Firefox中工作。Selenium Remote Control直接支持FirefoxIE,此外还支持手动配置很多其它浏览器。Selenium Core几乎可以在任何浏览器中工作,因为它是纯粹的JavaScriptSelenium Core HTA可以在IE最高安全等级(特权)下工作,这意味着它仅能在IE下工作。

需要远程安装Selenium Core需要在被测试应用程序(Application Under Test, AUT)的网站内安装,因为 同源安全策略http://wiki.javascud.org/images/icons/linkext7.gif,一个阻止进行跨网站脚本访问的安全策略。那意味着你不能坐在那里写一个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
可以处理切换域的问题,但是这个支持是实验性的。参考使用试验性的浏览器加载器获取更多信息。

需要JavaSelenium CoreSelenium IDE直接在浏览器中运行。Selenium RC需要安装Java(运行代理服务器)。注意,虽然Selenium RC需要Java,你也可以用.NETPerlPythonRuby编写你的RC测试,但是你需要Java来运行代理。

将测试结果保存到磁盘Selenium Core不能将任何测试结果写到磁盘上(因为它是用javascript写的,它不允许向磁盘写数据),当然你可以将测试结果发送到另外一台服务器保存。(你 可以 通过Selenium COre HTA保存测试结果。)Selenium Remote Control提明确供支持运行测试并用多种语言讲测试结果写入磁盘的功能;它还可以为Selenium Core结果处制理服务器。Selenium IDE是一个Firefox扩展,所以当然支持将测试结果存盘。

语言支持Selenium Remote Control允许你用任何语言写测试,包括Java.NETPertlPythonRuby。(你还可以为其它语言添加测试的支持。)Selenium IDESelenium 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>: 指定一个被载入到seleniumJavaScript文件
  • -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 Java
system properties
:我们还支持两种Java系统属性:-Dhttp.proxyHost
-Dhttp.proxyPort。使用Selenium服务器作为代理服务器,Selenium RC一般重载你的代理服务器配置。使用这个参数适合在使用Selenium服务器代理的同时使用你自己的代理服务器。使用代理服务器时这样配置:

java
-Dhttp.proxyHost=myproxy.com -Dhttp.proxyPort=1234 -jar selenium-server.jar

如果你的HTTP代理服务器需要验证,你还可以在http.proxyHosthttp.proxyPort后面设置-Dhttp.proxyUser  -Dhttp.proxyPassword

java
-Dhttp.proxyHost=myproxy.com -Dhttp.proxyPort=1234 -Dhttp.proxyUser=joe
-Dhttp.proxyPassword=example -jar selenium-server.jar

【上篇】
【下篇】

抱歉!评论已关闭.