QTP使用JavaScript操作ActiveX控件

上一篇 / 下一篇  2009-05-20 23:18:07 / 个人分类:QTP

在实际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 = "<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的技术,网上很多,自己上网搜索。

版权声明:原创作品,转载时请务必以超链接形式标明本文原始出处 、作者信息和本声明,否则将追究法律责任。 本文出自chenyb85的51Testing软件测试博客:http://www.51testing.com/?130986

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

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



版权声明:原创作品,转载时请务必以超链接形式标明本文原始出处 、作者信息和本声明,否则将追究法律责任。 本文出自chenyb85的51Testing软件测试博客:http://www.51testing.com/?130986


TAG: JavaScript js QTP

 

评分:0

我来说两句

chenyb85

chenyb85

大海无量。。。 QQ:20710378

日历

« 2024-04-16  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 18854
  • 日志数: 20
  • 建立时间: 2009-03-11
  • 更新时间: 2011-08-21

RSS订阅

Open Toolbar