【IT168 技术文档】
在实际javascript:;" onClick="javascript:tagshow(event, '%B9%A4%D7%F7');" target="_self">工作中,碰到操作公司开发的ActiveX控件(WordEditXX控件),QTP识别了此对象,并可以操作此对象。但如果直接操作,会报错,此错误为不定时,跟环境有关。错误信息如下:
“应用程序调用一个已为另一线程整理的接口”
方法一:这时候可以通过dom对象获取并操作ActiveX控件。如以下的方式:
msgbox Browser("*").Page("*").Frame("*").Object.getElementById("**").DocCaption
Browser("*").Page("*").Frame("*")..Object.getElementById("**").ReplaceBookmark "BK_WFDW","中国的单位"
Browser("*").Page("*").Frame("*").Object.getElementById("**").ReplaceBookmark "BK_WFRQ","2009年5月10日"
但以上方法有时也会报错,因此采用了以下的方法二.
方法二:这时候可以通过以下的方式:
1) 在QTP中获取页面上一个唯一标识的节点
2) 在QTP中通过使用JS和dom中的“createElement”和设置“innerhtml”的值的方法向页面中的节点中(1步中获取的唯一标识的节点)添加一个div节点,并在新建的div节点中添加按钮和js脚本。
3) 用QTP获取新建立的按钮,执行添加进去的js脚本。
4) 如果需要获取值,则需要再建一个div,并在执行js后把获取的值写入div的innertext,然后通过QTP获取这个div来获取值
以下脚本试验时发现没有成功:
' Dim jsStr
' jsStr = "
' jsStr = jsStr & "function addBookMark(){" & chr(13) & chr(10)
' jsStr = jsStr & "var qtpOcx = document.getElementById(""wsocx"");" & chr(13) & chr(10)
' jsStr = jsStr & "alert('运行到了');" & chr(13) & chr(10)
' jsStr = jsStr & "qtpOcx.ReplaceBookmark(""BK_GZRQ"",""2008-11-30"");" & chr(13) & chr(10)
' jsStr = jsStr & "" & chr(13) & chr(10)
' jsStr = jsStr & "}" & chr(13) & chr(10)
' jsStr = jsStr & "" & chr(13) & chr(10)
' Browser("**").Page("**").Frame("frmext-gen325").Object.getElementById("myDiv").innerhtml = jsStr
原因为,新添加进去的js脚本不被识别,因为只是把js脚本放入的页面,并未加载到程序中。
后来使用发以下方法,试验成功:
Dim jsStr
jsStr = "
jsStr = jsStr & ""
jsStr = jsStr & "var qtpOcx = document.getElementById('wsocx');"
jsStr = jsStr & "alert('运行到了');"
jsStr = jsStr & "qtpOcx.ReplaceBookmark('BK_GZRQ','2008-11-30');"
jsStr = jsStr & ""
jsStr = jsStr & ""
jsStr = jsStr & """>"
Browser("**").Page("**").Frame("frmext-gen325").Object.getElementById("myDiv").innerhtml = jsStr
Browser("**").Page("**").Frame("frmext-gen325").WebButton("name:=qtpOp").click
说明:
通过此方法就可以达到QTP运行JavaScript的目的。可以自己建立一个JS文件,然后使用动态加载JS的技术加载到当前页面,这样就可以直接执行了。关于动态加载JS的技术,网上很多,自己上网搜索。
方法三:
Dim newObj,obj
Set newObj = Browser("**").Page("**").Object.createElement("
")
Browser("**").Page("**").Object.body.appendChild newObj
'newObj.fireEvent "onclick" '此法也可
newObj.click
Browser("**").Page("**").Object.body.removeChild newObj ‘清除建立的节点
**********************
注意:以下方法是不可以的,因为“"javascript.:alert(""测试一下"")"”被当作字符串了。
Dim newObj
Set newObj = Browser("**").Page("**").Object.createElement("Div")
newObj.onclick = "javascript.:alert(""测试一下"")"
Browser("**").Page("**").Object.appendChild newObj
newObj.fireEvent "onclick"
————————————————————————
方法四:
Dim newObj
Set newObj = Browser("**").Page("**").Object.createElement("Div")
'newObj.innertext = "试试"
newObj.id = "idtest"
Browser("**").Page("**").Object.body.appendChild newObj
'动态加载JS脚本
Dim objHead,objScript
Set bjHead = Browser("**").Page("**").Object.getElementsByTagName("HEAD").item(0)
Set bjScript. = Browser("*").Page("*").Object.createElement( "script" )
objScript.language = "javascript"
objScript.type = "text/javascript"
objScript.id = "sIdTest"
objScript.defer = true
objScript.text = "function aaa(){alert(""测试一下"");} document.getElementById('idtest').onclick=aaa "
objHead.appendChild( objScript. )
newObj.fireEvent "onclick"
————————————————————————
**********************************8
以上的方法都是说需要特殊处理的情况,如果说只是执行已有JS函数或都JS脚本,那只要用以下方法即可:
Dim objHead,objScript
Set bjHead = Browser("**").Page("**").Object.getElementsByTagName("HEAD").item(0)
Set bjScript. = Browser("**").Page("**").Object.createElement( "script" )
objScript.language = "javascript"
objScript.type = "text/javascript"
objScript.id = "sIdTest"
objScript.defer = true
objScript.text = "JS脚本或JS函数名"
objHead.appendChild( objScript. )