場(chǎng)景恢復(fù)Recovery Scenarios
設(shè)置場(chǎng)景恢復(fù):
Resources ——> Recovery Scenario Manager新增,具體參照向?qū)гO(shè)置;
在File ——> Settings ——> Recovery中進(jìn)行添加,Activate recovery scenarios中應(yīng)選擇“On error”。
不能場(chǎng)景恢復(fù)的情況:
測(cè)試腳本中含有的對(duì)象不在對(duì)象庫(kù)中;
VBScript腳本語(yǔ)言自身錯(cuò)誤;
當(dāng)MsgBox切斷測(cè)試。
官方提供的場(chǎng)景恢復(fù)文件:安裝目錄\recovery\WebRecovery.qrs
Reporter函數(shù) ReportEvent方法
語(yǔ)法:Reporter.ReportEvent 狀態(tài), 步驟名稱, 詳細(xì)說(shuō)明, [截圖路徑]?

ReporterEvent后面必須跟一個(gè)空格,micPass對(duì)應(yīng)數(shù)字0,micFail對(duì)應(yīng)數(shù)字1,micDone對(duì)應(yīng)數(shù)字2,micWarning對(duì)應(yīng)數(shù)字3.
狀態(tài)優(yōu)先級(jí)從高到低排列:micFail>micWarning>micPass>micDone
與CheckProperty區(qū)別:
CheckProperty只有Pass和Fail兩種狀態(tài),ReportEvent有四種;
CheckProperty檢查屬性,ReportEvent可檢查各種代碼邏輯;
CheckProperty的步驟名和詳細(xì)說(shuō)明是系統(tǒng)自動(dòng)生成的,ReportEvent可自由編寫;
ReportEvent可將截圖寫在測(cè)試報(bào)告中。
截圖到測(cè)試報(bào)告中:
FileName3="E:\zlp\3.png"
Browser("個(gè)人空間管理").Page("個(gè)人空間管理").CaptureBitmap FileName3,True
IfROValue="123456"Then
Reporter.ReportEvent micPass,"第三步檢驗(yàn)訪問(wèn)密碼","驗(yàn)證實(shí)際輸入訪問(wèn)密碼是否與設(shè)定一致:成功",FileName3
Else
Reporter.ReportEvent micFail,"第三步檢驗(yàn)訪問(wèn)密碼","驗(yàn)證實(shí)際輸入訪問(wèn)密碼是否與設(shè)定一致:失敗",FileName3
EndIf
Data Table
在QTP11.5版本中首先需要雙擊列名,輸入數(shù)據(jù)表列名,默認(rèn)列名是為空的。
語(yǔ)法:
? ? ?DataTable.Value(列名,Sheet名)
? ? ?或
? ? ?DataTable(列名,Sheet名),會(huì)自動(dòng)出現(xiàn)代碼提示所有當(dāng)前(Local Sheet)Sheet下的列名。
注意:Sheet名區(qū)分大小寫。
Global Sheet
? ? ?1. Global Sheet是一個(gè)全局變量,有幾行數(shù)據(jù)(中間有行為空也會(huì)執(zhí)行),程序就要回放幾次,不用寫循環(huán)語(yǔ)句;
? ? ?2. 若Global Sheet中有多行數(shù)據(jù),即使沒(méi)有使用該Sheet,有幾行數(shù)據(jù)腳本就會(huì)執(zhí)行幾遍;
? ? ?3. 打開(kāi)File—>Settings—>Run,設(shè)置Data Table iterations數(shù)據(jù)表迭代,Global Sheeet受該設(shè)置控制;

Local Sheet
1. Local Sheet是局部變量,且不受Data Table iterations數(shù)據(jù)表迭代,無(wú)論有多少行數(shù)據(jù),都只運(yùn)行一次;
? ? ?2. Local Sheet不能將值傳遞給另一個(gè)腳本或另一個(gè)Action。
? ? ?3. 下圖的設(shè)置時(shí)針對(duì)Local Sheet下的測(cè)試數(shù)據(jù)。

區(qū)別:
Global Sheet執(zhí)行所有行,是執(zhí)行所有腳本,如有多個(gè)Action,則每個(gè)Action都會(huì)執(zhí)行;
Local Sheet是只執(zhí)行自身的Action多次;
如Global Sheet開(kāi)啟所有行,Action1開(kāi)啟所有行:則執(zhí)行Global Sheet第一行,Action1執(zhí)行所有行;Global Sheet 執(zhí)行第二行,Action1執(zhí)行所有行。
Object Identification對(duì)象識(shí)別
QTP自動(dòng)化測(cè)試原理:
? ? ?(1)轉(zhuǎn)化:封裝真實(shí)被測(cè)對(duì)象并轉(zhuǎn)化為QTP對(duì)象到對(duì)象庫(kù);
? ? ?(2)對(duì)比:對(duì)比對(duì)象庫(kù)里的對(duì)象鑒別屬性和與形式的真是被測(cè)對(duì)象的鑒別屬性;
? ? ?(3)匹配:對(duì)比后若一致,則說(shuō)明對(duì)象成功匹配并可繼續(xù)對(duì)該真實(shí)被測(cè)對(duì)象進(jìn)行后續(xù)操作,如果兩者不一致則報(bào)錯(cuò),提示為對(duì)象無(wú)法識(shí)別。
Object Identification對(duì)象識(shí)別:Tools—>Object Identification

? ? ?在Object Identification對(duì)話框中設(shè)置的屬性,在對(duì)象庫(kù)中可查看到。Mandatory Properties(強(qiáng)制屬性)該區(qū)域設(shè)置的屬性,在被測(cè)對(duì)象與對(duì)象庫(kù)匹配時(shí),只要有一個(gè)屬性不一致就會(huì)報(bào)錯(cuò)。Assistive Properties(輔助屬性),QTP默認(rèn)所有的對(duì)象模型在這個(gè)區(qū)域都沒(méi)有屬性。
? ? ?QTP11.5版本中,在Object Identification中增加或刪除Mandatory Properties,對(duì)已存在對(duì)象庫(kù)中的對(duì)象屬性是沒(méi)有影響的,只有之后增加的對(duì)象屬性才會(huì)有改變。
順序標(biāo)識(shí)符
Index索引- 指示該對(duì)象在應(yīng)用程序代碼中相對(duì)于其他描述都相同的其他對(duì)象的顯示順序,index順序標(biāo)識(shí)是從左到右進(jìn)行的。
? ? ?1) 在"相同描述的對(duì)象"出現(xiàn)多個(gè)的情況下就一定有index,在一個(gè)對(duì)象現(xiàn)有"描述屬性"已經(jīng)能唯一標(biāo)識(shí)一個(gè)對(duì)象的情況下,index是不會(huì)出現(xiàn)的。此時(shí)的index屬性QTP里面標(biāo)識(shí)為"none";
? ? ?2)?index在對(duì)象是唯一的情況下,沒(méi)有任何意義和價(jià)值;
? ? ?3)當(dāng)index,CreationTime屬性在對(duì)象庫(kù)中為none的時(shí)候,不能使用SetTOProperty賦值index屬性,賦值能夠成功,但是無(wú)法使用賦值后index屬性來(lái)正確識(shí)別對(duì)象;
? ? ?4)index屬性是QTP自己標(biāo)識(shí)的.和程序編程里的index無(wú)關(guān),index屬性的生成是按照相同對(duì)象出現(xiàn)的順序來(lái)排列的,就是用ChildObjects方法獲得的對(duì)象集合中item(i)索引的順序;
? ? ?5)?index屬性我們只能嘗試改變對(duì)象庫(kù)中的,不能改變實(shí)際對(duì)象
Location位置- 指示該對(duì)象在父窗口、框架或?qū)υ捒蛑邢鄬?duì)于其他描述都相同的其他對(duì)象的顯示順序,location順序標(biāo)識(shí)是用上到下進(jìn)行的。
CreationTime-?僅對(duì)瀏覽器對(duì)象生效,按對(duì)象產(chǎn)生時(shí)間先后順序排列。
自動(dòng)化測(cè)試介紹
1、概念
自動(dòng)化測(cè)試是以程序測(cè)試程序,以代碼體現(xiàn)思想,以腳本的運(yùn)行代替手工測(cè)試的過(guò)程。
2、優(yōu)勢(shì)
快速、高效、可完成手工測(cè)試相當(dāng)困難或無(wú)法完成的測(cè)試、可重復(fù)性等。
回歸側(cè)四更方便、可靠;
可運(yùn)行更多、更繁瑣的測(cè)試,且快速、高效;
可執(zhí)行一些對(duì)于手工測(cè)試來(lái)說(shuō)相當(dāng)困難或根本做不到的測(cè)試;
更好地利用資源,使資源的使用更有價(jià)值;
具有一致性和可重復(fù)性的特點(diǎn);
自動(dòng)化定華測(cè)試腳本完全具有復(fù)用性;
使軟件更有信任度;
多環(huán)境下測(cè)試。
3、不足
永遠(yuǎn)不能代替手工測(cè)試;
無(wú)法完全保證測(cè)試的正確性;
發(fā)現(xiàn)的bug遠(yuǎn)少于手工測(cè)試;
成本大。
4、適合項(xiàng)目(人力資源不考慮)
項(xiàng)目周期長(zhǎng),系統(tǒng)版本多;
需求變更不頻繁;
測(cè)試對(duì)象可被自動(dòng)化工具識(shí)別;
需反復(fù)測(cè)試的項(xiàng)目。
5、何時(shí)引入
項(xiàng)目只有在經(jīng)歷了完整的系統(tǒng)測(cè)試后才具備基本引入自動(dòng)化測(cè)試的條件。
6、流程
可行性分析、測(cè)試需求分析(需要確定測(cè)試覆蓋率以及自動(dòng)化測(cè)試粒度,測(cè)試用例的篩選)、制定測(cè)試計(jì)劃(時(shí)間人員安排等)、設(shè)計(jì)(框架、用例)、腳本開(kāi)發(fā)、執(zhí)行(環(huán)境搭建、執(zhí)行腳本)、提交測(cè)試產(chǎn)物、腳本維護(hù)。
說(shuō)明:自動(dòng)化測(cè)試需要回歸原點(diǎn),即執(zhí)行完的場(chǎng)景需要恢復(fù)到執(zhí)行前的初始狀態(tài),否則會(huì)出現(xiàn)第一次腳本執(zhí)行正確,第二次報(bào)錯(cuò)的情況。
場(chǎng)景恢復(fù):自定義函數(shù)RecoveryFunction
場(chǎng)景恢復(fù)自定義行數(shù)RecoveryFunction,該函數(shù)在幫助文檔中未說(shuō)明。
使用該函數(shù)的例子:
打開(kāi)Recovery Scenario Manager,新建一個(gè)場(chǎng)景恢復(fù)文件;
選擇Test run error,如下圖,下一步后選擇any error;

選擇Function call自定義場(chǎng)景恢復(fù)函數(shù);
選擇一個(gè)空文件,如為Recovery.txt ,輸入函數(shù)內(nèi)容:

選擇Stop the test run,并輸入場(chǎng)景名稱,完成該場(chǎng)景恢復(fù)的設(shè)置。
RecoveryFunction1函數(shù)有四個(gè)參數(shù)Object, Method, Arguments, retVal。
Object:自動(dòng)映射當(dāng)前錯(cuò)誤的QTP封裝測(cè)試對(duì)象,輸入對(duì)象庫(kù)中的LogicName;
Method:輸入測(cè)試對(duì)象的方法;
Arguments:自動(dòng)映射當(dāng)前錯(cuò)誤的所有參數(shù),Arguments是一個(gè)數(shù)組,使用join連接數(shù)組;
retVal:自動(dòng)映射當(dāng)前錯(cuò)誤的具體錯(cuò)誤信息,retVal是Long類型,必須使用DescribeResult方法進(jìn)行轉(zhuǎn)化。
Function RecoveryFunction1(Object, Method, Arguments, retVal)
print Object.GetTOProperty("testobjName")
print Method
print?join(Arguments,"")
print?DescribeResult?(Result)
End Function
自動(dòng)化模型對(duì)象AOM
AOM:Automation Object Model。
? ? ?VB、C#和JavaScript語(yǔ)言都能調(diào)用AOM來(lái)自動(dòng)調(diào)用QTP,QTP安裝程序中已經(jīng)注冊(cè)了一個(gè)核心DLL文件的COM(二進(jìn)制可執(zhí)行程序),位于安裝文件夾BIN目錄下的QTObjectModel.dll。
以下為在VBSEdit工具中引用QTObjectModel.dll:
打開(kāi)VBSEdit,Tools ——> References ——>Add;

引用完后,創(chuàng)建AOM對(duì)象,就會(huì)有相應(yīng)的代碼提示。
以下為啟動(dòng)到關(guān)閉QTP的腳本
'創(chuàng)建AOM對(duì)象
Setqtapp=CreateObject("Quicktest.Application")
'啟動(dòng)QTP
qtapp.Launch
'設(shè)置為可見(jiàn)
qtapp.Visible=True
'新建一個(gè)test腳本
qtapp.New
'為Action1設(shè)置執(zhí)行腳本為msgbox 0
qtapp.Test.Actions("Action1").SetScript"msgbox 0"
'執(zhí)行測(cè)試腳本
qtapp.Test.Run
'退出QTP,關(guān)閉
qtapp.Quit
'釋放對(duì)象
Setqtapp=nothing
執(zhí)行以上代碼時(shí),系統(tǒng)中會(huì)出現(xiàn)一個(gè)QTAutomationAgent.exe的進(jìn)程,代碼執(zhí)行完后自動(dòng)關(guān)閉。但擋在調(diào)試代碼或做非法終止以上代碼的行為而最終未能將代碼執(zhí)行到完畢的話,此進(jìn)程不會(huì)自動(dòng)關(guān)閉,這樣會(huì)導(dǎo)致第二次創(chuàng)建AOM對(duì)象報(bào)錯(cuò)“遠(yuǎn)程過(guò)程調(diào)用失敗”(我未遇到),需要手動(dòng)關(guān)閉該進(jìn)程。
注意:在QTP中直接創(chuàng)建AOM對(duì)象是會(huì)報(bào)錯(cuò)的,當(dāng)開(kāi)啟一個(gè)QTP后不能再開(kāi)啟另一個(gè),報(bào)錯(cuò)如下圖:

