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))

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