-
判断一下这个WebElement是否在页面上存在
2007-07-23 15:29:58
WebElement 的使用,有时候要判断一下这个WebElement是否在页面上存在,那么通常都会写成
If Browser(“***”).Page(“**”).WebElement(“***”).Exist(1) then
这里是执行代码
End if
但是有时候这样写程序还是会判断错误,呵呵.我经常就碰到这样的问题(不知道是不是我写错了),所以我一般都写成:
Browser(“***”).Page(“**”).WebElement("class:=***","innertext:=***").Exist(1)
这样写通常都不会判断错误了(到现在我还不知道是什么原因造成的??)
关于”弹出的保存对话框”,在录制的时候是没有问题的,但是在回放的时候就很有可能出问题了(通常都是不能点击”保存”按钮),可能是因为回放得太快的原因吧.后来在51上看到有关这样的贴子,就是去移动一下对话框.呵呵..我试了一下,还是不行,
后来就加了wait语句,OK.没问题了.
确定了应该是回放太快的原因.
-
对动态的weblist取得其name值
2007-07-23 15:26:39
近来在做的一个项目中,每发布一次新的版本,运行脚本的时候,总会出错,后来查看了一下,发现每次的weblist的值都会改变,以至于对其进行操作的时候出错.刚开始很笨的呢.,每次都手工去改.呵呵...但是今天在网上发现了一个方法是可以取得其值的.
http://hi.baidu.com/%CB%B9%CE%C4%B0%DC%C0%E0/blog/item/3e8626a484cf05f79152eedd.html
我做了一些修改.把代码贴出来,大家看看:
'由于每次版本的weblist编号都是不同的,所以采用以下方法,动态获取weblis的编号
Set ōDesc = Descrīption.Create()
'在空的对象中添加属性micclass,并赋值为“WebList”
oDesc("micclass").Value = "WebList"
'在制定界面上获取所有属性值为”“weblist”的对象,并赋值给List(注意:赋值后lists类型一个对象数组)
Set Lists = Browser("***").Page("***").ChildObjects(oDesc)
'获取lists里面所有对象的总数
NumList = Lists.Count()
'遍历数组中所有对象
For i = 0 To NumList - 1
ListLen1(i)=Lists(i).object.name
Set ListLen1(i)=Descrīption.Create() '这里如果不用描述性编程的话,会报出对象库找不到对象
ListLen1(i)("Name").value=Lists(i).object.name
ListLen1(i)("class name").value="WebList"
ListLen(i)=Browser("***").Page("***").WebList(ListLen1(i)).Object.length '获取WEBLIST的长度
msgbox ListLen(i)
'lis=Lists(i).object.name
Next呵呵.很简单的几句,可却解决了我的问题...感叹一下网络.....有它真是好啊.
-
关于在录制脚本中经常用到的webList
2007-07-23 15:26:05
我在录制脚本中经常用到webList,刚开始的时候,每次运行时都是手工去改选项值,后来发现这样太麻烦了,所以就写了个循环,而且在选择weblist的值的时候也采用了随机选择的办法.呵呵...这个认为这样就更灵活了.
'获取WEBLIST的长度
ListLen=Browser("***").Page("***").WebList("userForm:_id156").Object.lengthRandomize
IndexNum=Int(ListLen * Rnd)很简单的代码..不过试了很久才写完的
-
在webtable中,检查checkbox是否全都选中了(转)
2007-07-23 15:24:26
近来在测试的项目中,用到了很多的webtable和checkbox,刚开始的时候,因为时间的关系没有做到检查是否全选了(点击一个全选按钮后),今天有空做了一下,呵呵...花了很多时间去调试并且查资料.
1)先取得webtable的rowcount
2)就可以写代码啦....
For chk=1 to webNum '检查是否所有记录都被选中
Set WebChkObj=Browser("Browser").Page("***").WebTable("**").ChildItem(chk,1,"WebCheckBox",0) '''WebChkObj.set "ON" '这里主要是点击checkbox按钮 ,在我的测试代码中是没有用到的,贴出来只是为了让自己知道还可以这么用这个方法
If webChkObj.object.checked=false Then
msgbox"第"&chk&"条选项没有被选中"
End If
Next3)现在可以调试啦.
-
随机选取webtable里checkbox
2007-07-23 15:15:12
这里只写几句重要的,首先读取webtable的行数,然后,随机产生一个数,从这个数一直到webtable的行数为止.Randomize
LoopCounter=int(webNum*Rnd)
For i=1 to LoopCounter 'loopcounter是webtable的行数.
set chkbox=Browser("Browser").Page("***").WebTable("収集").ChildItem(i,1,"WebCheckBox",0)
chkbox.set "ON" '勾选上checkbox
next -
如何使用qtp检查网页中显示的文字颜色为指定的颜色
2007-07-23 15:13:40
以下是17testing.com 的skisky 所给出的答案
这里我们使用DOM(Document Object Model )编程技术来完成这一功能的检查。下面举个例子来说明一下:
以Mercury自带的定票网站为例,在用户注册页面中,用户名、密码和确认密码三项的文字应为红色显示,下面的代码验证了“密码”为红色。
Set Elements = Browser("Register: Mercury Tours").Object.Document.all.tags("TD")
For each Element in Elements
If Element.InnerText=“Password:" Then
strhtml=Element.Innerhtml
n=instr(strhtml,"color=read")
If n<>0 Then
Reporter.ReportEvent 0, Element.InnerText, "Text color is red!"
End If
End If
Next
其中Element.Innerhtml的值为<FONT face="Arial, Helvetica, sans-serif" color=red size=2><B>Password:</B></FONT>, 可以看见color=red就是定义了文字的颜色为红色,所以我们在之后的代码中只要验证Element.Innerhtml中存不存在color=red就可以了。
不是所有的html代码都是如上编写的,有的时候会把style单独存放在一个css文件中,然后在网页中调用,如<FONT class=redcode>Password:</FONT>,所以我们要根据实际取到的Element.Innerhtml值来编写后面的程序,这里就要验证Element.Innerhtml中存不存在class=redcode,即代码第五行改为 n=instr(strhtml,"class=redcode")。
所以大家要根据代码的实际情况来编程验证,这里只提供了一种验证的方法。我也找到另外一种,紧供参考:
How to know color of an object
' Example:
Dim color
'Grey. Use "#000000" for black
color = "#999"
'Get the DOM object for the text
Set TxtObj = Browser("myBrowser").Page("myPage").WebElement("myWebElement").Object
retVal = FontColorCheckPoint ( TxtObj, color )
Function FontColorCheckPoint ( obj, vExpColour )
Dim vActualcolor, sReportStepName, sErrMsg
' get object's color
vActualcolor = obj.currentStyle.color
sReportStepName = "Custom Checkpoint ""Font Color"""
sMsg = "The expected color " & vExpColour & " was found"
'sErrMsg = "The expected color " & vExpColour & " was NOT found. Found " & vActualcolor & " instead."
sErrMsg = "The expected color " & vExpColour & " for the object " & Chr(34) & obj.innertext & Chr(34) & " was NOT found. Found " & vActualcolor & " instead."
If vActualcolor <> vExpColour Then
Reporter.ReportEvent 1, sReportStepName, sErrMsg
FontColorCheckPoint = False
Else
Reporter.ReportEvent 0, sReportStepName, sMsg
FontColorCheckPoint = True
End If
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1261772
-
QTP
2007-07-23 15:10:32
以下为转载
这两周我开始学习QTP测试我们的web服务了;大体的软件使用操作流程是懂了,但具体实施起来特别是代码的组织及函数应用还有一些困难,因为自己只会vb没学习vbscrīpt,所以想和大家交流一下代码等一些基础知识;呵呵,一起学习,加强记忆与应用。
1 生产随机数列
第一种方法
randomize'更新反回的数据
funcation rand(k,n)
n="int((k-1)*rnd+1)
rand=n
end funcation
第二种方法
n="randomnumber.value(1,255)2 当运行到表中的某一行,自动导出表中的所有数据
row=datatable.getcurrentrow
if row="5" then
datatable.export("d:\data.xml")
end if3 参数化密码
webedit("txtpass").setsecure"sdsdf...."
如果参数化密码,可以直接在数据表中写入未加密的密码,它会自动识别,即不用把setsecure改为set4 如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证
if browser("web_name").dialog("dialog_name").exist(1) then'如果不出现="false
error_message=browser("web_name").dialog("diaglog_name").static("用户密码错误!".getRoproperty("text")
if error_message<>(datatable.value("error_info"))then
msgbox(error_message)
end if
browser("web_name").dialog("diaglog_name").close
end if
这里我总结了两点技巧:
一是:对于dialog中,虽然提示信息对象名称是"用户密码错误",但如果信息对象名称是“该用户不存在”,不用更改会自动识别,我想主要是录制第一遍时,“用户密码错误”只是让运行时能找到这个控制,而不管它是什么内容,因为在对象仓库中,text不是决定该对象的属性
二是:如果对于提示信息比较长的,可以用mid(error_message,n,m)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理5 datatable.value("num")只在global形式下的一种省略形式;完整形式是:
datatable.value("num",dtlocalsheet)
-----向某一列的单元格赋值:
datatable.value("column_name",dtlocalsheet)="nanjing"
-----取得某一行具体值:
datatable.setcurrentrow(n)
msgbox(datatable.getsheet("global").getparameter("column_name").Rawvalue)
或者kk=datatable.Rawvalue("column_name","action1")
----在run-time时,动态添加表格与数据
kk=datatable.addsheet("sheet_name").addparameter("column_name","value").name;7 wintreeview一些操作
选择一个条目:wintreeview.select(item)'根是0
根的名称:wintreeview.getitem(0)8 数据库检查点模块:
sub database_check
set con="createobject(""adodb.connection")
con.open "Descrīption="IBM_ODBC;DRIVER=SQL" Server;SERVER="IBM;UID=sa;""&_
"PWD="123456;APP=Quick" Test Pro;WSID="IBM;DATABASE=IBM_table""
'access方式:con.open "DRIVER="{Microsoft" Access Driver (*.mdb)};DBQ="d:\test.mdb""
'Orocle方式:con.open "DRIVER="{Oracle" in OraHome92};SERVER="CESHI;UID=CND_TEST;PWD=CND;DBQ=CESHI;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BA
M=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;""
set record="createobject(""adodb.recordset")
sql="select*from ibm_one_table"
record.open sql,con
DO
if(record("ibm_table_column")="kai")then'//查找表格中有多少kai
num=num+1;
end if
record.movenext
loop until record.eof="true
record.close
set record="nothing
con.close
set con="nothing
end sub9 换行符
vbcr----chr(13)回车符// vblf----chr(10)换行符
vbcrlf----chr(13)+chr(10)结合//type(chr(13)就相当于按了一上键盘上的enter10 Run from step有两种方式:
在Keyword View模式会从本步骤运行到所有action结束
在expert view模式仅会将本action运行结束11 由于对象属性原因,无法识别对象
-----对于对象属性是变化的,可以参数化/或者用正则表达式
-----报匹配多个对象错误,可以spy查看对象,添加一个该对象另一个唯一标识属性
-----有时可以删除对象的变化的属性来解决识别问题
------对于多个完全相同的对象,可以采用添加index,location,createtime等特殊属性来识别
(index:按照程序源码,绘制对象的先后标识对象,所以与其它相同对象是相互依赖,当其它对象发生
变化后,原先的所有对象index属性要发生变化,开始是0;如index:="0;
location:根据对象的位置进行确定,从上到下,从左到右;
CreateTime:按照对象被浏览器打开的先后标识对象)
------另外换一种思维方式,采取等效的方法;比如用键盘代替鼠标或用操作系统本身特性去解决问题12 对系统文件的操作
-------从系统的文件中获取信息及删除文件
get_file_infor("c:\she.mpg")
function get_file_infor(url)
dim fso,f
set fso="createobject(""scrīpting.filesystemobject")
set f="fso.getfile(url)"
f.name:f.size:f.type:f.datacreated'///获取文件信息
fso.deletefile(url)'/////删除文件
end function
--------获取文件夹里所有文件信息
get_folder_infor("c:\kai")
function get_folder_infor(folder)
dim fso,f,f1,n
set fso="createobject(""scrīpting,filesystemobject")
set f="fso.getfolder(folder)
set fc="f.files
for each f1 in fc
select case f1.name
case"kai.mpg","she.mpg","dd.mp3"'//检查文件夹里是否含有这些文件
end select
next
end function13 等待某个对象出现方法
y="......waitproperty(""visible",true,10000)14 防程序中断方法
On error resume next
On error goto handle15 数组的应用:
name="array(1,2,""aa","bb")
name(2)="aa"16 正则表达式应用模板
进行日期YYYY-MM-DD的格式检查 :
Function RegExpTest(patrn, strng)
Dim regEx, Match, Matches ' Create variable.
Set regEx = New RegExp ' Create a regular expression.
regEx.Pattern = patrn ' Set pattern.
regEx.IgnoreCase = True ' Set case insensitivity.
regEx.Global = True ' Set global applicability.
Set Matches = regEx.Execute(strng) ' Execute search.
For Each Match in Matches ' Iterate Matches collection.
RetStr = RetStr & "Match found at position "
RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
RetStr = RetStr & Match.Value & "'." & vbCRLF
Next
RegExpTest = RetStr
End Function
date_pattern="^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((01,3-9])|(1[0-2]))-(29|30)))))$"
result_message=RegExpTest(date_pattern, inputbox("请你输入要检查的时间:"))'用其它正则表达式更改此处
Select case result_message
Case ""
msgbox("你输入的日期格式与标准不匹配")
case else MsgBox(result_message)
end select17 返回一个字符串在另一字符串中的位置
instr(string1,string2)18 有时回放出现找不到对象时,可能不是由于你的代码问题,而是由于你的操作系统等设置问题;
举例说明1:
比如:你录制一个选择磁盘中的文件动作
会录制为:
.winlistview(" ").drap 46,99
.winlistview(" ").draponitem "she.mp3"
下次录制的时候,如果你的系统文件改为不显示扩展名,下次执行的时候,QTP就找不到she.mp3,只能找到she;
举例说明2:
有时由于不同操作系统以及不同的ie,导致有些窗口不能识别,比如在2000下弹出的网页对话框的标题是:
“web对话框",而在2003上是”网页对话框"19 "is+*"类型function
isarray'是否是数组
isconnected'判断QTP是否连接到TD
isdate'是否是合法的日期类型
isempty'判断是否初始化
isNull'判断是否为空值
isNumeric'判断是否是数字型
isobject'判断是否一个功能对象
isready'判断设备是否准备就绪
isRootFolder'是否是根目录20 Action之间的参数传递
例如:在Action1中,有如下代码:
out_str="This is out_string"
RunAction "Action2",oneIteration,out_str
在Acton2中,在其step->Action Properties中的,input参数栏,加入out_str后,
msgbox(parameter("out_str")),就能正确显示参数了21 Wscrīpt.Shell的一些应用
set WshShell ="CreateObject(""Wscrīpt.Shell")
WshShell.SendKeys "{ENTER}" '模拟键盘进行操作
WshShell.AppActivate "Calculator" '启动应用程序22 获取对象属性名称用法:
GetRoProperty----从应用程序界面上获取对象属性(即,是脚本运行时,获取的对象动态属性值)例如:获取对象库中index属性值,似乎只能用GetToProperty,因为应用程序界面上对象没有该属性,只是QTP为识别该对象创立的描述属性;
GetToproperty----从对象库中描述对象的属性,静态值
GetToProperties----获取用于标识对象的属性集;对于这个集合,有count等属性方法23 FireEvent的使用可以对一个对象进行更复杂的操作
如:FireEvent("onfocus") '使一个控件获取焦点
FireEvent("ondblclick") '实现双击/也可以在事件设定中针对该对象事件响应24 模板的应用
-----新建一个文本,输入一些新建Action时常包含的信息,然后保存为ActionTemplate.MST文件,
并复制到QTP/dat目录下;这样每次新建action都会包含固定的信息了;
例如:
'-------------------脚本说明---------------
'产品版本: __Build( )
'测试员:
'编写日期:
'测试功能:
'脚本类型:
'被测试对象初始状态:
'进展程度:
'基本思路:
'主要功能函数:
'历史修改:
'没解决的问题:
'--------------------脚本内容-------------25 在对象库中,两个对象有时不能通过更改属性或命名来达到两个对象完全一致的替换;
在web-mod项目中,我在对象库里添加了一个自动含有index标识属性的对象,然后每次通过SetToproperty来改变
index值,对对象进行数据驱动,使其操作另一个对象,但脚本始终操作原先index属性值的对象;后来,把该对象
删除掉,重新添加一个不自动含有index标识属性的该类对象,然后,手工添加,index标识属性,后来脚本能正常工作了,可见两次的对象属性完全一致,但形成方式不一样,导致的结果往往也不一样;26 childobject的应用
childobject可以返回界面上满足条件的对象集合,而且与对象库里是否有这些对象无关,这就可以简化对象库;
返回的对象集合的count方法可以返回对象个数,这就可以通过下标对单个对象进行操作;在出现index标识对象时
可以进行运用
如:Set m_WinCheck="Descrīption.Create()
m_WinCheck("nativeclass").Value="Button"
set All_WinCheck="Window(""").Dialog("").Childobject(m_WinCheck)
n="All_WinCheck.Count()
for i="0" to n-1
All_WinCheck(i).Set "ON"
next