可使用?Setqtapp=GetObject("","Quicktest.Application"),實(shí)際沒(méi)必要這樣操作。
保留對(duì)象Utility Objects
保留對(duì)象:就是QTP本身預(yù)留的一些可用對(duì)象,打開(kāi)QTP這些對(duì)象就會(huì)實(shí)例化,即為對(duì)象開(kāi)辟內(nèi)存空間。
Crypt:加密模塊保留對(duì)象
Crypt.Encrypt("需要加密的字符串") ?相當(dāng)于QTP的Password Encoder工具功能。
Desktop:桌面保留對(duì)象
桌面截屏desktop.CaptureBitmap “文件名”,true or False(默認(rèn)為False,表示若文件存在不覆蓋)
MercuryTimes:計(jì)時(shí)保留對(duì)象
PathFinder:路徑保留對(duì)象
PathFinder.Locate("需要查找的文件名"),要在Tools ——> Options ——> GUI testing ——> Folders中設(shè)置查找的路徑,獲取到的是完整的絕對(duì)路徑。
RandomNumber:隨機(jī)數(shù)保留對(duì)象
RandomNumber.Value(開(kāi)始數(shù)字,結(jié)束數(shù)字),開(kāi)始數(shù)字<=結(jié)束數(shù)字,且包含了開(kāi)始和結(jié)束數(shù)字,急閉區(qū)間。
隱藏保留對(duì)象:在幫助文檔和Complete word中都找不到,隱藏在注冊(cè)表中,HKEY_CURRENT_USER ——> Software ——> Mercury Interactive ——> QuickTest Professional ——> MicTest ——> ReservedObjects
環(huán)境變量 Environment Variables
QTP默認(rèn)環(huán)境變量位置:File ——> Settings ——> Environment,變量類型為Bulit-in,即內(nèi)置變量。
Valid only during the test run:表示只有在腳本運(yùn)行的時(shí)候QTP才能知道的動(dòng)態(tài)變量。
部分默認(rèn)環(huán)境變量說(shuō)明:
? ? ? ? ? ActionIteration:返回當(dāng)前運(yùn)行的Action跌倒的數(shù)據(jù)行號(hào)(指中當(dāng)前Action的Datatable 數(shù)據(jù)表中的行號(hào))。
? ? ? ? ? TestIteration:返回當(dāng)前運(yùn)行的測(cè)試迭代的數(shù)據(jù)行號(hào)(指Global Datatable中的行號(hào))。
環(huán)境變量常見(jiàn)使用:
? ? ?截圖命名可為:TestName+ActionName+Time+自定義ID
? ? ?截圖放置的路徑可為:TestDir,返回當(dāng)前測(cè)試的絕對(duì)路徑,不包括最后的“\”
動(dòng)態(tài)獲取環(huán)境變量使用Environment對(duì)象,該對(duì)象包含三個(gè)方法:ExternalFileName、LoadFromFile和Value。
Value
?????一是獲取環(huán)境變量的值:
如 environment.Value("ActionName")
?????二是為環(huán)境變量賦新值:在自定義環(huán)境變量時(shí)使用。
? ? 2.LoadFromFile:動(dòng)態(tài)加載自定義環(huán)境變量, environment.LoadFromFile “文件路徑”。
? ? ?手動(dòng)加載自定義環(huán)境變量 的方法:File ——> Settings ——> Environment,選擇User-defined。
3.ExternalFileName:返回加載外部環(huán)境變量文件的路徑名稱, environment.ExternalFileName?。
函數(shù)資源庫(kù)Library Files
資源池靜態(tài)調(diào)用
1、首先創(chuàng)建了一個(gè)test.txt文件,寫入函數(shù);
2、在QTP中選擇File ——> Settings ——> Resources項(xiàng),將test.txt添加進(jìn)資源池,彈出的對(duì)話框?yàn)檫x擇絕對(duì)路徑還是相對(duì)路徑;
3、使用步驟生成器F7(Design ——>Step Generator)選擇Functions,Library functions并選擇函數(shù)即可;
4、或者使用complete word,快捷鍵ctrl+space;
5、以上是把函數(shù)寫在txt文件中,也可以在QTP中File ——> New ——> Function Library中編寫。
動(dòng)態(tài)調(diào)用
1、語(yǔ)法: executefile "文件的路徑(支持相對(duì)路徑)"
加載多個(gè)庫(kù)文件
假設(shè)test.vbs中存在多個(gè)動(dòng)態(tài)調(diào)用的語(yǔ)句,在Resource中手動(dòng)加載這個(gè)文件,就可以達(dá)到加載多個(gè)庫(kù)文件的作用。
調(diào)用QC中的函數(shù)庫(kù)操作類似,只是路徑不同,若有兩人及以上同時(shí)打開(kāi)同一份函數(shù)資源文件,只有先打開(kāi)的那位有修改的資格,后一位需要等前一位退出編輯并等待一個(gè)緩存時(shí)間后,才能進(jìn)行修改。
QTP11.5破解
來(lái)源網(wǎng)址:?http://www.cnblogs.com/juddhu/archive/2012/01/18/2325795.html
http://www.cnblogs.com/juddhu/archive/2012/01/18/2325795.html
1、刪除C:\ProgramData\SafeNet Sentinel目錄;
2、F:\Program Files\HP\Unified Functional Testing\bin?執(zhí)行instdemo.exe。
封裝對(duì)象在注冊(cè)表中的位置
? ? ?下圖中使用GetROProperty獲取Class Name,輸出結(jié)果為空,GetROProperty("micClass")輸出結(jié)果為WebEdit,原因可查看QTP封裝屬性的注冊(cè)表位置,運(yùn)行regedit打開(kāi)注冊(cè)表,進(jìn)入如下位置:
HKEY_CURRENT_USER —> Software?—>?Mercury Interactive?—>?QuickTest Professional?—>?MicTest?—>?Attributes
即可看到所有QTP封裝的屬性

