qtp自動化測試實踐:【軟體測試自動化-QTP系列講座 46】== JScript在QTP中的終極探究

來源:互聯網
上載者:User

上一次講座我們簡單介紹了下QTP中如何執行javascript,其實說穿了也就是藉助QTP的封裝方法來進行執行javascript,主要還是想照顧下新手所以簡單介紹一下這塊內容,可能對一些測試高手們來說不值一提,但是今天這次講座相信一定會讓你眼前一亮,應該可以說本次課程是領先技術講座的高潮。擦亮你的眼睛,來看如何真正意義上在QTP編輯器中直接執行JAVASCRIPT,並把try catch應用到實際應用中。從此擺脫vbs那種渣一樣的錯誤捕獲。
在這之前請允許我來介紹一個組件,它就是MSHTML組件,我們可以通過這個組件來執行js
Javascript執行指令碼
Set oHTML = CreateObject("htmlfile")
Set Js = oHTML.parentWindow
Js.execScript "alert("test")"
分析:通過以上指令碼我們可以非常輕鬆的執行javascript,執行結果會直接彈出test文字框。
結果:

那麼我們是否可以在QTP中執行以下代碼呢?
Set oHTML = CreateObject("htmlfile")
Set Js = oHTML.parentWindow
Js.execScript _
"Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").set("iquicktest");"
分析:我們現在要做的是通過以上javascript方式來控制QTP的物件模型,因為只有這樣才有意義,不是嗎?但是當你執行以上代碼時,你會發現一件很惱火的事情,QTP直接拋了一個錯誤:

為什麼會出現如上圖的錯誤呢,這是因為javascript指令碼層與vbscript指令碼層是在不同的兩個空間之中的,雖然在vbscript指令碼層中是可以直接控制Browser對象的,但是到了javascript中這個對象卻是空的,根本沒有這個對象存在,因此執行後回拋錯,那麼現在的問題是我們如何把vbscript指令碼層中的測試物件模型直接傳遞到javascript指令碼層呢,這就需要進行穿越了,只有空間扭曲才可以做到,呵呵,開個玩笑,其實很簡單,來看以下指令碼:
QTP中任意對象的穿越
Set oHTML = CreateObject("htmlfile")
Set Js = oHTML.parentWindow
"聲明Browser對象
Js.execScript "var Browser;"
"把Browser對象層
Set Js.Browser = Browser
Js.execScript _
"Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").set("iquicktest");"
分析:執行以上指令碼後,你會發現iquicktest被成功輸入到百度文字框中了(別忘了先把對象都添加到物件程式庫,這個我就不解釋了),別急,還沒玩,這才只是一個小小的開始,還有很多重量級的沒有上台,怎麼能就這樣結束了呢。那麼我在本文開頭也說了,要讓QTP真正意義上的執行javascript,那麼現在就開始進入到我們的高潮部分。可能對於一些高手們我相信你應該已經想到我接下來需要怎麼做了,來看下一段指令碼。
On error resume next
Call InitJSEngine
Function InitJSEngine()
"建立htmlfile組件
Set oHTML = createobject("htmlfile")
"通過GetObject拿到qtp自動化模型執行個體
Set qtapp = getobject("","quicktest.application")
"定義js,以及一些需要穿越的對象
set JS = oHTML.parentWindow
js.execScript "var Browser,Setting,Print;"
set Js.Browser = Browser
Set Js.Print = Print
Set js.Setting = Setting
"擷取到QTPACTION1中的指令碼內容並執行
js.execScript qtapp.Test.Actions("Action1").GetScript
End Function
分析:以上指令碼中我們主要定義了一個函數,這個函數其實很簡單,js執行部分其實和之前講一樣,主要是筆者通過aom方式把qtp指令碼編輯器中的指令碼內容直接捕獲下來並通過js的方式執行,這一點對於熟悉aom的朋友應該很容易就能想到。那麼把此檔案命名為Js.qfl放入到Resources中:

接著我們直接在QTP指令碼編輯器中輸入javascript指令碼:
function testflow()
{
var p = Browser("百度一下,你就知道").Page("百度一下,你就知道");
p.WebEdit("wd").Set("iquicktest");
p.WebButton("百度一下").Click();
}
testflow();
效果圖:

那麼接下來如果直接執行指令碼,QTP會首先去驗證指令碼是不是符合vbs文法,如果出錯會彈出錯誤框,導致執行中斷:

如圖,QTP報錯說存在無效字串,因此我們需要把這類錯誤處理框進行過濾。
進入Test Settings後,選擇run選項

如圖,更改When error occurs during run session:選項為Stop Run,為什麼這樣設定?
原因分析:QTP在執行測試指令碼的順序是首先執行Resources中的函數庫,接著才開始執行指令碼編輯器的。
改寫完畢之後,再次執行指令碼,此時你會驚奇的發現,可以成功在QTP編輯器中直接執行javascript吧。嘿嘿,別急,還沒完!!
高潮怎麼可以這麼快就結束了呢,try catch還沒有登場,這可是最最重量級的,指令碼如下:
function testflow()
{
//設定逾時時間為100
Setting.Item("DefaultTimeOut") = 100;
Print ("********************* Javascript in QTP - Report ********************* ");
//使用try catch語句對QTP指令碼進行錯誤處理
try{
var p = Browser("百度一下,你就知道").
Page("百度一下,你就知道");
p.WebEdit("wd").Set("iquicktest"); 本文連結http://www.cxybl.com/html/wyzz/JavaScript_Ajax/20121126/34400.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.