1.    使用说明

1.1 运行环境:

Selenium IDE工具使用在火狐5.0以上高版本中;

Selenium rc使用在火狐3.0.版本,不适用高版本。

1.2 操作说明

准备工作:为了方便selenium脚本的录制执行,我在本机安装了两个火狐,一个是3.0版本一个是5.0版本。5.0版本是为了录制selenium脚本使用selenium IDE准备的。3.0版本的火狐浏览器是为了执行selenium脚本,使用selenium rc准备的。

1.2.1 使用介绍

1.2.1.1 Selenium IDE使用介绍

1.2.1.1.1 selenium IDE工具安装

启动火狐浏览器(此处本人使用5.0版本)。安装selenium IDE插件。

 

图1 添加selenium插件

 

启动火狐浏览器->点击工具->点击附加组件->在右上方搜索处,输入selenium IDE点击搜索按钮,搜索出相应selenium IDE插件,点击安装即可,然后重启火狐浏览器,在工具中即多出一个selenium IDE工具的选项。

1.2.1.1.2 selenium IDE工具使用

 

图2 启动selenium IDE插件

如图点击selenium IDE选项,则可成功弹出selenium IDE录制工具:

 

图3 selenium IDE工具界面

 

1)  标注1处:

该处为脚本录制起始网址,该处网址为脚本入口处。

2)  标注2处:

该处为脚本录制开始按钮,默认开启即选中。

3)  标注3处:

该处为脚本执行速度设置处,默认为最快,但速度快不利于脚本重放。

4)  标注4处:

该处为脚本录制完成时重放脚本的按钮。

5)  标注5处:

该处为脚本代码展示处。

注:本文档介绍的按钮为录制脚本中利用率较高的按钮,还有很多按钮在此不详细介绍,详情可参考其他文档。

1.2.1.1.3 脚本录制

启动selenium IDE以后,默认红色启动按钮被选中,即可录制脚本,离开selenium IDE,在火狐浏览器中打开需要测试的网址,输入想测试的内容或点击想测试的功能。则在selenium IDE工具中即可同步出现操作过程代码。

 

图4 脚本录制

 

1.2.1.1.4 脚本重放

 

图5 脚本重放

 

录制完成后,取消开始录制按钮,点击重放按钮,在工具下部,即可看到执行的log,查看脚本执行情况。

1.2.1.1.5 脚本初调

在脚本重放过程中会出现因为环境问题或是页面代码无法录制的问题,此时可自行添加脚本执行行或注释来初级调试脚本。

Selenium IDE代码展示界面中,点击鼠标右键,出现如图界面(标注1处):

 

图6 脚本调试

 

其中insert new command是增加命令执行行,添加后可在标注2处,添加执行命令内容;insert new comment是增加批注的选项,点击后在2处,填写批注内容。

最后脚本调试完毕之后,将脚本保存成自己需要的代码即可,本人使用testng来最终执行脚本,所以保存成testng的java代码脚本。

 

图7 脚本代码转换

 

保存后脚本代码为:

package com.example.tests;

 

import com.thoughtworks.selenium.*;

import org.testng.annotations.*;

import static org.testng.Assert.*;

import java.util.regex.Pattern;

 

public class java1 extends SeleneseTestNgHelper {

       @Test public void testJava1() throws Exception {

              selenium.open("/");

              selenium.type("id=kw", "中国");

              selenium.click("id=su");

       }

}

 

1.2.1.2 Selenium rc使用介绍

首先下载selenium-remote-control-1.0.3的zip包。下载后使用selenium-server-1.0.3文件夹下的selenium-server.jar来启动selenium rc服务

1.2.1.2.1 testng+selenium

使用本地窗口命令启动服务,运行testng+selenium的测试代码。

1)   点击“开始”,在运行中输入“cmd”回车,在打开的窗口中,进入selenium-remote-control-1.0.3的selenium-server-1.0.3文件夹下,运行java –jar selenium-server.jar启动服务。

 

