功能說明:出現一個提示對話框,N秒后消失,比如說:提示等待一個窗口阿,有時候這個窗口沒了,我也不知道腳本運行到什么地方了,提示一下挺好,也方便javascript:;" onClick="javascript:tagshow(event, '%C6%E4%CB%FB');" target="_self">其他的測試員修改,而且,也不影響無人值守的操作
例子:SQAMsgbox "test","title",5
Global iTime as Integer
Declare Function TimedDlgFunc(id As String, Action As Integer, Suppvalue As Long) As Integer
Declare Function SQAMsgBox(sMsgText as String, Optional vMsgCaption as Variant, Optional vTimeOut as Variant) as Integer
Function TimedDlgFunc(id As String, Action As Integer, Suppvalue As Long) As Integer
Static StartTime
Dim EndTime
Dim vTimeoutvalue as Variant
Select Case Action
Case 1 'Dialog box Initialization
StartTime = Timer
If StartTime + iTime >= 86400 Then
StartTime = 86400 - StartTime - iTime
End If
TimedDlgFunc = 1
Case 2 'Button pushed or any control changed (except typing in text or combo box)
Select Case Suppvalue
Case 1
DlgEnd -1
Case 2
DlgEnd 0
Case Else
TimedDlgFunc = 0
End Select
Case 3 'Change in text or combo box contents
TimedDlgFunc = 1
Case 4 'Change of control focus
TimedDlgFunc = 1
Case 5 'Idle state (return 0 to prevent this being continually called)
EndTime = Timer
If (EndTime - StartTime) >= iTime Then
DlgEnd -1
End If
vTimeoutvalue = Format(iTime - (EndTime - StartTime), "#.#")
DlgText DlgControlID("txtTimevalue"), CStr(vTimeoutvalue)
TimedDlgFunc = 1
End Select
End Function
Function SQAMsgBox(sMsgText as String, Optional vMsgCaption as Variant, Optional vTimeOut as Variant) as Integer
Dim Result as Integer
Dim TotalTime As Integer
Dim sCmdText as String
Dim sTimeoutText as String
Dim vvalue as Variant
If IsMissing(vMsgCaption) Then
vMsgCaption = "SQAMsgBox"
End If
If IsMissing(vTimeOut) Then
vTimeOut = 20 'seconds
End If
sTimeoutText = "Timeout: "
'-----
Begin Dialog dlgMsgBox 200, 80, vMsgCaption, .TimedDlgFunc
GroupBox 5, 2, 190, 40, "", .grpMsgTxt
Text 15, 11, 175, 25, sMsgText, .txtMsgText
Text 15, 47, 180, 20, sCmdText, .txtCmdText
'--------------
Button 20, 60, 40, 14, "&OK", .btnOK
Button 140, 60, 40, 14, "&Cancel", .btnCancel
Text 78, 63, 30, 10, sTimeoutText, .txtTimeText
Text 108, 63, 20, 10, vTimeout, .txtTimevalue
End Dialog
'-----
Dim TimedDlg As dlgMsgBox
iTime = CInt(vTimeOut)
Result = Dialog(TimedDlg)
If Result = 2 Then
SQAMsgBox = sqaFail
Else
SQAMsgBox = sqaPass
End If
End Function
關于Recognition
一共分為Recognition, ParentRecognition, FullRecognition
1. To find the recognition method of the currently active window:
Result=SQAGetProperty(".\","Recognition",value)
Returned value:
Type=Window;Name=frmMain
抓出來的是當前窗口的一些信息
2. To find the immediate parent of the tree view item Bach:
Result=SQAGetProperty("Name=treMain;\;ItemText=Bach","ParentRecognition",value)
Returned value:
Type=TreeView;Name=treMain
抓出來的是樹型結構的父結點的信息
3. To find the complete object path of the tree view item Bach, beginning with the desktop and ending with the target object itself:
Result=SQAGetProperty("Name=treMain;\;ItemText=Bach","FullRecognition",value)
Returned value:
Type=Window;Name=frmMain;\;Type=TreeView;Name=treMain;\;Type=TVItem;ItemText=Bach
抓出來的是樹型結構中指向該控件的全部路徑
Rational Robot中自動進行100次操作
Rational Robot中的SQA Basic與Basic語言極為類似,下面是一個for循環的例子,其中cstri()函數把整數轉換成字符串。
Sub Main
Dim Result As Integer
Dim i As Integer
……
'begin of for loop
for i=1 to 100 step 1
……
InputKeys cstr(i*3) '這個地方設置輸入值為I*3.
……
next
'end of for loop
……
End Sub
使用Rational Robot錄制自動測試GUI腳本,在點擊一個按鈕以后,出現的結果可能有多種,可能會出現一個含“確定”按鈕的對話框,也可能出現一個標題為”Title abcd”的窗體,可以使用SQAWaitForPropertyvalue方法來判斷出現的屬性,或者使用SQAWaitForObject來判斷出現何種窗體,下面是兩個對可能出現的屬性進行判斷的例子。
1).2秒內假若出現確定對話框,點擊確定按鈕,否則打印"確定按鈕未出現" :
'等待2秒直到確定按鈕出現.
Result = SQAWaitForPropertyvalue("Text=(O)確定", "Enabled",TRUE, 2000)
If Result <> sqaSuccess Then
print "確定按鈕未出現"
Else
PushButton Click, "Text=(O)確定"
End If
2).2秒內假若出現標題為"Title abcd" 的窗體,打印"出現標題為Title abcd的窗體" ,否則打印"未出現標題為Title abcd的窗體" :
'等待2秒直到標題為Title abcd的窗體出現.
Result = SQAWaitForPropertyvalue("Caption=Title abcd", "Enabled",TRUE, 2000)
If Result <> sqaSuccess Then
PushButton Click, "Text=(O)確定"
print "出現標題為Title abcd的窗體"
Else
print "未出現標題為Title abcd的窗體"
End If
說明:
1).Result是一個Integer型變量;
2).SQAWaitForPropertyvalue:顧名思義,指的是等待一個屬性被指定值之前暫停執行。SQAWaitForPropertyvalue("Text=(O)確定", "Enabled",TRUE, 2000)表示等待2秒直到確定按鈕出現,如果2秒內未出現,則返回sqlfalse,出現則返回sqlsuccess;
3).SQA Basic中<>表示不等于;
4).另外,可以用SQAWaitForObject來判斷出現出現的對象類型:
Result = SQAWaitForObject("Type=PushButton;Text=OK", 2000)
If Result = sqaSuccess Then
... ' add the rest of the actions/tests here
End If
識別控件
需要相應的enabler,你現在測試的程序是delphi開發的應用軟件,那么就要加載相應的delphi enabler!
extension manager里邊加入了delphi enabler,但是這個還是不能識別出delphi開發中用到的第三方控件或則其他控件!其實這里選擇只是個打開使用真正的delphi enabler的開關,真正的delphi其實是一個sqasrvr.pas的單元文件,這個單元文件是識別控件的核心。
ratitonal 2003里邊的test enabler安裝選項中包含delphi enabler,但是它需要你本機上安裝delphi,才會把delphi enabler安裝到你的機器上。否則不會出現。
假如安裝成功后,會在開始菜單中rational菜單下,rational test菜單下出現個delphi enabler(具體什么名字忘記了)的菜單項,通過它可以調用一個執行文件。
執行文件的功能就是把sqasrvr.pas自動放到工程文件的頭。
delphi 工程文件只有加載了這個delphi enabler(核心 sqasrvr.pas)才會讓robot識別,當然前提是你的extension manager中delphi選擇了。
Robot手工編寫GUI腳本如何獲取對象識別方法和屬性
以計算器為例,下面的腳本是鍵盤輸入“1+1=”,然后關閉計算器。
Sub Main
Dim Result As Integer
StartApplication "C:\WINNT\system32\calc.exe"
Window SetContext, "Caption=計算器", ""
InputKeys "1{+}1{ENTER}"
Window CloseWin, "", ""
End Sub
Robot提供了獲取對象識別方法和屬性的利器――Inspector。通過Robot tools-Inspector..打開,F在使用SQAGetProperty命令獲取1+1的結果值,并通過msgbox顯示該值。
鼠標左鍵按住Inspectot工具欄上的“Select Objcet”按鈕,然后選擇計算器的結果放開鼠標左鍵。Inspectot中顯示出對象的識別方法,鼠標左鍵點擊工具欄上的“Copy recognition String”按鈕拷貝識別方法,屬性值通過選擇Inspector左下角窗口中的Text屬性,然后鼠標左鍵點擊工具欄上的“Copy”按鈕拷貝屬性。修改后的腳本如下:
Sub Main
Dim Result As Integer
Dim sum as Variant
StartApplication "C:\WINNT\system32\calc.exe"
Window SetContext, "Caption=計算器", ""
InputKeys "1{+}1{ENTER}"
Result = SQAGetProperty ("Type=Label;ObjectIndex=1", "Text", sum)
msgbox sum
Window CloseWin, "", ""
End Sub
VU腳本是類C語言,區分大小寫。所以在獲取識別方法和屬性值時最好的方法就是使用Inspector。
自己編寫腳本時,還有一個要注意的問題是窗口上下文,窗口上下文不正確會導致回放時找不到對象。上面的腳本中Window SetContext, "Caption=計算器", ""下面的操作都是在這個窗口上進行的。編寫腳本時一定注意看一下窗口上下文是否正確。
也可以在識別方法中指定窗口上下文,如Result = SQAGetProperty ("Type=Label;ObjectIndex=1", "Text", sum)可以改成Result = SQAGetProperty ("\;Type=Window;Caption=計算器;\;Type=Label;ObjectIndex=1", "Text", sum),第一個“\”代表桌面,“Type=Window;Caption=計算器”是計算器窗口,第二個“\”代表“Type=Window;Caption=計算器”和“Type=Label;ObjectIndex=1”是父子關系。這兩個命令的效果完全一樣。
SQABasic頭文件包含一系列的聲明,頭文件可以應用到
一.聲明共有或則全局常量,變量和用戶定義類型
二.聲明自定義sub,procedures和function
頭文件中的聲明可以應用到任何模塊(腳本或者類庫文件)。用’$include關鍵字,放在模塊開始的地方-例如:
’$include “global.sbh”
SQABasic頭文件類型
Sqabasic支持兩種頭文件類型:
一.頭文件保存在sqabasic路徑。不用指定任何路徑信息就可以在本工程或者其他工程中應用他們
二.工程頭文件可以保存在TMS_Script文件夾中。不用指定任何路徑信息就可以在同一個工程中處理。
這兩種SQABasic頭文件都有同樣的擴展名- .sbh
庫文件
庫文件包含一個或者更多供procedure從其它文件調用的sub,procedure和function。
一.SQABasic庫文件(擴展名為.sbl或則.rec)
注意,.rec文件可以作為腳本文件或者庫文件,但是.sbl只能被用作庫文件。
二.動態連接庫文件(擴展名.dll)
下邊的表格這幾種類庫文件不同的總結:
.sbl
.rec
.dll
位置
SQABasic路徑
當前工程文件中Datastore(文件夾 TMS_Script)
TMS_Script/dll文家夾或則其他位置
范圍
在SQABasic路徑中,對所有工程文件都可用
對同一個工程所有腳本可用
依靠位置
驗證點
不支持
支持標準的robot驗證點
支持自定義驗證點
任何.rec文件都能作為庫文件。不管怎樣,如果一個.rec文件作為腳本(可以從robot中直接運行或者用callscript命令),他必須有一個main過程。
在SQABasic庫文件中聲明過程
如果在SQABasic過程中有一個自定義的過程,你聲明類文件的方法同樣適用聲明過程。
下邊的例子是在sqabasic庫文件中(mylib.sbl)聲明一個自定義過程(mysub):
Declare Sub MySub Basiclib “MyLib”( arg1 as string,arg2 as integer)
一.關鍵字basiclib,表示過程mysub在一個sqabasic庫文件中
二.庫文件的名字“mylib”,這里不需要寫擴展名(.sbl或者.rec)
備注:basiclib關鍵字特指.sbx庫文件的聲明(和.dll庫文件相對),這里不需要也不推薦帶有.sbx擴展名的聲明。
什么地方聲明SQABasic庫文件
可以在任何位置聲明SQABasic庫文件
一.在腳本或者其他庫文件,僅在模塊中應用過程
二.頭文件中,用道的模塊
庫文件包含不需要指定的例程或者’include頭文件
在dll文件聲明過程文件
如果在dll文件的自定義過程,聲明過程同樣可以聲明dll文件。
下邊是dll文件中(mydll.dll)聲明自定義過程(mysub)的例子:
declare sub mysub lib “mydll”(byval arg1 as string,Byval arg2 as integer)
一.聲明中加入Lib關鍵字,表示聲明的過程在dll文件中(相對于.sbl或者.rec sqabasic庫文件)
二.庫文件名字(mydll),跟隨庫指定的名稱
三.參數聲明通常包括關鍵字byval(參數聲明包括任何關鍵字)
如果編譯位置在sqabas32路徑或在系統路徑的庫文件(.dll),你不用特別聲明路徑。如果庫文件不再sqabas32或者在系統路徑,你需要制定路徑,比如
Declare Sub MySub Lib “E:MyDll” (byval arg1 as string,Byval arg2 as integer)
在什么地方聲明dll文件
你可以聲在任何為指聲明dll文件:
1.腳本或者sqabasic庫文件,要用過程的模塊
2.頭文件,任何模塊指定的頭文件
SQABasic路徑
Sqabasic路徑是robot保存和尋找sbl庫文件和頭文件的地方,用戶在robot中也可以定義。
一旦你在robot中指定sqabasic路徑,這個路徑是固定的。不管怎樣,robot自動設置sqabasic路徑,當下列條件是真的時候:
i.仍沒有明確在robot中定義sqabasic
ii.已經在rational Aministrator建立新的工程和數據倉庫
iii.打開最近創建的工程和數據倉庫
當上邊所有條件為真的時候,robot自動在新工程和數據倉庫中設置sqabasic路徑到下列位置:
[NewProject][NewDatastore]DefaultTestScriptDatastoreTMS_ScriptSQABas32
設置步驟:
1)點Tools->General Options
2)點Preferences頁面
3)在SQABasic路徑中輸入路徑
Rational test早期版本沒有提供菜單選項來設置sqabasic路徑 – 參閱sqa common directory片斷
指導使用頭文件和庫文件
推薦下邊使用庫文件方法:
a)自定義函數或者過程應該使用有同樣文件名字的頭文件(.sbh)和庫文件(.sbl),比如DataFunctions.sbh和DataFunctions.sbl。這個過程和函數在頭文件中定義(指定聲明頭文件)和在庫文件中定義?聪逻叺睦
b)分離頭文件(參閱常量頭文件)用于包含常量,變量和用戶定義類型用于腳本或者庫文件調用。頭文件用同樣的文件名字后邊附加_x或則_C(附加是早期命名規定)。注意包含常量和變量的頭文件必須加入到聲明頭文件和庫文件之前。(DataFunctions.sbh和DataFunctions.sbl),比如’include “DateFunctions_c.sbh”。這樣做很容易維護。
c)通過分類或者程序把相關的函數放在同一個庫里,例如,把所有日期相關的函數放到DataFunctions.sbh/sbl,或者把所有的函數加入為特定程序開發的函數庫中(比如AppName.SBH/SBL)
d)函數是在庫文件中子程序的的首選方式,處分過程的結果對于調用腳本是不相關的。函數應該返回一個值,或者適當的,數據可以通過變量或者數組返回。在后邊的例子中,函數返回的結果表示成果或者失敗。
e)庫文件中的所有得函數和子程序必須有“注釋“,包含這個過程的目的和用途::
請看下邊的例子。
f)庫文件的注釋有合理的解釋,通過讀注釋可以知道過程的邏輯
g)如果開發和維護robot庫文件是集中管理的方式,那么你可以加入到’$include 所有庫文件到global.sbh頭文件中,這樣做對所有頭文件都有用。這可以加入缺省的腳本模板。作為選擇,測試人員在每個腳本中可以選擇或者包含需要的庫文件。
轉載請注明信息來源51testing