《精通QTP—自動(dòng)化測(cè)試技術(shù)領(lǐng)航》

場(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), 步驟名稱(chēng), 詳細(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可自由編寫(xiě)峭范;

ReportEvent可將截圖寫(xiě)在測(cè)試報(bào)告中财松。

自定義驗(yàn)證點(diǎn)HTML模式腳本:

截圖到測(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ū)分大小寫(xiě)辕近。

Global Sheet

? ? ?1. Global Sheet是一個(gè)全局變量欢伏,有幾行數(shù)據(jù)(中間有行為空也會(huì)執(zhí)行)主慰,程序就要回放幾次,不用寫(xiě)循環(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屬性我們只能?chē)L試改變對(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)侍咱,完成該場(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類(lèi)型溉苛,必須使用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吼拥,變量類(lèi)型為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)境變量文件的路徑名稱(chēng), environment.ExternalFileName?茵烈。


函數(shù)資源庫(kù)Library Files

資源池靜態(tài)調(diào)用

1百匆、首先創(chuàng)建了一個(gè)test.txt文件,寫(xiě)入函數(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ù)寫(xiě)在txt文件中,也可以在QTP中File ——> New ——> Function Library中編寫(xiě)磷醋。

動(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ù)操作類(lèi)似,只是路徑不同骇陈,若有兩人及以上同時(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è)置為T(mén)rue表示覆蓋同路徑下相同名稱(chēng)文件蹬跃;

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ì)象控件類(lèi)名, 一般填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命令

該命令的作用是模擬鍵盤(pán)操作业踏,將一個(gè)或多個(gè)按鍵指令發(fā)送到指定的Windows窗口來(lái)控制應(yīng)用程序缩筛,是WshShell對(duì)象的方法。

例子:SetWshShell?=CreateObject("WScript.Shell")

WshShell.SendKeys"Happy Birthday!"

特殊功能鍵說(shuō)明:

Shift:+

Ctrl : ^

Alt ?:%

+號(hào):{+}

回車(chē):{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)百度百科:

http://baike.baidu.com/link?url=YSylKSEg-DC3uSQ0D6qUOA9GMi8XOdIq-LAheE42D0CO1gorCZCQwoozX7PW6L2871RWkb-TUFxfeTCSc8pV5K

函數(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í),需注意大小寫(xiě)恐锣,可使用lCase或uCase將字符串裝換成小寫(xiě)或大寫(xiě)茅主。

循環(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ì)很?chē)?yán)謹(jǐn)仓洼,可以不申明變量直接使用伦吠。變量、方法榜贴、函數(shù)和對(duì)象的引用是不區(qū)分大小寫(xiě)的矢赁,申明多個(gè)同類(lèi)型變量糯笙,可用逗號(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í)只有一種變量類(lèi)型,在實(shí)際使用中需要使用類(lèi)型轉(zhuǎn)換函數(shù)來(lái)轉(zhuǎn)變成相應(yīng)的變量類(lèi)型抄邀。

? ? ?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ì)象碍粥,同一類(lèi)型結(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ù)穆律,是人為事先填寫(xiě)進(jìn)去的惠呼;

Run-time Data Table —— 在QTP執(zhí)行過(guò)程中,將測(cè)試數(shù)據(jù)填寫(xiě)到Data Table中峦耘,運(yùn)行結(jié)束剔蹋,測(cè)試數(shù)據(jù)就消失,但可在測(cè)試報(bào)告中看到贡歧。如下代碼將“test”傳入Global Sheet的A列中:

? ? ? ? ? ? ? ?DataTable.Value("A","Global")="test"

同界面有多個(gè)相同控件

場(chǎng)景:界面上有很多相同類(lèi)型的控件滩租,需要做檢查,如對(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方法

? ? ?獲取同類(lèi)型對(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ì)象類(lèi)型為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ò)字贫途。

描述性編程的兩種寫(xiě)法

