上一次講座我們簡單介紹了下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();
效果圖: