显示标签为“SilkTest”的博文。显示所有博文
显示标签为“SilkTest”的博文。显示所有博文

2008年10月23日星期四

SilkTest:使用杀进程的方式退出应用程序

最近项目中遇到一个很头疼的问题,总是无法正常关闭应用程序。应用程序为JAVA技术开发,使用SWT3.3,而测试工具使用SilkTest2006,不支持SWT3.3,无法使用Java插件,因此我们在项目中没有使用JAVA插件,这给项目带来了很大的麻烦,因为SilkTest把所有弹出窗口(对话框和tips)都识别为DialogBox。
我使用如下代码关闭Application:


[+] Close ()
[-] if Ajax.Exists (1)
[ ] // Ajax.SetActive ()
[ ] window wCloseWin
[ ] LIST OF WINDOW lsCloseWindows
[ ]
[-] do
[ ] more:
[-] do
[-] if !Ajax.Exists (1)
[ ] goto end
[ ] lsCloseWindows = Ajax.GetCloseWindows ()
[-] for each wCloseWin in lsCloseWindows
[ ] wCloseWin.SetActive ()
[-] if wCloseWin.Exists ()
[-] do
[ ] wCloseWin.Close ()
[-] except
[ ]
[-] if Ajax.Exists ()
[-] else
[ ] goto end
[ ]
[-] except
[ ] goto more
[ ]
[ ] Ajax.SetActive ()
[ ]
[ ] end:
[-] if Ajax.Exists (1)
[ ] Ajax.TypeKeys ("")
[+] if Ajax.DoYouWantToSaveCurrentProject.Exists (1)
[ ] Ajax.DoYouWantToSaveCurrentProject.No.Click ()
[ ] sleep (1)




每次运行脚本的时候,总会有挥之不去的Tips悬在那里,关闭的时候,Ajax.GetCloseWindows ()会获取到Tips然后试图wCloseWin.Close,但是SilkTest关闭窗口的方法全不奏效,因此经常会出现无法关闭应用程序而使得测试失败。
突然想到杀进程不失为一种很好的方法,这样无论应用程序处于什么状态都可以关闭它。这里面我的方法依然是使用运行Dos命令行的方式:

[ ] end:
[+] if Ajax.Exists (1)
[ ] SYS_Execute ("taskkill /f /im java.exe")



2008年9月25日星期四

SilkTest:Control is not responding

问题描述:
执行SilkTest测试时出现错误:“Error: Control is not responding”
根据SilkTest帮助提供的信息,这个错误通常是SilkTest尝试从LIstBox,TreeView,ListView等选择一项时Selected()语句发生的。
It usually occurs in a Select( ) statement when SilkTest is trying to select an item from a ListBox, TreeView, ListView, etc.
错误可能发生在选择操作完成之后,也可能在完成之前。产生这个错误意味着对象没有对SilkTest发出的消息作出预期的响应。
The error can occur after the actual selection has occurred, or it can occur without the selection being completed. In general the error means that the object is not responding to the messages SilkTest is sending in the manner in which it expects

解决方案一(SilkTest提供):
尝试如下操作:
1)如果代码行在Recording代码块中,删除Recording关键字
If the line of code is inside a Recording block, remove the Recording keyword.
2)在错误发生的语句前使用如下语句:Agent.SetOption(OPT_VERIFY_RESPONDING, FALSE)
Set the following option just before the line causing the error: Agent.SetOption(OPT_VERIFY_RESPONDING, FALSE)
3)如果选择操作成功但依然出错,尝试使用Do . . . except语句
If the selection is successful, but you still get the error, try using the Do . . . except feature.

解决方案二:
SilkTest的解决方案在我的机器中不起作用,尽管使用Do . . . except语句可以避免异常错误的出现,但是SilkTest并没有执行选择操作,可以肯定错误发生在选择操作完成前。
可以使用以下的方式来完成操作,这个方式就是不直接使用内建的Selected(),而是通过键盘操作来模拟选择操作,代码如下:

window myObject = MainWindow.DialogBoxObject.ListViewObject
Select
(AnyType aItem)
integer i
if "aItem"=='{Val("{aItem}")}' //aItem is a
integer
i = aItem
else
i = myObject.FindItem ("{aItem}")
myObject.TypeKeys ("")
Agent.SetOption(OPT_KEBOARD_DELAY,0.2)
myObject.TypeKeys (",{i-1}")