比較日期方法
來(lái)源網(wǎng)址:?http://www.cydtest.com/?p=1528
Date:輸入日期格式為 2015-5-29
需要比較的日期為:2015年05月29日
方法一:
Dday=split(date,"-")
Iflen(Dday(1))=1Then ? ???'或與10比較,如Dday(1)<10
? ? ? ?Dmonth="0"&Dday(1)
ElseDmonth=Dday(1)
EndIf
Iflen(Dday(2))=1Then
? ? ? ?Ddate="0"&Dday(2)
ElseDdate=Dday(2)
EndIf
myDate=Dday(0)&"年"&Dmonth&"月"&Ddate&"日"
方法二:
myDate=year(now)&"年"&string(2-len(month(now)),"0")&month(now)&"月"&string(2-len(day(now)),"0")&day(now)&"日"
string(number,character)返回number個(gè)character,返回N個(gè)字符,若character為字符串,則返回N個(gè)字符串的第一個(gè)字符。
方法三:
myDate?=year(date)?&right("0"?&month(date),2)?&right("0"?&day(date),2)
VBS常用字符串函數(shù)
1. Date函數(shù)
? ? 語(yǔ)法:Data,返回當(dāng)前系統(tǒng)日期。
2. Now函數(shù)
? ? ?語(yǔ)法:Now,返回當(dāng)前系統(tǒng)日期時(shí)間。
3. DateDiff函數(shù)
? ? ?語(yǔ)法:DateDiff(interval時(shí)間單位,date1,date2),返回兩個(gè)日期之間的間隔。
4. Left函數(shù)
? ? ?語(yǔ)法:Left(string,length),從最左邊返回指定數(shù)量的字符串,若length為0,則返回"",若length大于等等于string總長(zhǎng)度,則返回整個(gè)字符串。
5. Right函數(shù)
? ? ?語(yǔ)法:Right(string,length),返回字符串最右邊指定數(shù)量的字符串。
6. Len函數(shù)
? ? ?語(yǔ)法:Len(String),返回字符串的長(zhǎng)度,即字符數(shù)量。
7. Mid函數(shù)
? ? ?語(yǔ)法:Mid(string,start[,length]),從字符串返回指定位置指定長(zhǎng)度的字符串
8. Split函數(shù)
? ? ?語(yǔ)法:Split(expression[,delimiter[,count[,compare]]])
Split(要拆分的字符串[,拆分元素(拆分后被去掉)[,返回的拆分字符串?dāng)?shù)量(-1表示返回所有,若為2則返回2個(gè)子字符串)[,默認(rèn)為0是二進(jìn)制比較,1是文本比較]]])
在指定的分隔符參數(shù)出現(xiàn)的所有位置斷開(kāi)字符串,將其拆分為子字符串,然后以數(shù)組的形式返回子字符串。
? ? ?如:myarray=split("xunbodaxunshangx123asd","x",-1,0)
? ? ? ? ? ? 結(jié)果:myarray(0)到myarray(3)分別為 ? 空字符串“”,unboda,unshang 和?123asd
9. LTrim,Rtrim與Trim函數(shù)
? ? ?語(yǔ)法:LTrim(string),返回不帶前導(dǎo)空格(LTrim),后續(xù)空改(Rtrim)或所有空格(Trim)的字符串副本。
10. Replace函數(shù)
? ? ?語(yǔ)法:Replace(expression,find,replacewith[,compare[,count[,start]]])
Replace(原始字符串,被搜索的子字符串,用于替換的字符串[,(默認(rèn)為0二進(jìn)制比較,1為文本比較)[,(執(zhí)行替換的數(shù)量,默認(rèn)為-1,進(jìn)行所有替換)[,(開(kāi)始搜索子字符串的位置,默認(rèn)為1.再喝count關(guān)聯(lián)時(shí)必須使用)]]])
如: mystring?=replace("qweasdqw","q","11") ? mystring為 ?11weasd11w
11. Instr函數(shù)
? ? ?語(yǔ)法:InStr([start, ]string1, string2[, compare]) 在字符串1中查找字符串2,并返回位置。
? ? ?InStr([開(kāi)始查找的位置, ]字符串1, 要查找的字符串2[, compare])?,找不到返回0。
? ? ?例子:
SearchString?="XXpXXpXXPXXP"' String to search in.
SearchChar?="P1"' Search for "P".
MyPos?=Instr(4, SearchString, SearchChar,1)' A textual comparison starting at position 4. Returns 6.
MyPos?=Instr(1, SearchString, SearchChar,0)' A binary comparison starting at position 1. Returns 9. ?
12.String
? ? ?語(yǔ)法:string(number,character)返回number個(gè)character,返回N個(gè)字符,若character為字符串,則返回N個(gè)字符串的第一個(gè)字符。
Web控件
Browser & Page
Navigate方法:在瀏覽器中打開(kāi)一個(gè)特定的網(wǎng)址;
Sync方法:等待瀏覽器完成當(dāng)前的頁(yè)面的工作;
CaptureBitmap:object.CaptureBitmap FullFileName, [OverrideExisting],圖片格式只能是.png或.bmp,OverrideExisting默認(rèn)為False,設(shè)置為True表示覆蓋同路徑下相同名稱文件;
FullScreen:將瀏覽器全屏。
WebTable
ColumnCount(Row)取列數(shù),必須要加行號(hào);
RowCount取行數(shù);
GetCellData獲取指定單元格(行,列)的值;
ChildItem:虛擬一個(gè)對(duì)象,使它成為WebTable的一個(gè)子對(duì)象。語(yǔ)法:object.ChildItem (Row, Column, MicClass, Index)
object.ChildItem (表格的行號(hào), 虛擬對(duì)象的列, 要虛擬的對(duì)象控件類名, 一般填0)
Data Table實(shí)用方法
1. 動(dòng)態(tài)增加新列并賦值,腳本運(yùn)行完則恢復(fù)原樣
DataTable.GlobalSheet / LocalSheet .AddParameter"列名","值"
2. 動(dòng)態(tài)增加新行并賦值,需要先設(shè)置列名
'設(shè)置Global sheet中新增為第幾行
DataTable.GetSheet("Global/Action1").SetCurrentRow(5)
? ? ?'給“列名”列第5行賦值為Row5
DataTable("列名","Global/?Action1")="Row5"
或者
? ???只適用于Local Sheet,還是需要第一個(gè)語(yǔ)句,要不然不管設(shè)置第幾行都會(huì)是給第一行賦值
? ? ?DataTable.GetSheet("Action1").SetCurrentRow(5)
'給第N列第5行賦值為Row5
DataTable.Value("第幾列",5)="Row5"
3. 動(dòng)態(tài)獲取DataTable中指定列的值,獲取的是Global Sheet中該列的所有值,Action1為該列第一行的值。
獲取列值?=?DataTable("列名","Global/Action1")
? ?或
獲取列值?=?DataTable(1(表示第一列),"Global/Action1")
4. 動(dòng)態(tài)獲取DataTable中指定行的值
獲取某列某行值=DataTable.GetSheet("Global/Action1").GetParameter("列名").ValueByRow(行數(shù))
5. 動(dòng)態(tài)獲取當(dāng)前行好設(shè)置當(dāng)前行
? ? ?GetCurrentRow ?
? ? ?SetCurrentRow()
6. 獲取Data Table總行數(shù)
DataTable.GetSheet("Global/Action1").GetRowCount
7. 將Excel中內(nèi)容導(dǎo)入Sheet中,不能打開(kāi)xlsx的文件,可不用修改列名,默認(rèn)Excel中第一行為列名
? ?DataTable.Import(FileName)?
DataTable.ImportSheet(FileName, Excel中第一個(gè)Sheet(Sheet名或數(shù)字), "Global/Action1")
SendKeys命令
該命令的作用是模擬鍵盤操作,將一個(gè)或多個(gè)按鍵指令發(fā)送到指定的Windows窗口來(lái)控制應(yīng)用程序,是WshShell對(duì)象的方法。
例子:SetWshShell?=CreateObject("WScript.Shell")
WshShell.SendKeys"Happy Birthday!"
特殊功能鍵說(shuō)明:
Shift:+
Ctrl : ^
Alt ?:%
+號(hào):{+}
回車:{ENTER}
向下:{DOWN}
Space:“ ”雙引號(hào)內(nèi)輸入空格
F1:{F1}
發(fā)送多個(gè)相同的字符:{按鍵 數(shù)字},如{qwe 5}表示輸入5個(gè)qwe
WScript.WshShell對(duì)象
? ? ?WScript對(duì)象
WScript對(duì)象是Windows腳本宿主對(duì)象模型層次結(jié)構(gòu)的根對(duì)象。它不需要在調(diào)用其屬性和方法之前進(jìn)行實(shí)例化,并且始終可在任何腳本文件中使用。
? ? ?WScript對(duì)象允許:
? ? ?創(chuàng)建對(duì)象;
? ? ?連接對(duì)象;
? ? ?與對(duì)象斷開(kāi)連接;
? ? ?同步事件;
? ? ?一編程方式停止腳本執(zhí)行;
? ? ?將信息輸出到默認(rèn)輸出設(shè)備(Windows對(duì)話框或命令控制臺(tái))。
WScript.WshShell對(duì)象
? ? ?WshShell對(duì)象可以運(yùn)行程序、操作注冊(cè)表、創(chuàng)建快捷方式、訪問(wèn)系統(tǒng)文件夾、管理環(huán)境變量。
AppActivate 激活一個(gè)應(yīng)用程序窗口。
CreateShortcut 創(chuàng)建并返回 WshShortcut 對(duì)象。
Exec 在子命令窗口中運(yùn)行一個(gè)應(yīng)用程序,提供訪問(wèn)StdIn/StdOut/StdErr流。
ExpandEnvironmentStrings 擴(kuò)展 PROCESS 環(huán)境變量并返回結(jié)果字符串。
LogEvent 添加一個(gè)事件到日志文件。
Popup 顯示包含指定消息的消息窗口。
RegDelete 從注冊(cè)表中刪除指定的鍵或值。
RegRead 從注冊(cè)表中返回指定的鍵或值。
RegWrite 在注冊(cè)表中設(shè)置指定的鍵或值。
Run 創(chuàng)建新的進(jìn)程,該進(jìn)程用指定的窗口樣式執(zhí)行指定的命令。
SendKeys 發(fā)送一個(gè)或多個(gè)按鍵到活動(dòng)窗口。
具體見(jiàn)百度百科:
函數(shù)指針GetRef方法
GetRef:指向在指定事件發(fā)生時(shí)要執(zhí)行的過(guò)程的地址。
例子:
Dimoutput
? ? ?Functionout(string)
msgboxstring
? ? ?EndFunction
? ? ?'output指針指向out函數(shù)地址
? ? ?Setoutput=GetRef("out")
? ? ?'output具有了out函數(shù)的功能
? ? ?Calloutput("Success!")
VBS錯(cuò)誤處理(未完)
1)On Error Resume Next,在腳本開(kāi)頭添加該語(yǔ)句,告訴VBS在運(yùn)行時(shí)跳過(guò)發(fā)生錯(cuò)誤的語(yǔ)句。這樣一旦發(fā)生錯(cuò)誤,該語(yǔ)句將會(huì)把相關(guān)的錯(cuò)誤號(hào)、錯(cuò)誤描述和相關(guān)源代碼壓入錯(cuò)誤堆棧。
2)VBS的err對(duì)象
VBS條件和循環(huán)語(yǔ)句
條件語(yǔ)句If......Then和Select Case
If條件Then
????處理語(yǔ)句
ElseIf條件Then
????處理語(yǔ)句
Else
EndIf
SelectCase變量
Case條件值
????處理語(yǔ)句
Caseelse
????處理語(yǔ)句
EndSelect
注意:在執(zhí)行字符串比較時(shí),需注意大小寫,可使用lCase或uCase將字符串裝換成小寫或大寫。
循環(huán)控制語(yǔ)句
For......Next循環(huán) 可使用Exit For來(lái)退出循環(huán);
? ? ? ? ? Do......While 和 Do......Until循環(huán) 可使用Exit do來(lái)退出循環(huán);
? ? ? ? ? While循環(huán)。
VBS基礎(chǔ)知識(shí)
1. 定義變量 —— Dim
? ?VBS語(yǔ)法不會(huì)很嚴(yán)謹(jǐn),可以不申明變量直接使用。變量、方法、函數(shù)和對(duì)象的引用是不區(qū)分大小寫的,申明多個(gè)同類型變量,可用逗號(hào)分隔。不允許在申明變量時(shí)給變量賦值。允許在一行代碼內(nèi)同時(shí)對(duì)兩個(gè)變量進(jìn)行賦值,中間用冒號(hào)分隔。
2. 顯示申明 —— Option Explicit ?
? ? ?強(qiáng)制所有變量必須先申明才能使用。
3. 注釋
? ? ?單引號(hào)后的內(nèi)容都被解釋為注釋。
4. VBS在定義時(shí)只有一種變量類型,在實(shí)際使用中需要使用類型轉(zhuǎn)換函數(shù)來(lái)轉(zhuǎn)變成相應(yīng)的變量類型。
? ? ?Cbool轉(zhuǎn)布爾值;
? ? ?Cbyte轉(zhuǎn)換為0~255的整數(shù);
? ? ?Ccur、Cdbl、Csng都是轉(zhuǎn)浮點(diǎn)型;
? ? ?Cdate轉(zhuǎn)換為日期值;
? ? ?Cint和Clng轉(zhuǎn)換為整數(shù);
? ? ?Cstr轉(zhuǎn)換為字符串。
5. 數(shù)組
? ?數(shù)組的定義只需要在變量后描述這個(gè)數(shù)組的個(gè)數(shù)和維數(shù),定義時(shí)下標(biāo)是從1開(kāi)始,而在訪問(wèn)時(shí)下標(biāo)是從0開(kāi)始。
定義數(shù)組: Dim array(10), 可不知道個(gè)數(shù)和維數(shù)申明動(dòng)態(tài)數(shù)組 Dim array(),可使用ReDim來(lái)改變數(shù)組,在改變數(shù)組的大小時(shí),數(shù)組的數(shù)據(jù)會(huì)被破壞,使用關(guān)鍵字preserve來(lái)保護(hù)數(shù)據(jù),如ReDimpreservearray(1個(gè)數(shù),2維數(shù))。
6.操作符
? ? ?乘方使用^,取模使用Mod,不等于使用<>
? ? ?邏輯運(yùn)算符:和—>and,非—>not,或—>or
? ? ?&用來(lái)連接字符串;Is用來(lái)比較對(duì)象,同一類型結(jié)果為真,反之為假。
CheckProperty方法
語(yǔ)法:對(duì)象.CheckProperty("屬性名",“預(yù)期屬性值”,[“延時(shí)”])
用于檢查真實(shí)對(duì)象的屬性與期望的屬性是否一致
Call Action的3種方式

