Seleniumweb Test experience.docx
《Seleniumweb Test experience.docx》由会员分享,可在线阅读,更多相关《Seleniumweb Test experience.docx(18页珍藏版)》请在冰点文库上搜索。
SeleniumwebTestexperience
SeleniumwebTestexperience
简介
Selenium是一个健壮的工具集合,跨很多平台支持针对基于web的应用程序的测试自动化的敏捷开发。
它是一个开源的、轻量级的自动化工具,很容易集成到各种项目中,支持多种编程语言,比如.NET、Perl、Python、Ruby和Java™编程语言。
利用Selenium测试Ajax应用程序
AsynchronousJavaScriptandXML(Ajax)是一种用于创建交互式web应用程序的web开发技术。
Ajax应用程序的一个特征是,不会导致一次重新加载整个页面。
相反,浏览器将具有一个对服务器的异步调用以获得数据,并且只刷新当前页面的特定部分。
要提高web页面的交互性、响应速度和可用性,测试Ajax应用程序的过程需要一些改变。
我们首先刷新web页面,然后就是等待,直到异步调用完成。
完成之后,可以继续进行验证。
此时,出现适当等待时间的问题。
一种选择是在测试应用程序中简单地暂停一段固定的时间,这在大多数情况下都是可行的。
在有些情况下,比如说网络吞吐量很慢时,Ajax调用在暂停一段特定的时间之后没有完成,会导致测试用例失败。
另一方面,如果暂停时间太长,会使得测试慢得不可接受。
Selenium提供了更为高效的处理等待的方式。
一种可能做法是,使用类com.thoughtworks.selenium.Wait来等待一个元素或文本在页面上出现或消失。
可以在until()函数中定义等待的退出条件,或者扩展Wait类来实现等待退出。
清单1是使用Wait类的样例代码。
它将在条件满足时停止等待,或者在超出最大等待时间时返回一个超时异常。
清单1.等待元素或文本出现
Waitwait=newWait(){
publicbooleanuntil(){
returnselenium.isElementPresent(locator);
//orselenium.isTextPresent(pattern);
}
};
wait.wait("",timeoutInMilliseconds);
另一种选择是使用Selenium中的waitForCondition函数,一个JavaScript代码片段将被作为参数传递给该函数。
一旦Selenium检测到条件返回为真,它将停止等待。
您可以等待一些元素或文本出现或者不出现。
JavaScript可以运行在由Selenium.browser.getCurrentWindow()函数弹出的应用程序窗口中。
清单2是检查窗口状态的样例代码。
它只工作在Firefox中。
清单2.等待窗口就绪的状态
Stringscript="varmy_window=selenium.browserbot.getCurrentWindow();"
script+="varbool;";
script+="varreadyState=(my_window.document.readyState);";
script+="if(readyState=='complete'){";
script+="bool='true';";
script+="}";
script+="bool;";
selenium.waitForCondition(script,timeoutInMilliseconds);
如何支持dojo应用程序
Dojo是一个常用的JavaScript工具包,用于构造动态web界面。
使用Selenium测试Dojo应用程序时的一个关键点是认识Dojo小部件和记录它们的操作。
作者定义的Dojo小部件处于抽象级别。
页面运行时,会将Dojo小部件转换成基本的HTML代码。
存在很多由Dojo自动生成的HTML代码,因此,Dojo小部件的认识可能与传统HTML小部件有些不同。
Dojo小部件上执行的操作(包括文本字段、按钮复选框和单选按钮)可能与HTML小部件相同。
但是,Dojo在组合框上提供的日期选择器和其他额外的小部件可能需要特定的处理。
图1.Dojo组合框
使用SeleniumIDE来记录图1中提供的组合框上选中的操作。
单击向下箭头,会出现一个下拉列表。
选中第三项Stack(SWG)。
记录的脚本提供在图2中。
图2.SeleniumIDE记录的脚本
有时,只会由IDE生成第二行脚本。
在这种情况下,添加单击箭头按钮的操作。
对于上面的脚本,如果第一行被重新播放,那么它应该生成下拉列表。
但是它不执行任何操作。
对于多个Dojo小部件,单击并不真正执行单击操作。
将click(locator)更改为clickAt(locator,coordString)或者MouseDown(locator)和MouseUp(locator)。
对于下拉列表,等待时间应该相加。
像图2中展示的脚本一样,选中项的单击操作将会刚好在单击向下箭头按钮之后执行。
它可能会因为下拉列表没有出现而失败。
简单地添加一个pause命令,或者使用waitFor命令等待菜单项元素出现,并继续执行下一个命令。
修改后的将会自动化Dojo组合框上的选择的脚本展示在图3中。
图3.修改后的在Dojo组合框中进行选择的IDE脚本
RC代码展示在清单3中。
清单3.自动化Dojo组合框中选择操作的RC代码
selenium.clickAt("//div[@id='widget_offeringType']/div/div",””);
selenium.waitForCondition("selenium.isElementPresent(\"offeringType_popup2\")","2000");
selenium.clickAt("offeringType_popup2",””);
图4.日期选择器
对于图4中的日期选择器例子,执行的操作可能不会被IDE记录。
编写如下面清单4所示的RC代码。
清单4.自动化选择的RC代码
//clickonthedatefieldbyidyoudefined;
selenium.clickAt("dateBox","");
//waitforthedropdowndateboxbyid;
selenium.waitForCondition("selenium.isElementPresent(\"widget_dateBox_dropdown\")",\
"2000");
//clickpreviousyear2008;
selenium.clickAt("//span[contains(@class,'dijitCalendarPreviousYear')]","");
//clickonthemonthincrease;
//previousmonthwouldcontains‘dijitCalendarIncrease’.
selenium.clickAt("//img[contains(@class,'dijitCalendarIncrease')]","");
//clickonthedatesuchas28ofcurrentmonth;Ifyoudonotspecify
//thetdwiththeattributeofcurrentmonthclass,itwillclick\
onthe//first28ofpreviousmonth;
selenium.click("//td[contains(@class,'dijitCalendarCurrentMonth')]/span[text()='28']");
如本例所示,Dojo应用程序不能通过简单的IDE记录进行测试。
这些脚本有可能不能通过测试。
脚本中有一些丢失的操作,或者操作并不真正工作。
脚本应该调整成能够在IDE和RC中顺利地执行。
对于复杂的Dojo小部件,一种可能的解决方案是使用runScript(String)函数,因为Selenium对JavaScript提供很好的支持。
清单5提供一个JavaScript语句来模拟组合框选择。
清单5.运行JavaScript语句在组合框上进行选择
selenium.runScript("dijit.byId(\"offeringType\").setValue(\"Stack(SWG)");");
如何利用Ant构建Selenium测试
诸如Ant这样的集成工具可以方便地构建Selenium测试和顺畅地运行测试用例,无需单独启动Selenium服务器。
如果Selenium测试由TestNG驱动,那么定义清单6所示TestNGAnt任务。
清单6中假设classpath是TestNG.jar文件的文件路径。
清单6.TestNGAnt任务
主要的目标是启动服务器、运行测试,然后停止服务器。
这些任务按照bulid.xml中定义的顺序实现在清单7中。
清单7.启动服务器、运行测试用例并停止服务器的Ant任务
//localhost:
4444/selenium-server/driver/?
cmd=testComplete"/>
代码更可取的地方是使用waitfor任务来测试Selenium服务器是否已成功启动,而不是暂停一段固定的时间。
如果URLhttp:
//localhost:
4444/selenium-server/driver/?
cmd=testComplete可用,就意味着Selenium已经成功启动。
在清单7中,它最多等待两分钟,并且每100毫秒在本地主机上检查一次Selenium服务器,以提供完整的URL。
start-server任务的详细内容定义在清单8中。
Firefoxprofile模板位置和其他参数可以指定在标记中。
清单8.详细的启动服务器的Ant任务
runTestNG任务的详细内容定义在清单9中。
testng任务的常用属性包括outputDir和xmlfileset。
属性outputDir用于设置输出报告位置。
属性xmlfileset用于包含启动XML文件。
更多选项请参考TestNG正式网站。
清单9.运行测试用例的Ant任务
classpathref="run.cp"haltOnfailure="true">
stop-server任务的详细内容定义在清单10中。
清单10.停止Selenium服务器的Ant任务
src="http:
//localhost:
4444/selenium-server/driver/?
cmd=shutDown"ignoreerrors="true"/>
上面列出了关键任务。
将它们组合到您的构建文件,以便利用Ant完成良好集成的测试。
如何支持测试HTTPS网站
随着互联网日益强调信息安全,越来越多的web应用程序在使用SSL身份认证。
SeleniumIDE默认支持HTTPS,但是SeleniumRC不是这样的。
InternetExplorer和Firefox中的解决方案各不相同。
对于IE,在setup目录下的SSL支持文件夹中在安装一个证书。
如果使用的版本早于Selenium-RC1.0beta2,请使用*iehta运行模式,对于Selenium-RC1.0beta2或更晚的版本,使用*iexplore运行模式。
如果测试HTTPS网站时出现一个如下所示的安全警告,那么单击ViewCertificate并安装HTTPS网站的证书。
如果继续弹出警告,那么考虑在IE中进行配置。
打开Tool>InternetOptions>Advanced,并取消选择security分类下的Warnaboutinvalidsitecertificates和Checkforpublisher'scertificaterevocation。
图5.测试HTTPS网站时的安全警告
创建新的Firefox配置文件
对于Firefox,遵循以下步骤创建定制的配置文件,然后重启服务器:
1.关闭任何正在运行的Firefox实例。
2.利用配置文件管理器firefox-ProfileManager启动Firefox。
3.创建一个新的配置文件。
出现提示时,为配置文件选择一个目录。
将它放在项目文件夹里面。
4.选择配置文件并运行Firefox。
5.利用您将用于测试的自签名证书导航到HTTPSURL。
出现提示时接受证书。
这将在配置文件中创建一个异常。
6.关闭浏览器。
7.转到Firefox配置文件目录。
8.删除该目录中除cert_override.txt和cert8.db文件之外的任何东西。
默认情况下,Selenium将在启动Firefox的实例时创建一个新的配置文件。
当您利用参数-firefoxProfileTemplate/path/to/profile/dir启动服务器时,Selenium将使用一个部分配置文件(带有证书异常)作为创建新配置文件的基础。
这将提供证书异常,而避免了使用整个配置文件带来额外的混乱。
注意一下在SeleniumRC1.0Beta2或更晚版本中以*firefox模式,以及在SeleniumRC1.0Beta2之前的版本中以*chrome模式启动Firefox。
对于运行模式,*chrome或*iehta是较早版本SeleniumRC中支持HTTPS和安全弹出处理的实验模式。
自Selenium-RC1.0beta2起,它们已经稳定成*firefox和*iexplore运行模式。
请谨慎地根据所使用的Selenium版本而使用运行模式。
如何高效地认识不带ID属性的web元素
使用一个有含义的ID或名称是一种高效且方便的定位元素的方式。
它也可以改善测试用例的可读性。
但是为了每个元素具有一个有含义的、惟一的ID(尤其是动态元素),Selenium提供多种策略来认识元素,比如说Xpath、DOM和CSS。
下面是一个样例,使用三种策略来定位图6中提供的动态表格中的一个元素。
HTML代码在清单11中。
图6.动态表格样例
清单11.第一个表格列的HTML代码
Test1
top;">
top;">
top;">
…….
Xpath是一种找到不带特定ID或名称的元素的简单方式。
∙如果知道ID或名称之外的一个属性,那么直接使用@attribute=value定位元素。
∙如果只知道属性值的一些特定部分,那么使用contains(attribute,value)定位元素。
∙如果元素没有指定的属性,那么利用Firebug搜索最近的具有指定属性的父元素,然后使用Xpath从这个元素开始定位想要找到的那个元素。
表1.定位元素的Xpath表达式
定位元素
Xpath表达式
n行的第一列
//table[@id='test_table']//tr[n]/td
n行的图像
//table[@id='test_table']//tr[n]//img
‘Test1’的编辑链接
//a[contains(@href,test1)]
表1展示了定位元素的Xpath表达式。
在Firebug的帮助下,Xpath可以定位元素和复制的元素。
在元素没有ID和名称时,SeleniumIDE将会采用Xpath。
尽管Xpath利用已经录的脚本,有助于保持一致性,但是它高度依赖于web页面的结构。
这使得测试用例可读性差,增加了维护难度。
此外,在InternetExplorer7和InternetExplorer8中运行具有多个复杂Xpath表达式的测试用例可能会太慢了。
在这种情况下,将Xpath更换为DOM,后者是另一种高效的定位策略。
DOM是DocumentObjectModel(文档对象模型)的缩写。
Selenium允许您利用JavaScript遍历HTMLDOM。
Java的灵活性允许在DOM表达式中有多个语句,用分号隔开,以及在语句中定义函数。
表2.定位元素的DOM表达式
定位元素
DOM表达式
n行的第一列
dom=document.getElementById('test_table').rows[n-1].cells[0]
n行的图像
dom=element=document.getElementById('test_table').rows[n-1].cells[1];element.getElementsByTagName('IMG')[0]
‘Test1’的编辑链接
dom=functiontest(){
vararray=document.getElementsByTagName('a');
varelement;for(vari=0;i{if(array[i].attributes.getNamedItem("href").\
value.indexOf('test2')!
=-1){element=array[i];break;}}returnelement};test()
表2展示了定位元素的DOM表达式。
DOM定位器在Firefox和InternetExplorer中也有很好的性能。
组织DOM表达式需要一些JavaScript知识。
有时,DOM表达式对于复杂的元素来说太长了,难以看懂(参见表2中提到的Test1的编辑链接的表达式)。
CSS定位器用于利用CSS选择器选择元素。
当HTML代码具有良好的样式时,可以高效地利用CSS定位器。
样例表达式展示在表3中。
表3.定位元素的CSS表达式
定位元素
CSS表达式
n行的第一列
css=#test_table.test_class:
nth-child(n)
n行的图像
css=#test_table tr:
nth-child(n)>td:
nth-child
(2)>
tabletd:
nth-child
(1)>div> img
‘Test1’的编辑链接
css=a[href*='test2']
一般来说,选用熟悉的定位器表达式,并在脚本结构中保持一致。
如果有多种表达式可执行,那么使用最高效的方式在web页面中定位元素。
如何处理弹出窗口
一般来说,操作都是在由Selenium启动的主窗口中执行。
如果您想在一个由window.open函数生成的新窗口中执行操作,那么将焦点更换到新窗口。
在弹出窗口中执行操
展开阅读全文
相关搜索
|
|