yangru5052 发表于 2010-3-24 16:43:05

WinMenu("").Select "" 语法格式即回放菜单失败问题

环境: PB,QTP10.0

功能简介:登录Window("COPS HK DEV1 (COPS) Y")窗体后,打开菜单,出现一个退出的对话框,选择exit然后退出

疑问:
QTP自动录制的代码如下:
Window("COPS HK DEV1 (COPS) Y").WinMenu("menu").Select "File;Exit        Alt+F4"
PbWindow("w_main").Dialog("COPS - Exit").WinButton("Yes").Click
但是回放的时候,每次看不见menu及选择menu的动作,然后就一直停在了这里,没有任何错误提示。

过程:中间我考虑过了很多原因,试过能查到的所有解决方案。
1.对winmenu描述性编程Window("COPS HK DEV1 (COPS) Y").WinMenu("menuobjtype=2").Select "File;Exit        Alt+F4"失败,同上
2.QTP默认录制方式是无法录制下拉菜单的,必须修改设置后再录制
修改设置如下:
在tools -> web event recording configuration 点击custom settings... 展开Web objects,
选种webelement,点击event -> add -> onmouseover 。并确定在record栏内,状态是enabled。
然后再重新录制你的脚本。
失败,估计这个方式是对web 程序的,对PB无效。
3.对menu菜单,使用虚拟对象。我将整个菜单虚拟成一个对象,但是录制的过程中,QTP无法使用这个对象。是我虚拟对象的方法有问题?还是这条路根本不通?
4.增加wait等待时间。失败,仍然不行。我感觉在QTP似乎没有必要去增加等待时间。当系统需要比较长的时间来loading一个对象的时候,QTP会自动等候直到loading完成

解决方法一:
最后找到了一种sendkeys的模拟键盘的操作方法。
Dim WshShell
Set Wscript=createobject("Wscript.shell")
Wscript.SendKeys"%{F4}"
Set Wscript=nothing
经过编辑脚本后,可以成功的回放选择菜单的动作和过程。
但是sendkeys有一个局限性,只能应用在该菜单有快捷方式的情况下。如果没有键盘快捷方式,该方法也不行。只能作为一种备用替代方案。

最终完美方案:
最后在开发人员的帮助下,找到了问题所在:
Window("COPS HK DEV1 (COPS) Y").Activate
Window("COPS HK DEV1 (COPS) Y").WinMenu("Menu").Select "<Item 1>;<Item 14>"
是winmenu的select方法的两种方式的选取。
select方法可以select a menu by name/select a menu by index两种方式。
换成by index方式后,并且前面先activate菜单所在的窗体,问题解决了。

可是QTP为什么会自动录制为select a menu by name的方式了,这两种方式的区别是什么了?具体使用中该怎么选取了?
问题及其解决貌似都很简单,解决问题能力太差,这么久才找到问题。可是还是不很明白以后遇见问题了,怎么去排查解决,为什么我就想不到了?

[ 本帖最后由 yangru5052 于 2010-3-24 17:02 编辑 ]

shanxi 发表于 2010-3-24 17:33:03

回复 1# 的帖子

不错 给出了解决问题的整个过程

除非没办法了,最好不要用sendkey
index需要先计算整个菜单项总共有多少项。。。。。

zzxxbb112 发表于 2010-3-24 17:47:06

index其实不是完美的解决方案,位置的改变一样会造成失败,我非常不推荐INDEX,使用by name的方式是最好的,你试试在byname的方式前也加下Window("COPS HK DEV1 (COPS) Y").Activate,把20秒超时设短点,定位下问题,by name方式肯定是可以解决的~

yangru5052 发表于 2010-3-25 20:03:32

回复 3# 的帖子

版猪,你的意思是设置下断点然后debug?还不会debug了,英文帮助看得很头疼。有谁有调试部分的资料分享下嘛。逛遍了坛子,也没有找到

[ 本帖最后由 yangru5052 于 2010-3-25 20:09 编辑 ]

shotstar 发表于 2010-3-25 22:41:38

你的问题应该主要是在如果点出菜单来对吧。我在web的菜单也碰到类似的情况,而且web的菜单项用的是WebElement,用onmouseover有时候没有效果,后来找到了一个解决办法,你可以参考一下。

Extern.Declare micLong, "SetCursorPos", "user32.dll", "SetCursorPos", micLong, micLong
Extern.SetCursorPos X,Y   '鼠标移动到坐标(X,Y)

Extern.Declare micVoid, "mouse_event", "user32.dll", "mouse_event", micLong, micLong, micLong, micLong, micLong
Extern.mouse_event 2,X,Y,0,0    '鼠标按下
Extern.mouse_event 4,X,Y,0,0    '鼠标抬起

上面是两个方法,一个是控制你的鼠标移动到某个坐标点,另一个是模拟鼠标按键操作,用法就是你需要先确定菜单项的坐标,考虑到每次窗体位置可能有变化,建议找出菜单项与窗体左上角顶点的相对坐标,然后通过获取窗体的属性得到顶点的绝对坐标,然后计算出菜单项的坐标,然后使用上面的方法即可。如果担心脚本运行过快,可以考虑在移动和点击中间加入1-2秒wait一下。

shotstar 发表于 2010-3-25 22:47:59

哦。不好意思,看了一下,可能还是会涉及到选择具体菜单项用by name还是by index的问题,当然用上面的笨方法也可以,就是麻烦点,菜单点出来后,再找菜单项的坐标。。。还是不推荐用这个方法了。呵呵。

yangru5052 发表于 2010-3-26 11:00:47

回复 6# 的帖子

谢谢你的回复。你的思路挺特别的。现在正在看QTP关于debug的帮助,我主要是希望能够找到以后碰见问题了,能尽量自己想办法找到原因,解决。
页: [1]
查看完整版本: WinMenu("").Select "" 语法格式即回放菜单失败问题