QTP使用JS操作ActiveX控件

在实际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 = "" & 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 & "" & 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("<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_r("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.getElementByIdx('idtest').οnclick=aaa "

objHead.appendChild( objScript. )

newObj.fireEvent "onclick"

————————————————————————**********************************8

以上的方法都是说需要特殊处理的情况,如果说只是执行已有JS函数或都JS脚本,那只要用以下方法即可:

Dim objHead,objScript

Set bjHead = Browser("**").Page("**").Object.getElementsByTagName_r("HEAD").item(0)

Set bjScript. = Browser("**").Page("**").Object.createElement( "script" )

objScript.language = "javascript"

objScript.type = "text/javascript"

objScript.id = "sIdTest"

objScript.defer = trueobjScript.text = "JS脚本或JS函数名"

objHead.appendChild( objScript. )


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值