51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 5016|回复: 9

[讨论] 关于一些网页上FLASH控件无法录制的办法

[复制链接]

该用户从未签到

发表于 2012-11-23 12:24:16 | 显示全部楼层 |阅读模式
我们在录制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:25:35 | 显示全部楼层
本帖最后由 泰然 于 2012-11-23 16:30 编辑

下面有一个真实的例子来演示一下,删除param note="wmode"后的QTP识别情况:
下面是一个flash.htm的代码(另外还需要一个放在同路径下的face.swf的FLASH文件):

  1. <html>
  2. <head><title>test flash1</title></head>
  3. <body>
  4. <div id="face3" style="">
  5. <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">
  6.   <param name="movie" value="face.swf" />
  7.   <param name="FlashVars" value="" />
  8.   <param name="allowScriptAccess" value="always" />
  9.   <param name="wmode" value="transparent" />
  10.   <embed  width="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" />
  11. </object>
  12. </div>
  13. </body>
  14. </html>
复制代码
说明:下面每次重新录制,需要关闭原来的QTP和web页面重新打开一个新qtp test和一个新的ie。

第一次录制
说明:没做任何处理,也没有画虚拟对象。
第一次录制时的SPY
录制脚本如下:

  1. SystemUtil.Run "C:\Program Files\Internet Explorer\IEXPLORE.EXE","","C:\Documents and Settings\Administrator","open"
  2. Browser("Browser").Page("Page").Sync
  3. 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
录制脚本如下:

  1. SystemUtil.Run "C:\Program Files\Internet Explorer\IEXPLORE.EXE","","C:\Documents and Settings\Administrator","open"
  2. Browser("Browser").Page("Page").Sync
  3. Browser("Browser").Navigate "http://localhost:8081/webtest/flash.htm"
  4. Browser("Browser").Page("flash test frame").WinObject("MacromediaFlashPlayerActiveX").VirtualButton("SelectFace").Click
复制代码
发现录制到了点击flash按钮的操作,也录制到了虚拟对象。

第四次录制
说明:这是最神奇的操作,因为第三次录制前需要开发人员修改源代码,而这次——不需要!
恢复最初的flash.htm的代码,就这么录制,那就录制出来第一次录制的相同代码,识别到了第一次录制中的相同对象,接着下面手写一行代码:

  1. SystemUtil.Run "C:\Program Files\Internet Explorer\IEXPLORE.EXE","","C:\Documents and Settings\Administrator","open"
  2. Browser("Browser").Page("Page").Sync
  3. Browser("Browser").Navigate "http://localhost:8081/webtest/flash.htm"
  4. 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上按钮以“打开文件”对话框的操作
结果最终录制到如下内容:


  1. SystemUtil.Run "C:\Program Files\Internet Explorer\IEXPLORE.EXE","","C:\Documents and Settings\Administrator","open"
  2. Browser("Browser").Page("Page").Sync
  3. Browser("Browser").Navigate "http://localhost:8081/webtest/flash.htm"
  4. 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>"
  5. Browser("Browser").Page("flash test frame").WinObject("MacromediaFlashPlayerActiveX").VirtualButton("SelectFace").Click
复制代码
和第三次录制一样,既录制到了点击flash按钮的操作,也录制到了虚拟对象。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复 支持 反对

使用道具 举报

  • TA的每日心情
    无聊
    2018-9-27 10:05
  • 签到天数: 36 天

    连续签到: 1 天

    [LV.5]测试团长

    发表于 2012-11-26 09:07:44 | 显示全部楼层
    先顶一下,还没有细看,写的内容很丰富啊。
    有时间要好好研究一下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-11-26 09:47:41 | 显示全部楼层
    顶下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-11-26 18:40:43 | 显示全部楼层
    很好的帖子,感谢~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2013-4-11 17:54:16 | 显示全部楼层
    不错不错
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2013-11-21 16:57:22 | 显示全部楼层
    但我今天 试了一下,一直报语法错误,说是有无效字符,但我就是完全按照你说的步骤来的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-12-31 08:59
  • 签到天数: 975 天

    连续签到: 1 天

    [LV.10]测试总司令

    发表于 2013-11-21 17:13:38 | 显示全部楼层
    支持一下,比较长。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2013-11-21 17:38:10 | 显示全部楼层
    顶一下,写的很详细,有时间从头到尾操作一遍。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-9-9 16:55:20 | 显示全部楼层
    谢谢小刚老师
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-19 07:08 , Processed in 0.099265 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表