myObject.TypeKeys ("")

2008年9月17日星期三

SilkTest:如何点击ListView中的item

问题描述:在ListView对象中,包含大量的项(我们需要操作的项很可能没有暴露出来),需要对列表中的某行数据进行Click操作。

解决方法:首先需要计算出操作的项的位置,我们很容易想到使用ListView的方法GetItemRect(),但是如果要操作的项的Index太大,很可能返回的位置超出了ListView对象本身的范围。这里面由一个技巧,如果我们使用ListView针对某项进行操作的方法,如Select()方法,SilkTest会首先定位到要Selected的那一行,这样,我们可以利用这个方法暴露出要操作的项,然后再使用GetItemRect()方法就可以获得可操作的位置了。

2008年9月16日星期二

使用命令行方式删除指定文件夹及其下面所有的文件

功能:完全删除文件夹及其下面所有的文件
参数:目录完全路径
DeleteAllFilesWithFolder (STRING Location)
SYS_Execute ('RD /S /Q "{Location}"')

判断字符串或是数字的函数

问题描述:在SilkTest自定义函数时,参数中常常会用到ANYTYPE类型,如LIST OF STRING GetColumnData(ANYTYPE aColumn)函数用来返回指定列的数据,参数允许指定列名或者指定列的序号,这样在函数中首先要对aColumn数据进行判断。

方法:可以使用如下语句判断:
if "{aColumn}" == '{Val ("{aColumn}")}'
// IsNum
else
// IsStr

2008年9月12日星期五

SilkTest:使用DOS命令行方式判断是否存在A驱动

通常我们使用SYS_DirExits () 函数可以判断是否存在有效的目录,但是如果机器中有A驱动器或这光驱,而驱动器中没有A盘或光盘,则用以上函数则会返回false的结果,我们可以用dos命令来判断。
SilkTest执行命令的函数是:SYS_Execute (), 语法格式如下:
iReturn = SYS_Execute (sCmdLine [, lsOutput])

参考SilkTest帮助文档

这里面我们使用fsutil fsinfo drives命令来显示所有的驱动器。
[ ] STRING sCmdLine = "fsutil fsinfo drives"
[ ] LIST OF STRING lsListDrivers = {}
[ ] LIST OF STRING lsOutput
[ ] SYS_Execute (sCmdLine,lsOutput)
[ ] INTEGER i=2
[+] while GetField (lsOutput[2]," ",i)!=""
[ ] ListAppend (lsListDrivers,GetField (lsOutput[2],"
",i))
[ ] i++
[ ] ListPrint (lsListDrivers)

2008年9月9日星期二

SilkTest 如何读取PDF文件

目前还没找到好的方法直接对PDF文件进行操作,但是我们可以通过将PDF文件内容copy到剪贴板,然后使用Clipboard类对内容进行处理

[ ]
[ ] // Change file location and also the browserchild name
[ ]
[-] string GetPDF(window x)
[ ] STRING sHeader
[ ] x.SetActive()
[ ] // might not need this if the popup report is already open
[ ] SYS_Execute("Start C:\filename.pdf")
[ ] sleep(1)
[ ] Desktop.TypeKeys("")
[ ] sleep(1)
[ ] Desktop.TypeKeys("")
[ ] sleep(1)
[ ] LIST OF ANYTYPE lsContent
[ ] lsContent = Clipboard.GetText()
[ ] Agent.SetOption(OPT_PLAY_MODE, "Win32")
[ ] Desktop.TypeKeys("")
[ ] Agent.SetOption(OPT_PLAY_MODE, "Normal")
[ ] sleep(1)
[ ] // change to index of title in list
[ ] sHeader = lsContent[2] // change to index of title in
list
[ ] return sHeader
[ ]
[-] testcase tOne()
[ ] print("Title of this PDF document is: " + GetPDF(BrowserChild))

这个方法只适用于需要获取文本内容,如果里面包含图片等内容仍无法处理

2008年9月8日星期一

SilkTest:自定义函数实现Click()和DoubleClick()方法

有时SilkTest的DoubleClick ()方法不能正常工作,这可能因为两次点击操作是完成不同的事情,但是SilkTest DoubleClick()方法点击的太快以至于没有完成预期的操作。我们可以自动以函数实现Click()和DoubleClick()功能,它要允许指定操作的对象(wWindow),鼠标的按键(左、中、右),鼠标的点击类型(单击、双击)。
函数原型如下:
NewClick(window wWindow,integer iButton,integer iClickType,integer iXpos,integer
iYpos)

这里面:
wWindow 是包含点击操作所作用的对象的窗体
iButton 是点击使用的按键: 1=left, 2=right, 3=middle
iClickType鼠标执行的操作: 1=click, 2=doubleclick
iXpos 和 iYpos 鼠标作用在对象上的坐标

代码:
下面一段代码必须放在Frame文件的开始部分:
[-] dll "user32.dll"
[ ] mouse_event (long dwFlags ,long dx,long dy,long
cButtons,long dwExtraInfo)
[-] void NewClick(window wWindow, integer
iButton,integer iClickType, integer x, integer y)
[ ]
[ ] integer
i=0
[ ]
[ ] // various Constants to manipulate different buttons on
mouse
[ ] const MOUSEEVENTF_LEFTDOWN = 2
[ ] const MOUSEEVENTF_ABSOLUTE =
32768
[ ] const MOUSEEVENTF_LEFTUP = 4
[ ] const MOUSEEVENTF_MIDDLEDOWN =
14
[ ] const MOUSEEVENTF_MIDDLEUP = 64
[ ] const MOUSEEVENTF_MOVE = 1
[
] const MOUSEEVENTF_RIGHTDOWN = 8
[ ] const MOUSEEVENTF_RIGHTUP = 16
[ ]
[ ] //Set the click type default
[-] if(iClickType!=2)
[ ]
iClickType=1
[ ]
[ ] //Set the button default
[-] if(iButton>3
iButton==0)
[ ] iButton=1
[ ]
[ ] // Move Mouse Pointer over current
mouse object
[ ] wWindow.MoveMouse(x,y)
[ ]
[ ] //Send message to
mouse controller to press and release mouse at the specified position
[ ]
//Left mouse button
[-] if(iButton==1)
[-]
for(i=1;i<=iClickType;i++) [ ] mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) [ ] mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) [ ] [ ] //Right mouse button [-] if(iButton==2) [-] for(i=1;i<=iClickType;i++) [ ] mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0) [ ] mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0) [ ] [ ] //Middle mouse button [-] if(iButton==3) [-] for(i=1;i<=iClickType;i++) [ ] mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0) [ ] mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0) [ ] [ ] return

