2011-07-14 47 views
0

我已經遇到了麻煩的QTP(快速測試親)使用VBScript的問題。QTP VBScript類型不匹配錯誤函數沒有參數

我已經定義在VBScript這個子(我也曾嘗試用相同的結果將其定義爲一個函數):

Sub KillProcess() 
    KillprocessIE = "The process i want to kill" 
    Set ProcessList2 = GetObject("winmgmts://.").InstancesOf("win32_process") 
    For Each Process In ProcessList2 
    If Process.Name = KillProcessIE Then 
     Process.Terminate 
     Exit for 
    End If 
    Next 
End Sub 

但是當我嘗試無論是使用

call KillProcess() 
KillProcess() 
KillProcess 
運行它

我收到一個錯誤,說「Typer stemmer ikke overens:'KillProcess'」與丹麥語翻譯的意思是類似於「類型不匹配:'KillProcess'。我猜這是一個類型不匹配的錯誤,但由於翻譯,我無法確定。

它談論什麼類型?我在函數調用中沒有參數,我沒有給任何值賦值?

還應該說,如果我直接運行完全相同的代碼而不將其定義爲函數,它的工作原理沒有問題。

+0

你有沒有試過在'.vbs'文件中查看問題是否與QTP相關? – Motti

+0

我已經複製/粘貼了你的代碼,它在QTP 11中工作正常,你確定你沒有錯別的地方嗎? – Motti

回答

3

無論何時調用未定義的子或函數,都會出現類型不匹配錯誤。

儘管這本身就是一個奇蹟(爲此我可以找到一個適用於函數但不適用於子類的合理推理),它表明在您的特定場景中,KillProcess在您調用的腳本中未知它。

可能的原因:

  • 的KillProcess聲明是在未在 相關的函數庫設置對話框中列出一個函數庫。
  • KillProcess聲明處於活動狀態,但您的呼叫包含一個或多個拼寫錯誤 (如「KillProccess」或類似的東西)。

正如Motti指出的那樣,您發佈的代碼片段看起來很好,所以必須有其他一些故障。

有關子對比函數的另一個提示:請注意,您通常不會將帶有括號的Sub稱爲參數。如果指定了他們,他們被認爲是一個長期的部分進行評估,因爲

X term 

相同

X (term) 

因此,這並不在這種情況下產生的錯誤信息。 然而,對於具有兩個或更多個參數替補,指定所有實際參數在一個支架對,像在

Y (term1, term2) 

產生錯誤,類似「不能調用以括號中參數的子」,或左右。如果你認爲一個論點確實可以在括號中指定,這很難理解。

(有關委託主題的更完整概述,請參閱ByRef and ByVal in VBScript和相關問題)。

一般建議:使用

option explicit 

在所有腳本(特別是函數庫)的所有時間的頂部。 RTFM如果需要的話。它可能看起來像更多的工作(因爲它會強制你在使用它們之前聲明所有的變量),但它可以避免細微的錯誤。

+1

實際上,'X term'並不總是與'X(term)'相同 - 請參閱[this question](http://stackoverflow.com/q/1537819/113116)以獲取示例和解釋。 – Helen

+1

啊'選擇性的諷刺'... – Motti

1

我認爲你已經遇到了奇怪的行爲QTP,但通過邏輯,當你明白爲什麼。

之所以會出現這種情況可能是因爲你叫KillProcess(「從步驟運行」)及以上喜歡有定義的函數:

Sub KillProcess() 
     . 
     . 
     . 
End Sub 

call KillProcess() 

如果運行代碼「呼叫KillProcess()」 QTP將返回「運行錯誤」,「類型不匹配」

相反,如果讓函數像這樣

call KillProcess() 

Sub KillProcess() 
     . 
     . 
     . 
End Sub 

然後QTP執行語句下面定義的「知道」函數,你正在調用,並會像它應該執行腳本。

原因是,使用「從步驟運行」只讀取步驟和下面的代碼行,而不是上面寫的代碼行。