Call to Existing Action調(diào)用現(xiàn)有操作

選擇At the end of the test測(cè)試結(jié)束時(shí),被調(diào)用的Action是當(dāng)前Test的一個(gè)Action;若選擇After the current step,被調(diào)用的Action屬于當(dāng)前Action的一個(gè)步驟,及成為當(dāng)前Action的一個(gè)子Action,出現(xiàn)一行代碼:RunAction"Action1 [DataTable參數(shù)化]", oneIteration(進(jìn)行一次迭代)。
? ? ?在調(diào)用外部Action后,QTP會(huì)自動(dòng)添加該Action的Sheet,只讀。
? ? ?調(diào)用外部腳本的根本原因是便于維護(hù),只要修改調(diào)用的腳本,其他調(diào)用改腳本的地方都會(huì)相應(yīng)的修改掉。
Call to New Action調(diào)用新操作
? ? ?可新建1級(jí)Action或基于1級(jí)Action新建2級(jí)、3級(jí)的Action。
Call to Copy of Action調(diào)用操作副本
? ? ?復(fù)制Action,把外部Action的對(duì)象庫(kù)和代碼都復(fù)制過(guò)來(lái)。
Action的重用操作
? ? ?在下圖Action Properties中需要勾選Reusable action可重用操作,腳本才能被共享和調(diào)用。