若對(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:此模式錄制所有鍵盤(pán)和鼠標(biāo)的精確操作揍堕,模擬錄制模式錄制下來(lái)的腳本文件比較大料身,且不可由QTP進(jìn)行編輯,回放時(shí)改變了屏蔽分辨率或窗口/屏幕位置回放就會(huì)失敗衩茸。前提是開(kāi)啟正常錄制模式芹血。有相對(duì)于指定窗口和相對(duì)于屏幕錄制

低級(jí)錄制模式Low Level Recording:錄制鼠標(biāo)和鍵盤(pán)的所有操作,對(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"


手寫(xiě)代碼的方式及小技巧

一困曙、步驟生成器

打開(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ù)中拖到專(zhuān)家視圖中。

四杨耙、QTP編程過(guò)程的小技巧

1赤套、垂直分割選取:在QTP11.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)擊和鍵盤(pá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)用程序更新澄港。同類(lèi)型的空間可隨意更新,但不同種類(lèi)的對(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ì)象的名稱(chēng)杨蛋,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ì)象操作所用到的值;

? ? ? ? ? 注釋?zhuān)禾砑拥淖⑨屨Z(yǔ)句母截。

? ? ? ??1到忽、導(dǎo)出測(cè)試步驟:在關(guān)鍵字視圖中,右擊“Documentation”或其他標(biāo)題都可清寇,選擇“Copy Documentation to Clipboard”可以到處測(cè)試步驟文檔喘漏,生成測(cè)試用例,用于指導(dǎo)手工測(cè)試的進(jìn)行华烟;

? ? ? ? ? 2陷遮、添加注釋?zhuān)涸陉P(guān)鍵字視圖中,列名為Comment的列垦江,可在該列中為每個(gè)測(cè)試步驟添加注釋?zhuān)?/p>

? ? ? ? ? 3帽馋、插入檢查點(diǎn)搅方、插入新的測(cè)試步驟等等。

專(zhuān)家視圖: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ì)象的層次和名稱(chēng)到對(duì)象庫(kù)中尋找相同名稱(chēng)的測(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的解釋?zhuān)?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è)接口庐冯,程序員可以編寫(xiě)代碼獲取瀏覽器的行為孽亲。

? ? ?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)啟方法:

可錄制鍵盤(pán)和鼠標(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ì)回放失敗洒疚,將所有父類(lèi)對(duì)象錄制未Windows測(cè)試對(duì)象歹颓,將所有的其他對(duì)象錄制為WinObject測(cè)試對(duì)象。

模擬錄制與低級(jí)錄制區(qū)別 P42

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拳亿,一起剝皮案震驚了整個(gè)濱河市晴股,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肺魁,老刑警劉巖电湘,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鹅经,居然都是意外死亡寂呛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)瘾晃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贷痪,“玉大人,你說(shuō)我怎么就攤上這事蹦误〗俾#” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵强胰,是天一觀的道長(zhǎng)舱沧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)偶洋,這世上最難降的妖魔是什么熟吏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮玄窝,結(jié)果婚禮上牵寺,老公的妹妹穿的比我還像新娘。我一直安慰自己恩脂,他們只是感情好帽氓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著俩块,像睡著了一般黎休。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上典阵,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天奋渔,我揣著相機(jī)與錄音,去河邊找鬼壮啊。 笑死嫉鲸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的歹啼。 我是一名探鬼主播玄渗,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼座菠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了藤树?” 一聲冷哼從身側(cè)響起浴滴,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岁钓,沒(méi)想到半個(gè)月后升略,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屡限,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年品嚣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钧大。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翰撑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啊央,到底是詐尸還是另有隱情眶诈,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布瓜饥,位于F島的核電站逝撬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏压固。R本人自食惡果不足惜球拦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一靠闭、第九天 我趴在偏房一處隱蔽的房頂上張望帐我。 院中可真熱鬧,春花似錦愧膀、人聲如沸拦键。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芬为。三九已至,卻和暖如春蟀悦,著一層夾襖步出監(jiān)牢的瞬間媚朦,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工日戈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留询张,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓浙炼,卻偏偏與公主長(zhǎng)得像份氧,于是被迫代替她去往敵國(guó)和親唯袄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容