selenium203.docx
《selenium203.docx》由会员分享,可在线阅读,更多相关《selenium203.docx(17页珍藏版)》请在冰豆网上搜索。
selenium203
Selenium1.0(SeleniumRC)
SeleniumRC是在Selenium2之前selenium维持最久的,功能最强大一个项目。
Selenium1同样被Selenium2所支持
SeleniumRC工作原理
首先,我们介绍下SeleniumRC组件的工作方式和在测试脚本中担当的角色。
RC组件
●SeleniumServer:
启动和终止浏览器,中断和运行Selenesecommands,担当HTTPproxy,拦截和检查browser和AUT之间的Httpmessage。
●Client:
在各种程序语言和SeleniumRCServer之间提供接口。
架构图:
如图所示,client通过执行selenium命令与Server进行交互,Server通过执行Selenium-Corejavascript命令与浏览器进行交互,浏览器通过解析javascript来执行Selenium命令,它运行Selenese来执行和验证你的指定测试脚本。
SeleniumServer
SeleniumSever从testprogram接受Selenium命令,执行他们,然后将该testprogram的测试报告返回回来。
RCserver绑定SeleniumCore,并且自动将SeleniumCore注入到浏览器,这个过程发生在testprogram打开浏览器的时候,SeleniumCore是一个javascript程序它包含了所有通过浏览器解释和执行selenese命令的javascript方法。
Server从testprogram中通过简单的httpget/post请求来获得selenese命令。
这表明你可以通过任何可以发送http请求的语言来自动地在浏览器上执行selenium测试。
ClientLibraries
Clientlibraries为你设计的用例运行selenium命令提供了支撑。
对应不同的语言提供了不同的clientlibrary。
Clientlibraries提供了程序接口(API)、让你的程序调用Selenium命令的方法。
通过这些接口,方法就能支持这些selenese命令。
Clientlibraries调用一个selenese命令,将这个命令传递到seleniumserver来执行指定动作或者测试指定的AUT(applicationundertest)。
Clientlibraries同样接受这个命令的结果到testprogram。
然后testprogram可以接受和存储这个report作为一个变量,根据这个变量来确定是否成功执行了测试代码,或者根据返回值进行一场处理。
安装
所谓的安装即为下载相应语言的jar包。
安装SeleniumServer
SeleniumRCServer只是一个jar包,不需要特定的安装。
运行SeleniumServer
在开始测试之前,你必须启动server。
使用CMD命令,进入seleniumRCserver所在的文件目录,运行下面的命令:
java-jarselenium-server-standalone-.jar
这个可以我们可以简单的写一个批处理文件。
使用javaClientDriver
●下载Seleniumjavaclientdriver
●提取selenium-java-.jar
●打开javaIDE
●创建一个javaproject
●将selenium-java-.jar加到项目的classpath中
●使用seleniumIDE录制并导出一个java测试脚本,导入到项目,或者使用selenium-java-clientAPI编写一个脚本,可以使用Junit或者testNG启动测试用例,或者编写自己的main程序。
●通过控制台运行seleniumserver
●运行测试用例通过控制台命令或者javaIDE。
具体配置方法查看:
http:
//seleniumhq.org/docs/appendix_installing_java_driver_client.html#configuring-selenium-rc-eclipse-reference
Selenese运行程序
SeleniumRC最基础的功能就是将slenese转化为对应的程序语言,以下将提供示例:
Sampletestscript
让我们开始一个简单的slenese测试脚本,假设我们通过selenium-IDE脚本:
、
注:
这个例子是访问
Selenese编写代码
如果你有一定的面向对象语言的学习经验,通过阅读一下代码可以让你很好的了解selenium是如何运行selenese命令的。
/**AddJUnitframeworktoyourclasspathifnotalreadythere
*forthisexampletowork
*/
packagecom.example.tests;
importcom.thoughtworks.selenium.*;
importjava.util.regex.Pattern;
publicclassNewTestextendsSeleneseTestCase{
publicvoidsetUp()throwsException{
setUp(""*firefox");
}
publicvoidtestNew()throwsException{
selenium.open("/");
selenium.type("q","seleniumrc");
selenium.click("btnG");
selenium.waitForPageToLoad("30000");
assertTrue(selenium.isTextPresent("Results*forseleniumrc"));
}
}
编写自己的测试用例
现在我们示例如何编写自己的测试用例。
主要分两个工作:
●通过Selenium-IDE将脚本转化为程序语言
●编写主函数来执行这个代码
我们可以选择testNG或者JUnit作为框架。
现在我们将以java为示例。
对java代码,我们一般以JUnit或者TetNG作为框架,且Eclipse支持这两个框架。
packagecom.example.tests;
//Wespecifythepackageofourtests
importcom.thoughtworks.selenium.*;
//Thisisthedriver'simport.You'llusethisforinstantiatinga
//browserandmakingitdowhatyouneed.
importjava.util.regex.Pattern;
//Selenium-IDEaddthePatternmodulebecauseit'ssometimesusedfor
//regexvalidations.Youcanremovethemoduleifit'snotusedinyour
//script.
publicclassNewTestextendsSeleneseTestCase{
//WecreateourSeleniumtestcase
publicvoidsetUp()throwsException{
setUp(""*firefox");
//Weinstantiateandstartthebrowser
}
publicvoidtestNew()throwsException{
selenium.open("/");
selenium.type("q","seleniumrc");
selenium.click("btnG");
selenium.waitForPageToLoad("30000");
assertTrue(selenium.isTextPresent("Results*forseleniumrc"));
//Thesearetherealteststeps
}
}
学习API
SeleniumRCAPI有自己的命名规范,如果你对selenese有一定的了解,那么很多interface只需要看名字我们就能知道是什么意思。
这里我们将讲解一学最关键的和容易被忽略的东西。
启动浏览器
setUp(""*firefox");
这个示例是打开一个浏览器,通过参数的设置来改变浏览器的呈现方式。
浏览器初始化时需要的参数如下:
Host:
指定服务器所在的位置,通常情况下,一般server和client都是在同一台机器上被启动,所以在这个例子里host是被省略的。
但是在有些client上是可以被随意指定的。
Port
服务器监听客户端的TCP/IP的端口。
Browser
所需要测试的浏览器。
Url
所需要测试的网址。
注:
有些client的libraries要求启动浏览器时,使用start()方法。
运行命令
一旦你已经初始化了浏览器,那么你就可以运行selenese命令通过对应的方法。
结果报告
SeleniumRC没有自己产生报告的处理机制。
但是他允许你产生自动以的报告,通过一写组件。
这样是相当方便的,但是如果你想得到一个简单快捷的结果的?
那么一些已经存在的类库和测试框架可以很好的满足我们的需求。
测试框架的报告工具
测试框架已经兼容了多种程序语言。
Java有两个通用的测试框架,testNG,JUnit。
整个测试框架在这就不做介绍,我们只针对于selenium相关的部分进行介绍。
测试报告libraries
通过第三方的类库来生产报告也是非常有效的,这些类库可以生产多种形式的文档,如HTML,PDF等。
最好的方式
大多数人第一次使用测试框架都是调用他的报告功能。
通过他们我们可以现成的得到很多有用点库来完成操作,这比自己开发节省了相当大的成本。
在开始使用selenium的时候,毫无疑问你需要打印运行情况,这样你就会需要开发自己的报告,等同的我们也可以使用一些第三方类库或者测试框架。
不管怎样,在最初的时候,我们一般会自己开发适合自己的报告形式。
测试报告示例
我们将举例在不同语言下支持selenium的工具,下面将例举一些常用的和广泛的被selenium工程师使用的报告工具。
TestReportsinjava
●如果你的selenium代码使用的是JUnit,那么JUnit自带的报告将可以被很好的使用。
具体见:
http:
//ant.apache.org/manual/Tasks/junitreport.html
●如果你的selenium代码使用的是TestNG,同样TestNG也提供了很好的报告支持,且为HTML格式。
具体见:
http:
//testng.org/doc/documentation-main.html#test-results
●ReportNG是一种在testNG下的HTML报告补丁。
他是testNG默认报告的一种替换。
ReportNG提供一种简单的,颜色区分明显的测试报告。
http:
//reportng.uncommons.org/
●当然,可以使用TestNG-xslt生成一个漂亮的总体报告,如下图所示
●可以通过LoggingSelenium直接在selenese命令中打印log。
丰富用例
现在我们已经知道使用SeleniumRC整个过程和如果在程序中添加自己的逻辑。
这个在任何程序下都是相同的。
程序运行是靠条件和循环控制的。
另外,你可以报告进展情况通过I/O.在这部分,我们将着重介绍如何将程序语言和selenium相结合来解决一些测试问题。
你将发现,你将会从简单的验证页面元素是否存在,转向验证含有多页面和数据验证的动态功能,而这些是需要程序逻辑来验证预期结果的。
基本上,seleniumIDE不支持迭代和标准的条件语句。
你可以通过在selenese参数中潜逃javascript来做判断,但是迭代还是不可以的,不过判断将变得相当简单,另外,你也需要异常处理。
针对以上的原因,我们将在这部分举例使用通用的技术来提高我们自动化测试中的验证效率。
Iteration
迭代可能是一种在测试中最为常用的事情。
比如,你想执行多次查询,或者你需要验证一个结果的集合。
这里将使用google搜索最为示例:
C#:
//CollectionofStringvalues.
String[]arr={"ide","rc","grid"};
//ExecuteloopforeachStringinarray'arr'.
foreach(Stringsinarr){
sel.open("/");
sel.type("q","selenium"+s);
sel.click("btnG");
sel.waitForPageToLoad("30000");
assertTrue("Expectedtext:
"+s+"ismissingonpage."
sel.isTextPresent("Results*forselenium"+s));
}
条件语句
这里我们将举例如何在测试用例中使用条件判定。
一个很常见的问题就是当你在运行测试的时候预期结果没有出现在页面上。
selenium.type("q","selenium"+s);
如果元素“q”没有出现在页面上,则会抛出异常:
com.thoughtworks.selenium.SeleniumException:
ERROR:
Elementqnotfound
如上所示,这些很可能会出现在我们的测试过程中,这些的发生往往会导致后续打代码无法运行。
一种比较好的吃力方式是,在一开始就验证是否已经出现了这个元素,如果未出现,则走相应的路径。
//Ifelementisavailableonpagethenperformtypeoperation.
if(selenium.isElementPresent("q")){
selenium.type("q","Seleniumrc");
}else{
System.out.printf("Element:
"+q+"isnotavailableonpage.")
}
用例中插入javascript
Javascript的出现是非常惊喜的,它能够很好的执行那些selenium不支持的操作。
SeleniumAPI的getEval方法能够通过seleniumRC来执行javascript。
考虑到checkbox没有静态的标识。
在这种情况下我们就可以使用javascript来得到所有checkbox的id,然后操作他们。
publicstaticString[]getAllCheckboxIds(){
Stringscript="varinputId=newArray();";//Createarrayinjavascript.
script+="varcnt=0;";//Counterforcheckboxids.
script+="varinputFields=newArray();";//Createarrayinjavascript.
script+="inputFields=window.document.getElementsByTagName('input');";//Collectinputelements.
script+="for(vari=0;iscript+="if(inputFields[i].id!
=null"+
"&&inputFields[i].id!
='undefined'"+
"&&inputFields[i].getAttribute('type')=='checkbox'){";//Ifinputfieldisoftypecheckboxandinputidisnotnull.
script+="inputId[cnt]=inputFields[i].id;"+//SavecheckboxidtoinputIdarray.
"cnt++;"+//incrementthecounter.
"}"+//endofif.
"}";//endoffor.
script+="inputId.toString();";//Convertarrayintostring.
String[]checkboxIds=selenium.getEval(script).split(",");//Splitthestring.
returncheckboxIds;
}
计算一个页面中的图片数
selenium.getEval("window.document.images.length;");
ServerOptions
当一个server开始运行后,通过命令行操作我们可以更改server的默认行为。
Server的启动命令:
java-jarselenium-server-standalone-.jar
通过-h命令可以调出所有的操作:
java-jarselenium-server-standalone-.jar–h
代理设置
如果你的AUT是一个HTTPproxy,那么你就需要配置http.proxyHost,http.proxyPort,http.proxyUser和http.ProxyPassword那么就需要如下代码:
java-jarselenium-server-standalone-.jar-Dhttp.proxyHost=-Dhttp.proxyPort=8080-Dhttp.proxyUser=username-Dhttp.proxyPassword=password
多窗口模式
如果你使用的是selenium1.0,那么就可以跳过这块,因为多窗口模式是默认行为。
但是你的版本是1.0之前,selenium默认运行subframe。
-multiwindow
-singlewindow
定义firefox配置文件
Firefox不能永兴两个单独的实例,除非为每一个实例分配一个配置文件。
在Selenium1.0之后,seleniumRC会自动为每一个实例分配一个配置文件。
如果你是用的是1.0以后的版本,可以跳过这部分。
首先需要创建一个分开的Firefox配置文件:
firefox.exe-profilemanager
firefox.exe–P
之后,当你运行seleniumserver时,告诉服务器是用新的配置文件
-firefoxProfileTemplate"pathtotheprofile"
注意:
将新生产的配置文件放置到新建的文件夹中,否则它将替换系统中默认的配置文件。
RunSeleneseDirectlyWithintheServerUsing–htmlSuite
我们可以通过seleniumserver运行selenesehtml文件。
java-jarselenium-server-standalone-.jar-htmlSuite"*firefox"
"""c:
\absolute\path\to\my\HTMLSuite.html"
"c:
\absolute\path\to\my\results.html"
SeleniumServerlogging
Server-sideLogs
当你在运行seleniumserver的时候,可以通过log操作打印sever的log。
java-jarselenium-server-standalone-.jar-logselenium.log
Browser-SideLogs
浏览器端javascript的log也是重要的信息,在很多情况下,这个log比server的更重要。
java-jarselenium-server-standalone-.jar–browserSideLog
打开指定的浏览器
你可以通过seleniumRC指定浏览器,如果你本机中存在一个浏览器的多个版本时,这是极为有效的方法。
*custom
SeleniumRC的架构
同源策略
Selenium面临的主要限制就是同源策略。
这个安全限制被应用到了所有的浏览器,他的作用是使一个网站的内容不能被其他网站的脚本使用。
同源策略规定任何浏览器载入的代码只能作用于相同站点的域,不能作用于其他站点。
代理注入
Selenium第一避免同源策略的方法是代理注入。
在代理注入的模式下,seleniumserver作为客户端在测试站点和浏览器之间配置HTTPProxy,这样使AUT得到一个伪造的URL。
当用例开始执行的时候,进行了下列的操作:
1.Client建立与selenium-RCserver的连接;
2.SeleniumRCserver启动一个浏览器并打开一个url,并将selenium-Core的javascript代码注入到浏览器载入的页面中;
3.Client发送selenese命令到server;
4.Server解释命令,然后触发对应的javascript在浏览器中执行命令;
5.Selenium-Core指示浏览器操作