[说明] 以下用JS表示JavaScript, 用VBS表示VBScript
版权归 陈奕斌 所有
在使用QTP做自动化测试过程中,有些时候希望获取JS中的变量的值,如一些封装的控件经常在JS的变量中存储本控件的状态,如果知道这个状态,对于QTP操作此控件是很有帮助的。另外,有一些页面会在JS中存储页面相关控件的对象,通过获取JS中的对象变量就可以操作这些控件了。
因此在查看相关DHTML帮助文档后,写了以下函数:
'/****************************************************/
'* 功能:读取JS变量或语句的值,支持返回值为对象
'* 参数:oDocumentObj:要是document对象,如Page().object,Frame().object
'* strVariableName:JS是的变量名或语句,执行后的值可以是字符串也可以是对象
'* errReturn:出错时的返回值
'* 返回值: 变量的值或对象,出错时返回errReturn指定值
'* 编写人: chenyb
'* 编写日期:2011-08-13
'* 其他说明:以下只是方法,根据需要再扩展
'/****************************************************/
Function QtpGetJsVariableAdvance(oDocumentObj,strVariableName,errReturn )
Dim objScript,qtpGetJsVarObj,rtValue
On Error Resume Next
oDocumentObj.createAttribute "JsVariableAdvanceValue"
Set objScript = oDocumentObj.createElement( "script" )
objScript.language = "javascript"
objScript.type = "text/javascript"
objScript.defer = true
objScript.text = "document.JsVariableAdvanceValue = " & strVariableName & ";"
oDocumentObj.appendChild objScript
If IsObject(oDocumentObj.JsVariableAdvanceValue) Then
Set rtValue = oDocumentObj.JsVariableAdvanceValue
Else
rtValue = oDocumentObj.JsVariableAdvanceValue
End If
oDocumentObj.removeChild objScript
If Err.Number <> 0 Then
If IsObject(errReturn) Then
Set QtpGetJsVariableAdvance = errReturn
Else
QtpGetJsVariableAdvance = errReturn
End If
Else
If IsObject(rtValue) Then
Set QtpGetJsVariableAdvance = rtValue
Else
QtpGetJsVariableAdvance = rtValue
End If
End If
On Error Goto 0
End Function
在做以上试验过程中,突然想到,之前写ASP时,在页面的VBS中想调用JS中的变量是否可以使用同样的方法呢? 于是改造一下上面函数,以便用于页面的VBS中。函数如下:
'/****************************************************/
'* 功能:读取JS变量或语句的值,支持返回值为对象
'* 参数:strVariableName:JS是的变量名或语句,执行后的值可以是字符串也可以是对象
'* errReturn:出错时的返回值
'* 返回值: 变量的值或对象,出错时返回errReturn指定值
'* 编写人: chenyb
'* 编写日期:2011-08-13
'* 其他说明:以下只是方法,根据需要再扩展
'/****************************************************/
Function GetJsVariableAdvance(strVariableName,errReturn )
Dim objScript,qtpGetJsVarObj,rtValue
On Error Resume Next
document.createAttribute "JsVariableAdvanceValue"
Set objScript = document.createElement( "script" )
objScript.language = "javascript"
objScript.type = "text/javascript"
objScript.defer = true
objScript.text = "document.JsVariableAdvanceValue = " & strVariableName & ";"
document.appendChild objScript
If IsObject(document.JsVariableAdvanceValue) Then
Set rtValue = document.JsVariableAdvanceValue
Else
rtValue = document.JsVariableAdvanceValue
End If
document.removeChild objScript
If Err.Number <> 0 Then
If IsObject(errReturn) Then
Set GetJsVariableAdvance = errReturn
Else
GetJsVariableAdvance = errReturn
End If
Else
If IsObject(rtValue) Then
Set GetJsVariableAdvance = rtValue
Else
GetJsVariableAdvance = rtValue
End If
End If
On Error Goto 0
End Function
函数写好后,那得写一个小页面测试一下,小页面源码如下:
<html>
<head>
<title>试验VBS获取JS变量 </title>
<script language="javascript">
var object = {name:"张三",age:20};
</script>
<script language="vbscript">
Dim jsObj
' 获取js脚本中的object对象变量
Function GetJSObj()
Set jsObj = GetJsVariableAdvance("object",Nothing)
MsgBox IsObject(jsObj)
End Function
' 输出对象的值,这里用的是VBS中的变量jsObj
Function ShowObjPropertys()
Msgbox "姓名:" & jsObj.name & " 年龄:" & jsObj.age
End Function
'/****************************************************/
'* 功能:读取JS变量或语句的值,支持返回值为对象
'* 参数:strVariableName:JS是的变量名或语句,执行后的值可以是字符串也可以是对象
'* errReturn:出错时的返回值
'* 返回值: 变量的值或对象,出错时返回errReturn指定值
'* 编写人: chenyb
'* 编写日期:2011-08-13
'* 其他说明:以下只是方法,根据需要再扩展
'/****************************************************/
Function GetJsVariableAdvance(strVariableName,errReturn )
Dim objScript,qtpGetJsVarObj,rtValue
On Error Resume Next
document.createAttribute "JsVariableAdvanceValue"
Set objScript = document.createElement( "script" )
objScript.language = "javascript"
objScript.type = "text/javascript"
objScript.defer = true
objScript.text = "document.JsVariableAdvanceValue = " & strVariableName & ";"
document.appendChild objScript
If IsObject(document.JsVariableAdvanceValue) Then
Set rtValue = document.JsVariableAdvanceValue
Else
rtValue = document.JsVariableAdvanceValue
End If
document.removeChild objScript
If Err.Number <> 0 Then
If IsObject(errReturn) Then
Set GetJsVariableAdvance = errReturn
Else
GetJsVariableAdvance = errReturn
End If
Else
If IsObject(rtValue) Then
Set GetJsVariableAdvance = rtValue
Else
GetJsVariableAdvance = rtValue
End If
End If
On Error Goto 0
End Function
</script>
</head>
<body>
<input type=button οnclick="GetJSObj();" value="获取对象" />
<input type=button οnclick="ShowObjPropertys();" value="显示对象属性" />
</body>
</html>
小页面的外观如下:
先试一下异常情况,先不点击“获取对象”按钮,直接点击“显示对象属性”按钮,会报以下错误:
接下来试正常情况,先点击“获取对象”按钮:
上图显示对象已经获取,接着点击“显示对象属性”按钮:
如上图所示,VBS中的jsObj对象确实等于JS中的object对象了。
那如果是QTP中,又如何获取JS中的object呢? 道理是一样的,简单代码如下:
Dim obj
Set obj = QtpGetJsVariableAdvance(Browser("*").Page("*").Object,"object",Nothing)
If Not obj Is Nothing Then
Msgbox "姓名:" & obj.name & " 年龄:" & obj.age
End If
注明:以上的试验在 IE6和 IE8上试验都通过。QTP用的是10.0版本。