非重用型:只能被存儲(chǔ)它的Test調(diào)用,且只能被調(diào)用一次;
重用型:咳喲多次被存儲(chǔ)它的Test或別的Test調(diào)用;
外部型:一個(gè)存儲(chǔ)在別的Test中的可重用型Action,只能在調(diào)用它的Test中只讀。
Test Data Table 和 Run-time Data Table
Test Data Table —— 在Data Table中事先準(zhǔn)備好的固定的測(cè)試數(shù)據(jù),是一組靜態(tài)數(shù)據(jù),是人為事先填寫進(jìn)去的;
Run-time Data Table —— 在QTP執(zhí)行過(guò)程中,將測(cè)試數(shù)據(jù)填寫到Data Table中,運(yùn)行結(jié)束,測(cè)試數(shù)據(jù)就消失,但可在測(cè)試報(bào)告中看到。如下代碼將“test”傳入Global Sheet的A列中:
? ? ? ? ? ? ? ?DataTable.Value("A","Global")="test"
同界面有多個(gè)相同控件
場(chǎng)景:界面上有很多相同類型的控件,需要做檢查,如對(duì)多個(gè)button進(jìn)行點(diǎn)擊操作,全都添加進(jìn)對(duì)象庫(kù)也是工作量比較大的。
方法一:使用SetTOProperty,如下列子中(百度首頁(yè))添加“新聞”的鏈接按鈕到對(duì)象庫(kù)中,之后使用SetTOProperty 可對(duì)其他鏈接按鈕進(jìn)行click操作。
Browser("百度一下,你就知道_2").Page("百度一下,你就知道").Link("新聞").SetTOProperty"text","地圖"
Browser("百度一下,你就知道_2").Page("百度一下,你就知道").Link("新聞").Click
Browser("百度一下,你就知道_2").Page("百度一下,你就知道").Link("新聞").SetTOProperty"text","視頻"
Browser("百度一下,你就知道_2").Page("百度一下,你就知道").Link("新聞").Click
方法二:使用SetTOProperty,設(shè)置index方法
? ? ?獲取同類型對(duì)象的數(shù)量
? ? ?SetTOProperty "index",i
關(guān)于index可參考?Object Indectification對(duì)象識(shí)別
方法三:使用描述性編程
? ? ?如父對(duì)象.Link("name:=XXX").Click
如有多個(gè)瀏覽器窗口可使用Browser("CreationTime:=[0,1]")
Browser("CreationTime:=1")表明當(dāng)前有且僅有一個(gè)瀏覽器窗口。
方法四:描述性編程
? ? ?給注冊(cè)百度賬號(hào)界面上的所有文本框中輸入數(shù)字“123”
'創(chuàng)建描述性編程對(duì)象
Setalledit=description.Create
'對(duì)象類型為WebEdit
alledit("micClass").value="WebEdit"
'獲取父對(duì)象下所有的WebEdit子對(duì)象
SetallChild=Browser("注冊(cè)百度帳號(hào)").Page("注冊(cè)百度帳號(hào)").ChildObjects(alledit)
'allChild.count為WebEdit對(duì)象的數(shù)量
Fori?=0ToallChild.count-1
'Item(i)中i為對(duì)象的index
Setedit=allChild.Item(i)
edit.set"123"
Next
'釋放所有設(shè)置的對(duì)象
Setalledit=nothing
SetChildnum=nothing
Setedit=nothing
意思如下:
Browser("注冊(cè)百度帳號(hào)").Page("注冊(cè)百度帳號(hào)").webedit("index:=0").Set"123"
Browser("注冊(cè)百度帳號(hào)").Page("注冊(cè)百度帳號(hào)").webedit("index:=1").Set"123"
或者
Fori?=0To1
Browser("注冊(cè)百度帳號(hào)").Page("注冊(cè)百度帳號(hào)").webedit("index:="&i).Set"234"
Next
對(duì)象庫(kù)編程與描述性編程比較
對(duì)象庫(kù)編程特點(diǎn):
可通過(guò)Complete Word,步驟生成器等方式高效編程;
腳本中引用同一個(gè)對(duì)象多次,修改對(duì)象名字,只需要在對(duì)象庫(kù)中對(duì)對(duì)象進(jìn)行更名即可,腳本會(huì)自動(dòng)更新;
有關(guān)于對(duì)象庫(kù)的各種工具。
描述性編程特點(diǎn):
不用維護(hù)對(duì)象庫(kù);
可完成一些特殊需求;
沒(méi)有Complete Word,易打錯(cuò)字。
描述性編程的兩種寫法
若對(duì)象沒(méi)有添加到對(duì)象庫(kù)中,這個(gè)時(shí)候使用對(duì)象庫(kù)編程已無(wú)法實(shí)現(xiàn),可使用描述性編程的方法。描述性編程是通過(guò)代碼中描述每個(gè)對(duì)象的屬性和屬性值來(lái)識(shí)別對(duì)象,描述性編程可描述的屬性都是封裝接口的屬性。
形式一:對(duì)象名(“屬性名:=屬性值”)
如: Browser("micClass:=Browser").page("micClass:=Page").WebEdit("name:=wd").set "test"
描述多個(gè)屬性使用逗號(hào)隔開(kāi)
如:?Browser("micClass:=Browser").page("micClass:=Page").WebEdit("name:=wd","html tag:=INPUT").set "test"
注意:若父對(duì)象描述了,子對(duì)象一定要描述。子對(duì)象描述,父對(duì)象不描述,前提是父對(duì)象在對(duì)象庫(kù)中。
形式二:使用Description對(duì)象
? ? ?使用Description對(duì)象可返回包含一組Property對(duì)象的Properties集合對(duì)象,Property對(duì)象由屬性名和值組成。其實(shí)就是將對(duì)象的屬性和屬性值的描述封裝在一個(gè)特殊的Description對(duì)象中。
如:
SetObjBrowser=Description.Create()
ObjBrowser("micClass").value="Browser"
SetObjPage=Description.Create()
ObjPage("micClass").value="Page"
SetObjWebEdit=Description.Create()
ObjWebEdit("html tag").value="INPUT"
ObjWebEdit("name").value="wd"
Browser(ObjBrowser).Page(ObjPage).WebEdit(ObjWebEdit).Set"test"
'釋放對(duì)象
SetObjBrowser=nothing
SetObjPage=nothing
SetObjWebEdit=nothing
QTP11.5的四種錄制方式
正常錄制模式Standard Windows recording?:默認(rèn)的錄制模式。
模擬錄制模式Analog Recording:此模式錄制所有鍵盤和鼠標(biāo)的精確操作,模擬錄制模式錄制下來(lái)的腳本文件比較大,且不可由QTP進(jìn)行編輯,回放時(shí)改變了屏蔽分辨率或窗口/屏幕位置回放就會(huì)失敗。前提是開(kāi)啟正常錄制模式。有相對(duì)于指定窗口和相對(duì)于屏幕錄制
低級(jí)錄制模式Low Level Recording:錄制鼠標(biāo)和鍵盤的所有操作,對(duì)對(duì)象的位置要求非常嚴(yán)格,錄制的對(duì)象都以Windows和WinObject形式存在,按照屏幕上的x坐標(biāo)和y坐標(biāo)錄制對(duì)象。
洞察錄制模式Insight recording:根據(jù)保存的截圖來(lái)識(shí)別對(duì)象。
常見(jiàn)的對(duì)象無(wú)法識(shí)別的處理方法(未完)
解決方法:
? ? ?1)設(shè)置虛擬對(duì)象,不方便以后維護(hù),工具—>虛擬對(duì)象;
? ? ?2)使用相對(duì)坐標(biāo)配合WSH定位對(duì)象;
? ? ?3)使用DOM組件接口應(yīng)用技術(shù),只可用于Web項(xiàng)目
P132頁(yè),PDF是145
封裝屬性與自身接口屬性
封裝接口是對(duì)象的不完全屬性,有些對(duì)象的屬性值是封裝接口無(wú)法獲取到的;
運(yùn)行時(shí)對(duì)象RO可看見(jiàn)自身接口的所有屬性,而對(duì)象庫(kù)中的測(cè)試對(duì)象TO只可看見(jiàn)被封裝的接口;
封裝屬性是不能修改實(shí)際運(yùn)行時(shí)的對(duì)象的,只能獲取屬性的值,而調(diào)用自身接口可以;
封裝屬性是支持TO和RO,自身接口只支持RO。
調(diào)用自身接口:
? ? ?1)對(duì)象.Object.自身屬性:
如Browser("百度一下,你就知道").Page("百度一下,你就知道").WebButton("百度一下").Object.innerText="百度百度" ?,將WebButton("百度一下")的自身接口屬性innerText設(shè)為“百度百度”。
? ? ?2)對(duì)象.Object.自身方法。
自身接口不但可以設(shè)置運(yùn)行時(shí)屬性的值,同樣也可以獲取運(yùn)行時(shí)對(duì)象的自身接口的屬性值。
使用封裝接口進(jìn)行賦值操作:
Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").Set"test"
使用自身接口方式:
Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").Object.value="test"
手寫代碼的方式及小技巧
一、步驟生成器
打開(kāi):設(shè)計(jì)—>Step Genertor步驟生成器或者使用快捷鍵F7

二、Complete Word方式
? ? ?查看:編輯—>格式—>Complete Word完成單詞,快捷鍵為Ctrl+Space,因該快捷鍵優(yōu)先認(rèn)定為中/英文切換,需要先對(duì)語(yǔ)言欄進(jìn)行設(shè)置,修改之后需要重啟電腦。
三、對(duì)象拖動(dòng)生成方法
? ? ?QTP11.5是直接從對(duì)象存儲(chǔ)庫(kù)中拖到專家視圖中。
四、QTP編程過(guò)程的小技巧
1、垂直分割選?。涸赒TP11.5中是通過(guò)同時(shí)按下Ctrl+Alt,然后鼠標(biāo)左鍵進(jìn)行選擇,選中垂直柱后,輸入需要修改的內(nèi)容即可。
2、代碼換行符:_?
如:Browser("百度一下,你就知道").Page("百度一下,你就知道")._
WebEdit("wd").Set"123"
3、顯示參數(shù)提示:編輯—>格式—>參數(shù)信息:Ctrl+Shift+Space。
4、With...End With:用來(lái)提煉公共部分,如每句代碼中前半段相同,可用With簡(jiǎn)化代碼,可嵌套使用with。
? ? ?如:
withBrowser("百度一下,你就知道").Page("百度一下,你就知道")
.WebButton("百度一下").Click @@ hightlight id_;_Browser("百度一下,你就知道").Page("百度一下,你就知道")
.WebEdit("wd").Set"123"@@ hightlight id_;_Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd")
Endwith
5、冒號(hào),用于連接不相干的兩句或多句代碼使其合成一句,位于同一行。
對(duì)屬性操作的方法
GetTOProperty()
獲取對(duì)象庫(kù)中某個(gè)對(duì)象的某個(gè)屬性值;
對(duì)象.GetTOProperty("封裝屬性名")。
GetTOProperties()
獲取對(duì)象庫(kù)中某個(gè)對(duì)象的所有屬性值,獲取的是一個(gè)數(shù)組;
對(duì)象.GetTOProperties();
例子:
SetProperties?=?Browser("百度一下,你就知道").Page("百度一下,你就知道").WebButton("百度一下").GetToProperties()
PropertiesCount?=?Properties.Count
print"對(duì)象總計(jì)存在"&PropertiesCount&"個(gè)封裝屬性"
Fori?=1ToPropertiesCount-1
PropName?=?Properties(i).Name
PropValue?=?Properties(i).Value
print PropName&"="&PropValue
Next
SetProperties?=Nothing ? ? ?'釋放對(duì)象
輸出:

SetTOProperty
修改對(duì)象庫(kù)中某個(gè)對(duì)象的某個(gè)屬性的值,修改是臨時(shí)性的,只在腳本運(yùn)行時(shí)有效,一旦腳本運(yùn)行結(jié)束,對(duì)象庫(kù)中的值就會(huì)還原;
對(duì)象.SetTOProperty "封裝屬性名","封裝屬性值";
使用SetTOProperty方法,后面的參數(shù)不需要加括號(hào),因?yàn)樗鼪](méi)有返回值。
GetRoProperty()
獲取實(shí)際在運(yùn)行時(shí)的某個(gè)對(duì)象的某個(gè)屬性值(不是從對(duì)象庫(kù)中獲?。话阌糜趧?dòng)態(tài)獲取實(shí)際運(yùn)行時(shí)的屬性和預(yù)期的測(cè)試數(shù)據(jù)進(jìn)行比對(duì);
對(duì)象.GetRoProperty("封裝屬性名")
注意:若需要比較如編輯框的value值,需要先獲取對(duì)象庫(kù)中的值,再獲取運(yùn)行時(shí)對(duì)象的值,做比對(duì);Value值會(huì)獲取獲取目前編輯框中的值。
Test Object和Run-time Object
測(cè)試對(duì)象(TO)是被添加到對(duì)象庫(kù)中的對(duì)象,即庫(kù)中對(duì)象;運(yùn)行時(shí)對(duì)象(RO)是被測(cè)試軟件實(shí)際所運(yùn)行的對(duì)象,即軟件運(yùn)行中的對(duì)象。
? ? ?TO和RO都是QTP封裝的對(duì)象,使用QTP封裝好的屬性,但RO也可以調(diào)用自身接口的屬性。
? ? ?TO測(cè)試對(duì)象是為了識(shí)別RO運(yùn)行時(shí)對(duì)象而存在的。
對(duì)象偵測(cè)Object Spy
打開(kāi)方式:
Tools—>Object Spy;
工具欄中的Object Spy圖標(biāo);
對(duì)象庫(kù)中也可打開(kāi)。

1. Properties(屬性)選項(xiàng)卡
Native Properties(即圖中本地):對(duì)象控件自身接口的屬性;
Identification Properties(標(biāo)識(shí)):QTP為該對(duì)象控件封裝的屬性。
2. Operations(操作)
? ? ?對(duì)象自身和QTP封裝的操作和方法。
3. 半操作模式:Ctrl鍵,支持點(diǎn)擊。使用Spy點(diǎn)擊白色手指后,鼠標(biāo)光標(biāo)為手指狀,即捕獲對(duì)象的狀態(tài)。按住Ctrl鍵不放,可做鼠標(biāo)點(diǎn)擊動(dòng)作,放開(kāi)Ctrl回到捕獲狀態(tài)。
4. 全操作模式:Ctrl+Alt鍵,支持鼠標(biāo)點(diǎn)擊和鍵盤輸入。先按住Ctrl不放,再按下Alt鍵,然后先松開(kāi)Ctrl再松開(kāi)Alt鍵,這樣就切換到券操作模式。按下Ctrl并松開(kāi)回到捕獲狀態(tài)。
QTP運(yùn)行模式
打開(kāi)Tool—>Options—>GUI測(cè)試—>測(cè)試運(yùn)行:

以QC方式調(diào)用執(zhí)行腳本,運(yùn)行模式是Fast;
Normal方式運(yùn)行時(shí),腳本左側(cè)有黃色箭頭;
Normal方式可設(shè)置時(shí)間間隔,單位為毫秒。
對(duì)象存儲(chǔ)庫(kù)管理器Object Repository Manager
打開(kāi)方式:Resources—>Object Repository Manager
即公共對(duì)象庫(kù),是一套管理對(duì)象庫(kù)的模塊。

打開(kāi)外部對(duì)象文件后,是不能進(jìn)行編輯的,需要點(diǎn)擊Enable Editing按鈕,如上圖。

Object Repository Comparison Tool對(duì)象存儲(chǔ)庫(kù)比較工具,用于分析兩個(gè)對(duì)象庫(kù)文件之間的差異。
Object Repository Merge Tool對(duì)象存儲(chǔ)庫(kù)合并工具,
對(duì)象庫(kù)Object Repository
打開(kāi)方式Resources —>Object Repository或Ctrl+R:

? ? ?通過(guò)圖中標(biāo)記處,可進(jìn)行Action的切換,來(lái)查看和添加不同Action下的對(duì)象。若腳本調(diào)用了外部Action,也可以切換到外部Action,對(duì)外部Action只有查看對(duì)象的權(quán)限。
如果剪切/復(fù)制的是父對(duì)象,那么粘貼后,其子對(duì)象會(huì)被一起剪切/復(fù)制過(guò)去,刪除操作也一樣;
復(fù)制子對(duì)象,粘貼后,只是子對(duì)象被復(fù)制。
1) Ctrl+F或編輯—>查找和替換:可進(jìn)行查找對(duì)象,并將對(duì)象的屬性值替換掉。
2) 加號(hào)按鈕Add Object to Local:添加對(duì)象,當(dāng)子對(duì)象被添加時(shí),其父對(duì)象會(huì)一起被添加到對(duì)象庫(kù)中。添加父對(duì)象子對(duì)象不會(huì)被添加。
3) 對(duì)象更新:見(jiàn)圖中標(biāo)識(shí)圖標(biāo)或?qū)ο蟆?gt;從應(yīng)用程序更新。同類型的空間可隨意更新,但不同種類的對(duì)象空間無(wú)法更新。
4) Highlight in Application見(jiàn)圖中標(biāo)識(shí),選中對(duì)象后,點(diǎn)擊該按鈕,可高亮對(duì)象。能高亮說(shuō)明對(duì)象本身能被識(shí)別。
5) 對(duì)于從外部加載的對(duì)象庫(kù)(關(guān)聯(lián)存儲(chǔ)庫(kù)中),可選擇對(duì)象Copy to local,復(fù)制到本地。Copy to local,copy父對(duì)象,祖父對(duì)象會(huì)跟過(guò)去,子對(duì)象不會(huì)。
6)下圖中導(dǎo)出并替換本地對(duì)象,實(shí)際效果是導(dǎo)出對(duì)象并自動(dòng)替換成副對(duì)象(自動(dòng)將導(dǎo)出的對(duì)象添加到關(guān)聯(lián)存儲(chǔ)庫(kù)中)來(lái)使用。

修改對(duì)象庫(kù)中對(duì)象的名稱,QTP會(huì)自動(dòng)更新代碼。
關(guān)聯(lián)存儲(chǔ)庫(kù)Associate Repositories
打開(kāi)方式:Resourse—>Associate Repositories
從外部導(dǎo)入的對(duì)象庫(kù),只讀。
動(dòng)態(tài)對(duì)象庫(kù)加載:
RepositoriesCollection.Add"E:\zlp\QTP\123.tsr"
一旦執(zhí)行到這句代碼會(huì)觸發(fā)加載外部對(duì)象庫(kù)文件,效果和手動(dòng)添加一致,但是動(dòng)態(tài)加載生命周期很短,腳本執(zhí)行介紹它也就結(jié)束了。

智能識(shí)別Smart Identification
? ? ?智能識(shí)別:從Object Identification對(duì)話框中可看到對(duì)于所有的Web對(duì)象模型都是默認(rèn)勾選智能識(shí)別的,這里的智能識(shí)別針對(duì)的是某一個(gè)具體對(duì)象。
? ? ?對(duì)智能識(shí)別屬性進(jìn)行設(shè)置,左側(cè)的基本篩選屬性是即時(shí)生效的,即智能識(shí)別會(huì)首先判斷這些屬性,而右側(cè)的可選屬性只有當(dāng)左側(cè)屬性列表中的屬性全部使用后仍沒(méi)有識(shí)別到的情況下才會(huì)生效,QTP會(huì)根據(jù)可選屬性列表中的屬性按照設(shè)定好的屬性順序來(lái)一個(gè)個(gè)進(jìn)行只能識(shí)別,直到匹配到一個(gè)為止,若所有備用的屬性都不能識(shí)別到則QTP會(huì)報(bào)錯(cuò)。
? ? ?智能識(shí)別是按照順序?qū)σ粋€(gè)個(gè)屬性進(jìn)行判斷,直到匹配到其中的一個(gè)屬性。
Tools—>Object Identification:

File—>Settings—>Run:

? ? ?Run中的智能識(shí)別是總開(kāi)關(guān),一旦勾選,則不會(huì)進(jìn)行智能識(shí)別。開(kāi)啟Run中的智能識(shí)別,開(kāi)啟Object Identification中某個(gè)對(duì)象的智能識(shí)別,則在運(yùn)行中對(duì)該對(duì)象可進(jìn)行智能識(shí)別。
QTP兩種視圖
關(guān)鍵字視圖:Keyword View
? ? ? ? ? 是圖形化的視圖。
? ? ? ? ? Item(項(xiàng)):記錄所有對(duì)象; ?
? ? ? ? ? Operation(操作):該對(duì)象的操作;
? ? ? ? ? Value(值):對(duì)象操作所用到的值;
? ? ? ? ? Documentation:對(duì)象操作所用到的值;
? ? ? ? ? 注釋:添加的注釋語(yǔ)句。
? ? ? ??1、導(dǎo)出測(cè)試步驟:在關(guān)鍵字視圖中,右擊“Documentation”或其他標(biāo)題都可,選擇“Copy Documentation to Clipboard”可以到處測(cè)試步驟文檔,生成測(cè)試用例,用于指導(dǎo)手工測(cè)試的進(jìn)行;
? ? ? ? ? 2、添加注釋:在關(guān)鍵字視圖中,列名為Comment的列,可在該列中為每個(gè)測(cè)試步驟添加注釋;
? ? ? ? ? 3、插入檢查點(diǎn)、插入新的測(cè)試步驟等等。
專家視圖:Expert View
? ? ? ? ?腳本開(kāi)發(fā)的視圖。
切換方法:查看—>關(guān)鍵字視圖/編輯器

QTP兩種回放模式
QTP的兩種回放模式是:
Event模式事件跟蹤
Mouse模式鼠標(biāo)跟蹤
? ? ?Event模式就是平時(shí)默認(rèn)使用的模式,觸發(fā)對(duì)象的相應(yīng)事件,而不是通過(guò)鼠標(biāo)光標(biāo)來(lái)進(jìn)行點(diǎn)擊等操作。Mouse模式回放時(shí)能看到鼠標(biāo)光標(biāo)是跟著對(duì)象走的。
切換回放模式:
Tools—>Options—>Web—>Advanced中Run settings下的Replay type:

用代碼控制回放模式:
Setting.WebPackage(“ReplayType”) = 1或2
1代表Event事件跟蹤模式,2代表Mouse鼠標(biāo)跟蹤模式。
QTP回放機(jī)制
? ? ?回放機(jī)制原理:QTP從腳本中讀取到該對(duì)象,并根據(jù)對(duì)象的層次和名稱到對(duì)象庫(kù)中尋找相同名稱的測(cè)試對(duì)象,在對(duì)象庫(kù)中找到相應(yīng)地測(cè)試對(duì)象并獲得該測(cè)試對(duì)象的屬性,然后根據(jù)這個(gè)測(cè)試對(duì)象的屬性,在運(yùn)行的網(wǎng)頁(yè)或應(yīng)用程序中進(jìn)行匹配,尋找運(yùn)行時(shí)的對(duì)象。如果成功匹配上,再根據(jù)腳本中記錄的該對(duì)象的方法、動(dòng)作和參數(shù)值進(jìn)行應(yīng)用,如未能匹配上,則在超過(guò)等待時(shí)間后報(bào)錯(cuò),腳本即宣布運(yùn)行失敗。
對(duì)回放設(shè)置的菜單:
File—>Settings—>Run:

? ? ?2. File—>Settings—>Web:等待網(wǎng)頁(yè)加載的最大值,默認(rèn)為60s,超過(guò)60s就會(huì)執(zhí)行下一步,找不到對(duì)象報(bào)錯(cuò)。

錄制相關(guān)功能
1、Record?and Run Settings:錄制與運(yùn)行設(shè)置。在QTP11.5中的位置Record---->Record?and Run Settings。


上圖中程序參數(shù)(Program arguments):打開(kāi)應(yīng)用時(shí)設(shè)置特定的參數(shù),我的理解是如在windows命令行中打開(kāi)應(yīng)用后臺(tái)添加的參數(shù)。
Include descendant processes:包括子進(jìn)程。
2、Web Event Recording Configuration:Web事件錄制設(shè)置。在QTP11.5中的位置:Record---->Web Event Recording Configuration,只能應(yīng)用于B/S架構(gòu)系統(tǒng),如設(shè)置級(jí)別為高,則能錄制鼠標(biāo)懸停事件。

QTP插件 Add-in
Add-in Manager(插件管理器),默認(rèn)自帶三個(gè)插件,如下圖所示:

? ? ?Add-in是用來(lái)識(shí)別對(duì)象控件,所以插件的選擇和被測(cè)對(duì)象控件有關(guān)。對(duì)于Web測(cè)試而言,與項(xiàng)目具體使用的語(yǔ)言沒(méi)有多大關(guān)系。但是對(duì)于Windows桌面應(yīng)用程序而言,插件的選擇和開(kāi)發(fā)語(yǔ)言是有關(guān)系的,QTP有相應(yīng)的Add-in對(duì)應(yīng)不同語(yǔ)言的桌面應(yīng)用程序。
說(shuō)明:使用QTP測(cè)試網(wǎng)頁(yè),先打開(kāi)QTP,再打開(kāi)測(cè)試網(wǎng)頁(yè),以免QTP無(wú)法識(shí)別對(duì)象。因?yàn)槊看未蜷_(kāi)瀏覽器都會(huì)加載BHOManager,QTP識(shí)別對(duì)象是依靠BHOManager Class動(dòng)態(tài)鏈接庫(kù)來(lái)完成,若先打開(kāi)瀏覽器再打開(kāi)QTP,QTP不能成功讀到BHOManager Class動(dòng)態(tài)鏈接庫(kù),從而導(dǎo)致對(duì)象識(shí)別的失敗。
關(guān)于BHO的解釋,見(jiàn)文章“BHO 瀏覽器輔助對(duì)象”
BHO 瀏覽器輔助對(duì)象
? ? ?BHO:Browser Helper Object,瀏覽器輔助對(duì)象,是微軟推出的作為瀏覽器對(duì)第三方程序員開(kāi)放交互接口的業(yè)界標(biāo)準(zhǔn),通過(guò)代碼可進(jìn)入瀏覽器領(lǐng)域的“交互接口(INTERACTIVED Interface)。通過(guò)這個(gè)接口,程序員可以編寫代碼獲取瀏覽器的行為。
? ? ?BHO對(duì)象依托于瀏覽器主窗口。這意味著一旦一個(gè)瀏覽器窗口產(chǎn)生,一個(gè)新的BHO對(duì)象實(shí)例就要生成。任何BHO對(duì)象與瀏覽器實(shí)例的生命周期是一致的。其次, BHO僅存在于Internet Explorer 4.0及以后版本中。
QTP三種錄制模式 需要再補(bǔ)充
QTP的三種錄制模式分別是:正常錄制、模擬錄制和低級(jí)錄制。
正常錄制
開(kāi)啟方法:
即默認(rèn)的錄制模式,通過(guò)識(shí)別對(duì)象屬性來(lái)錄制。
模擬錄制
開(kāi)啟方法:
可錄制鍵盤和鼠標(biāo)的精確操作,鼠標(biāo)的運(yùn)動(dòng)軌跡。錄制下來(lái)的文件比較大,而且不可以由QTP進(jìn)行編輯。若回放時(shí),改變了屏幕的分辨率或窗口/屏幕位置,回放就會(huì)失敗。
低級(jí)錄制
開(kāi)啟方法:
記錄坐標(biāo)的位置,在回放時(shí)對(duì)象的坐標(biāo)有一點(diǎn)改變就會(huì)回放失敗,將所有父類對(duì)象錄制未Windows測(cè)試對(duì)象,將所有的其他對(duì)象錄制為WinObject測(cè)試對(duì)象。
模擬錄制與低級(jí)錄制區(qū)別 P42