图8 命令执行

 

如图所示即服务已经启动。

2)   在eclipse中添加testng插件。

    i.  Eclipse中点击Help->Install new software

  1. 点击Add 在Location输入 http://beust.com/eclipse

 

图9 eclipse的testng插件安装

 

    iii.  选中Testng版本,点击Next,按照提示安装,安装完之后重启eclipse

3)   自动化测试项目编写

        i.  在eclipse中新建web项目选择动态项目,创建完成后在lib中添加tesng相关的jar包。其中还需要将selenium相关jar包放进lib中(具体:如图):

 

图10 lib文件夹

 

      ii.  在新建的项目中新建代码文件和testng的xml,

步骤:点击文件(file)->新建(new)->其他(other)->testng->testing class,如图:

 

图11 创建testng类

 

点击“next”,如图:设置java文件所在的src下的文件夹目录,类名,testng的xml文件名。【注意xml文件名一定要带.xml后缀,不然在运行中会出现问题。】

 

图12 创建testng详细页

 

点击“finish”,完成文件创建,开始代码编写。

    iii.  将转化后的selenium代码粘贴进去,如下:

package com.selenium.test;

 

import org.testng.annotations.Test;

import com.thoughtworks.selenium.DefaultSelenium;

import com.thoughtworks.selenium.SeleneseTestNgHelper;

 

public class NewTest extends SeleneseTestNgHelper{

  @Test

  public void test()throws Exception {

       //下框中的代码为实际运行中需要设定的浏览器类型及运行前提设置代码,非自动生成。

Integer port = 4444;//防止使用时出现500错误

       String browserString= "*firefox";

       String url = "http://www.baidu.com/";//起始url

      

       selenium = new DefaultSelenium("localhost",port,browserString,url) {

          

       public void open(String url) { commandProcessor.doCommand("open", new String[] {url,"true"});

};

       };

       selenium.start();//开始启动浏览器

       selenium.setSpeed("5000");//设置脚本运行速度

       selenium.setTimeout("1800000");//设置超时时长,单位为毫秒

         //以下代码为自动生成的代码

        selenium.open("/");

       selenium.type("id=kw", "中国");

        selenium.click("id=su");

}

}

以上步骤完成后,点选testng的xml文件运行,即可开始调试selenium自动化测试脚本。

 

1.2.1.2.2hudson+ant+testing+selenium

使用hudson+ant+testing+selenium运行测试代码

1)        Hudson的使用方法可参见《XK_熙康技术开发部_hudson配置文档1.0.doc》文档,此处不做详细介绍。

2)        Ant脚本的编写,较好的样例如下:【build.xml】

<?xml version="1.0"?>

<project name="selenium-test" default="start_server_and_run_tests" basedir=".">

<!-- 定义全局变量-->

<property name="selenium.dir" value="${basedir}/selenium" /> 

<property name="selenium.src.dir" value="src" />

<property name="selenium.classes.dir" value="${basedir}/webapp/WEB-INF/classes" /> 

<property name="selenium.dist.dir" value="${selenium.dir}/dist" /> 

<property name="selenium.lib.dir" value="${basedir}/webapp/WEB-INF/lib" /> 

<property name="project.encoding" value="UTF-8" />

 

<path id="selenium.classpath.main"> 

        <pathelement location="." /> 

        <pathelement location="${selenium.classes.dir}" />   

    <pathelement location="${selenium.lib.dir}/selenium-java-client-driver.jar" />

    <pathelement location="${selenium.lib.dir}/testng-5.8-jdk15.jar" />

        <fileset dir="${selenium.lib.dir}/"> 

            <include name="**/*.jar" /> 

        </fileset> 

</path>

<!--启动Selenium Server  -->

    <!--<property name='str' value='-Dibm.stream.nio=ture -log selenium.log -browserSideLog'/>-->

