工作中,碰到操作公司开发的ActiveX控件(WordEditXX控件),QTP识别了此对象,并可以操作此对象。但如果直接操作,会报错,此错误为不定时,跟环境有关。"/>
技术开发 频道

QTP使用JS操作ActiveX控件

  【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 = "" & 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("

 

")

 

  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. )

0
相关文章