QTP使用JS操作ActiveX控件

本文介绍了当QTP无法直接操作特定ActiveX控件时的几种解决方案,包括通过DOM对象间接操作、动态加载JS脚本及创建新的DOM元素等方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际工作中,碰到操作公司开发的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","2009510"

 

但以上方法有时也会报错,因此采用了以下的方法二.

方法二:这时候可以通过以下的方式:

1)       QTP中获取页面上一个唯一标识的节点

2)       QTP中通过使用JSdom中的“createElement”和设置“innerhtml”的值的方法向页面中的节点中(1步中获取的唯一标识的节点)添加一个div节点,并在新建的div节点中添加按钮和js脚本。

3)       QTP获取新建立的按钮,执行添加进去的js脚本。

4)       如果需要获取值,则需要再建一个div,并在执行js后把获取的值写入divinnertext,然后通过QTP获取这个div来获取值

 

以下脚本试验时发现没有成功:
' Dim jsStr
' jsStr = "<input name='qtpOp'  type='button' value='qtpOp'  addBookMark()""  /><script. language=""javascript"">" & chr(13) & chr(10)
' 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  & "</script>" & chr(13) & chr(10)
' Browser("**").Page("**").Frame("frmext-gen325").Object.getElementById("myDiv").innerhtml = jsStr
原因为,新添加进去的js脚本不被识别,因为只是把js脚本放入的页面,并未加载到程序中。

后来使用发以下方法,试验成功:
Dim jsStr
jsStr = "<input name=qtpOp id=qtpOpt  type=button value=qtpOp  javascript.:"
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的技术,网上很多,自己上网搜索。

 

------------------------------------------

2009-05-21 补充。

 

方法三:

Dim newObj,obj
Set newObj = Browser("**").Page("**").Object.createElement("<div nclick=""javascript.:alert('测试一下');""></div>")
Browser("**").Page("**").Object.body.appendChild newObj
'newObj.fireEvent "onclick" '此法也可
newObj.click

Browser("**").Page("**").Object.body.removeChild newObj ‘清除建立的节点

------------------------------------------

2009-05-21 补充。

方法三:

Dim newObj,obj
Set newObj = Browser("**").Page("**").Object.createElement("<div nclick=""javascript.:alert('测试一下');""></div>")
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').οnclick=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. )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值