<target name="start_selenium_server"> 

        <echo message="starting selenium server-1" /> 

        <java jar="${selenium.lib.dir}/selenium-server.jar" fork="true" spawn="ture" output="selenium.log" > 

        <arg line="-timeout 6000" /> 

<!-网络代理设置->

        <jvmarg value="-Dhttp.proxyHost=**.**.com"/>

         <jvmarg value="-Dhttp.proxyPort=8080"/>

        <jvmarg value="-Dhttp.proxyUser=username"/>

        <jvmarg value="-Dhttp.proxyPassword=password"/>

       

        </java>

    <echo message="starting selenium server-2" /> 

</target>

 

 <target name="selenium.clean"> 

        <delete dir="${selenium.dir}/dist" failonerror="false"/> 

        <delete dir="${selenium.dir}/test-output" failonerror="false"/> 

    <echo message="cleaning selenium server" /> 

 </target>

  <!-- 编译测试代码,并且Copy资源文件-->

    <target name="selenium.compile"> 

        <echo message="starting to compile the classess" /> 

        <!--clean the old classes--> 

        <delete dir="${selenium.dist.dir}" failonerror="false" /> 

        <!--create new dist dir--> 

        <mkdir dir="${selenium.dist.dir}/com/selenium/" /> 

        <!--compile--> 

        <javac classpathref="selenium.classpath.main" srcdir="${selenium.src.dir}" destdir="${selenium.classes.dir}" encoding="${project.encoding}" /> 

          <copy todir="${selenium.dist.dir}"> 

            <fileset dir="${selenium.src.dir}" /> 

         </copy> 

        <!--<copyfile dest="${selenium.dist.dir}/log4j.properties" src="${selenium.src.dir}/log4j.properties" />  -->

 

  </target>

 

<!--用TestNG执行测试过程-->

 <taskdef resource="testngtasks" classpath="${selenium.lib.dir}/testng-5.8-jdk15.jar" /> 

<target name="selenium.test">

    <echo message="starting to compile the testng-1" />

         <testng classpathref="selenium.classpath.main" failureproperty="test.failed" outputdir="${selenium.dir}/test-output" sourcedir="${selenium.src.dir}"> 

            <jvmarg value="-Dselenium.port=4444" /> 

            <!--xml test suite file -->       

            <xmlfileset dir="${selenium.src.dir}" > 

              <include name="testng.xml" /> 

            </xmlfileset> 

         </testng> 

         <antcall target="stop_selenium_server" /> 

    <echo message="starting to compile the testng-2" />

</target>

   

<target name= "transform" >

 

  <xslt in= "${selenium.dir}/test-output/testng-results.xml" style= "${selenium.dir}/test-output/testng-results.xsl"

 

      out= "${selenium.dir}/test-output/SeleniumLog.html " >

 

 <!-- you need to specify the directory here again -->

 

<param name= "testNgXslt.outputDir" expression= "${selenium.dir}/test-output" />

 

            <classpath refid= "selenium.classpath.main" />

 

            </xslt>

 

        </target>

 

<!--Default的Target,也是最关键的部分 -->

 <target name="start_server_and_run_tests" depends="selenium.clean, selenium.compile" description="start selenium server and run tests"> 

         <parallel> 

             <antcall target="start_selenium_server" /> 

             <sequential> 

                <echo taskname="waitfor" message="wait for selenium server launch" /> 

                <waitfor maxwait="2" maxwaitunit="minute" checkevery="10"> 

                    <http url="http://localhost:4444/selenium-server/driver/?cmd=testComplete" /> 

               </waitfor> 

                <antcall target="selenium.test"> 

                </antcall> 

            </sequential> 

        </parallel> 

 </target>

    <!--终止Selenium Server  -->

        <target name="stop_selenium_server"> 

               <echo message="going to stop the selenium server" /> 

               <get taskname="selenium-shutdown" src="http://localhost:4444/selenium-server/driver/?cmd=shutDownSeleniumServer" dest="stop.out" ignoreerrors="true" /> 

         </target>

 

