关于一些网页上FLASH控件无法录制的办法
我们在录制web应用程序时,经常会遇到一些WebElement对象能被QTP识别但就是无法录制的情况,通过SPY仔细查看这个WebElement对象的属性innerhtml或者outerhtml,发现其中有swf或flash等内容,并且查看web源代码可以看到<object...><param...value="...swf">这表示这是一个FLASH控件。对于web程序中的小FLASH控件的操作,我推荐通用的解决办法是为它单独做一个模拟模拟,录制相对于该对象的相对坐标轨迹。除了模拟录制外,我们还可以用虚拟对象的办法,但是我们发现很多情况下FLASH控件被QTP识别为WebElement对象,在WebElement对象上画虚拟对象是没有效果的,因为QTP认为它能识别这个控件,所以完全不会用到相对坐标,也就无法启用虚拟对象,但是某些web应用中的FLASH控件却被识别为与ActiveX有关的WinObject对象,WinObject是QTP识别对象过程中对象类别不确定后,实在没办法时指定的类,在WinObject对象上操作必然有相对坐标,这样就可以启用虚拟对象了。
那么什么原因导致了有些FLASH控件被QTP识别为WebElement对象,而有些FLASH控件被QTP识别为WebObject对象呢?
通过比对web源代码,并做试验,发现FLASH控件的如果有一个PARAM有属性name="wmode",就会导致FLASH控件被QTP识别为WebElement对象,如果没有则被识别为WebObject对象。
FLASH对象的wmode参数用于设置该FLASH是否透明的属性,这句加上后FLASH控件就会被QTP识别为WebElement对象,删除这个PARAM就被识别为WebObject对象,原因猜测是BHOManager专门针对FLASH控件做了逻辑,有wmode属性的flash就认为是一个可明确类的对象,否则这个flash就是一个不确定类的对象WinObject。
以后如果要对FLASH做虚拟对象,需要检查一下是否有wmode这个PARAM,如果有需要让开发人员从源代码中删除才能使用虚拟对象。
关于FLASH无法录制的问题,大家多多讨论,提供素材。 本帖最后由 泰然 于 2012-11-23 16:30 编辑
下面有一个真实的例子来演示一下,删除param note="wmode"后的QTP识别情况:
下面是一个flash.htm的代码(另外还需要一个放在同路径下的face.swf的FLASH文件):
<html>
<head><title>test flash1</title></head>
<body>
<div id="face3" style="">
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="500" height="405" id="FlashVars" align="middle">
<param name="movie" value="face.swf" />
<param name="FlashVars" value="" />
<param name="allowScriptAccess" value="always" />
<param name="wmode" value="transparent" />
<embedwidth="500" height="405" src="face.swf" flashvars="" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"type="application/x-shockwave-flash" />
</object>
</div>
</body>
</html>
说明:下面每次重新录制,需要关闭原来的QTP和web页面重新打开一个新qtp test和一个新的ie。
第一次录制
说明:没做任何处理,也没有画虚拟对象。
第一次录制时的SPY
录制脚本如下:
SystemUtil.Run "C:\Program Files\Internet Explorer\IEXPLORE.EXE","","C:\Documents and Settings\Administrator","open"
Browser("Browser").Page("Page").Sync
Browser("Browser").Navigate "http://localhost:8081/webtest/flash.htm"
对象被识别为WebElement(”FlashVars“),鼠标在flash上点击打开“打开文件”对话框这个事件未能被录制。
第二次录制
说明:在flash上“打开文件”按钮被画了一个虚拟对象
录制脚本发现没有任何变化,事件没有被录制,虚拟对象也没有被录制到
第三次录制
说明:将flash.htm源代码中“<param name=“wmode” value=“transparent” />”这行删除,第二次画的虚拟对象保留
录制前先把flash.htm页面打开,用spy点在flash上将对象识别并加到对象库中,发现这个对象是名为MacromediaFlashPlayerActiveX的WinObject对象。
第三次录制时的SPY
录制脚本如下:
SystemUtil.Run "C:\Program Files\Internet Explorer\IEXPLORE.EXE","","C:\Documents and Settings\Administrator","open"
Browser("Browser").Page("Page").Sync
Browser("Browser").Navigate "http://localhost:8081/webtest/flash.htm"
Browser("Browser").Page("flash test frame").WinObject("MacromediaFlashPlayerActiveX").VirtualButton("SelectFace").Click
发现录制到了点击flash按钮的操作,也录制到了虚拟对象。
第四次录制
说明:这是最神奇的操作,因为第三次录制前需要开发人员修改源代码,而这次——不需要!
恢复最初的flash.htm的代码,就这么录制,那就录制出来第一次录制的相同代码,识别到了第一次录制中的相同对象,接着下面手写一行代码:
SystemUtil.Run "C:\Program Files\Internet Explorer\IEXPLORE.EXE","","C:\Documents and Settings\Administrator","open"
Browser("Browser").Page("Page").Sync
Browser("Browser").Navigate "http://localhost:8081/webtest/flash.htm"
Browser("Browser").Page("flash test frame").WebElement("FlashVars").Object.outerHTML="<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0' width='500' height='405' id='FlashVars' align='middle'><param name='movie' value='js/face.swf' /><param name='FlashVars' value='' /><param name='allowScriptAccess' value='always' /><embed width='500' height='405' src='js/face.swf' flashvars='' pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash' type='application/x-shockwave-flash' /></object>"
最后一行代码是手写的,内容是在WebElement(”FlashVars“)这个对象的原生属性.Object.outerHTML改掉,改掉的内容其实就是去掉“<param name=“wmode” value=“transparent” />”后的整个从<Object>开始到</Object>结束的全部内容。也就是说QTP这里动态改代码,不再需要开发人员改静态代码了。
这行代码加上后,执行脚本。
然后用SPY在flash上识别一下,发现原来的WebElement(”FlashVars“)现在变成了WinObject(“MacromediaFlashPlayerActiveX”),加入对象库,再次单独录制点击flash上按钮以“打开文件”对话框的操作
结果最终录制到如下内容:
SystemUtil.Run "C:\Program Files\Internet Explorer\IEXPLORE.EXE","","C:\Documents and Settings\Administrator","open"
Browser("Browser").Page("Page").Sync
Browser("Browser").Navigate "http://localhost:8081/webtest/flash.htm"
Browser("Browser").Page("flash test frame").WebElement("FlashVars").Object.outerHTML="<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0' width='500' height='405' id='FlashVars' align='middle'><param name='movie' value='js/face.swf' /><param name='FlashVars' value='' /><param name='allowScriptAccess' value='always' /><embed width='500' height='405' src='js/face.swf' flashvars='' pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash' type='application/x-shockwave-flash' /></object>"
Browser("Browser").Page("flash test frame").WinObject("MacromediaFlashPlayerActiveX").VirtualButton("SelectFace").Click
和第三次录制一样,既录制到了点击flash按钮的操作,也录制到了虚拟对象。 先顶一下,还没有细看,写的内容很丰富啊。
有时间要好好研究一下 顶下 很好的帖子,感谢~ 不错不错 但我今天 试了一下,一直报语法错误,说是有无效字符,但我就是完全按照你说的步骤来的 支持一下,比较长。 顶一下,写的很详细,有时间从头到尾操作一遍。 :)谢谢小刚老师
页:
[1]