2008年9月7日星期日

SilkTest:通过命令行方式运行SilkTest测试

可以在DOS窗口或者Batch文件运行SilkTest程序,语法如下:

Partner [-complog filename] [-m mach] [-opt optionset.opt] [-p mess] [-proj
filename [-base filename]] [[-q] [-query query name] [-quiet] [-r filename]
[-resexport] [-resextract] [-r] scr.t/suite.s/plan.pln/link.lnk [args]] [-smlog
filename]

各参数的含义请参照SilkTest帮助文档

如:partner -proj "C:\Program Files\Segue\SilkTest\Projects\Sanity\Testing.vtp" -query RunQuery -r "C:\Program Files\Segue\SilkTest\Projects\Sanity\Test Plan\Attachment.pln"

注意:这其中使用了-query参数,query RunQuery需要事先定义。可以使用testplan菜单定义它,打开testplan,Testplan menu>Mark By Query,打开 Mark By Query对话框,输入Query name (RunQuery),在Test attributes 标签下选择必须的选项,点击Mark按钮

2008年9月4日星期四

随机数的问题

大家使用随机数函数产生随机数如RandInt(0,100)是在0~100区间内产生一个随机数,如
testcase Rand1 () appstate none
INTEGER iSeed = 10
RandSeed (iSeed)
Print (RandInt (0, 100))
Print (RandInt (0, 100))
Print (RandInt (0, 100))

但是这里面每次运行testcase Rand1() 就会产生相同的随机数序列,如果想产生真正的随机数,就要让种子也随机,比如种子的值随着时间变化,可以使用下面的方式来实现:

RandSeed (GetDateTimePart (GetDateTime (), DTP_SECOND))


testcase Rand2 () appstate none
RandSeed (GetDateTimePart (GetDateTime (), DTP_SECOND))
Print (RandReal())
Print (RandInt(1,12))

2008年9月3日星期三

SilkTest:如何使用语句退出单个用例或整个测试

exit 语句: 退出整个测试执行
return 语句: 跳出当前testcase 或 function,继续下一个testcase 或 转到 function 调用的地方继续执行。
注意:两个语句都没有 ()