</project>

其中需要根据自身配置情况修改的有:

  1. “定义全局变量”部分:其中文件夹位置的定义是由个人使用情况设置的。
  2. “启动Selenium Server”,target->start_selenium_server:其中网络代理设置是根据个人用户名密码和公司代理情况设置的。
  3. 用TestNG执行测试过程,target->testngtasks:其中testng-5.8-jdk15.jar可根据实际情况更换名称及testng的xml文件的名称。

 

注意:

有了ant脚本来控制selenium本地服务的启动结束过程后,就不需要再通过本地的运行窗口(即图8)来启动或停止服务了,可直接运行build.xml来启动服务开始运行selenium脚本。

 

3)        Testng的xml文件内容支持多个selenium脚本并行,较好的样例如下:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

 

<suite name="Suite1"    verbose="1" >

  <test name="Nopackage" >

    <classes>

       <class name="NoPackageTest"  />

    </classes>

  </test>

 

  <test name="Regression1"   >

    <classes>

      <class name="test.sample.ParameterSample"  />

      <class name="test.sample.ParameterTest" />

    </classes>

  </test>

</suite>

详情可参考《testng介绍.doc》文档。

4)   Selenium文件则需要在实际测试环境中录制,录制好后根据需要转存成相应的代码格式,保存到项目中。

准备好以上各项后将在本地环境,即通过在eclipse中新建测试工程,在工程的lib包中添加全jar包,在src源代码文件夹中添加selenium脚本代码及testng的xml文件,并把ant脚本的build.xml文件也添加到工程外与src文件夹并行的位置后,将eclipse中的工程复制到hudson的新建的测试项目中的workspace文件夹下,点击hudson的“立即构建”按钮自动执行selenium自动化测试。

1.3 问题总结

1、  selenium自动化测试的使用前提:因为selenium自动化测试是通过界面的前台操作录制脚本,然后生成代码,结合其他工具实现自动化测试的,所以如果是UI界面经常变更的系统,就不利于自动化脚本的长期使用和维护,会增加很多工作量在脚本的变更上。

2、  selenium自动化脚本的执行速度:如果不设置自动化脚本的执行速度,脚本执行过快,无法判断是否执行了我们想要的步骤,并且会阻碍脚本执行的顺畅性,因为服务器很多时候是需要时间来加载的。设置速度的语句:selenium.setSpeed("5000");//设置脚本运行速度

3、  selenium脚本执行时等待页面加载的语句及区别:

1)    selenium.waitForPageToLoad("120000");该语句会等待所有页面元素都加载成功后才开始执行下一语句。其中参数为毫秒。

2)    如下语句则是通过判断,测试人员所需的页面元素是否存在,而执行下一语句,因为在很多时候我们不需要将页面的每一个元素都加载完成,才开始下一步骤,只要我们想操作的功能的元素加载完毕即可开始操作,这样较灵活也较快捷。时间设置单位为秒。

for (int second = 0;; second++) {

           if (second >= 300) fail("timeout");

           try { if (selenium.isElementPresent("id=highValue")) break; } catch (Exception e) {}

           Thread.sleep(1000);

       }

3)    pause(120000);该语句是暂时停止selenium所有脚本的执行,等待服务器加载。时间设置单位为毫秒。

4、  以下语句是解决录制过程中iframe插件不能正常被录制的情况的,需要我们自己添加一些语句:

       selenium.selectFrame("//iframe[@class='ke-iframe']");//选择iframe插件

       selenium.type("//body[@class='ke-content']", "回复话题");//填写iframe插件中填写的内容

       selenium.selectFrame("relative=top");//回到插件的顶端,方便选择其他的iframe插件

       selenium.selectWindow(null);//回到主窗口,方便后续操作主窗体的内容

       selenium.click("id=提交");