很久没来写东西了。最近也比较忙,任务很多。现在遇到的问题越来越少了,或者说常见的问题都已经能自己解决了,比如查查帮助。
基本上我遇到的问题80%都可以在帮助里找到,有几个帮助文档比较有用的。vbscript56.chm——VBS语言(常见的函数什么的都在这里有),web.chm(web控件的帮助),这两个最常用。其他还有StdWin.chm(windows应用程序的控件帮助),Utility.chm(QTP的保留对象),AutomationObjectModel.chm(这个比较高级点,主要是完全用vbs来直接调用QTP进行操作。)
今天继续和大家分享我的心得。说实话,以后的心得会更接近心得了,目前可能还停留在问题解决上,以后估计问题遇到的会越来越少了,能遇到的就是难点问题了。
QTP心得3
6.引用外部API来解决问题
问题现象:
系统中有一些菜单是用浮动窗口做的,鼠标移动到某个菜单项上,然后下面会有浮动菜单弹出。本来可以用很简单的Fireevent "Onmouseover" 来解决。不过我遇到的菜单这样处理了没有反应,而另一个同事遇到同样的问题就可以很容易解决。
解决办法:
后来据我分析,同事那边估计那个菜单项是Link的,而我遇到的菜单项是WebElement的,据HP专家讲,QTP的这个FireEvent对WebElement支持的不好。于是专家提供了一个引用外部API的方法给我来解决问题。下面拿来分享一下,也许哪天你就会碰到这样的问题,不妨试试。
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 '鼠标抬起
这里有2个方法,分别是SetCursorPos和mouse_event。首先取得WebElement的绝对坐标,然后分别加一点(因为坐标是控件左上角,避免点不到,把坐标的横纵坐标都加5-10左右),然后使用SetCursorPos方法,鼠标就会正常移动到那个控件上,菜单也就正常弹出来了。mouse_event可能用到的比较少,其实就是Click点击事件,如果用这种方法写就很麻烦,必须把鼠标按下和鼠标抬起都用上才能作为点击的事件。后来在我做的脚本里,经常会用到鼠标移动的方法,点击的方法目前没用到,因为基本上Click都很正常,也许哪天出问题了就可以用这种了。
扩展一下,其实QTP里可以用这个Extern.Declare引用很多外部的API,只要你知道怎么用,像上面两个方法,我也是通过帮助看懂了一点点,具体这个Extern.Declare怎么用还是去看帮助吧。
7.Tab页或者叫选项卡的问题
问题现象:
某天在录制好脚本后,执行的过程中发现遇到选项卡的页面,如图(类似这样的)
发现QTP在执行脚本的时候,其实鼠标没有移动过去点击那个选项卡标题,本来每个选项卡标题下面还有不同的菜单,结果这些菜单没显示出来,但其实页面还能正常显示。
分析之后感觉,其实那些菜单都在,只是在某个不知道的地方。而QTP执行Click事件的时候,不需要鼠标真正移动过去点击(Windows的Click鼠标会移动过去,比如点击Msgbox的确定),所以只要那个菜单存在,页面就会按照点击的href 转换页面到你要去的地方。其实这样本来没什么,我也没太在意,直到有一天遇到了问题,就是在有一个菜单居然还是浮动菜单,需要鼠标移动过去,而脚本运行的时候根本看不到那个菜单,所以也就没法移动过去,无法显示出菜单。
解决办法:
所以我尝试用6的那个移动鼠标的方法,让鼠标移动到选项卡标题上,再点击,应该就可以把菜单显示出来,结果发现竟然取得的选项卡的坐标和用Object Spy看到的不一样。。。后来才发现,原来选项卡标题有2种状态,一种是选中,一种是没有选中,我对象库的是选中状态的,而运行脚本的时候页面里是没有选中状态的。所以这时候取得他的坐标是很怪异的坐标(好像都是负多少),在对象库中他有一个额外识别的属性(显示为Type,Value什么的),选中的选项卡标题的index属性为3,没选中的是0,这时候需要用SetToProperty,在脚本运行到需要取坐标之前,先把对象的这个index改成0,然后就顺利取到了坐标。
于是上面的问题解决出来就是这样:
首先改变选项卡标题那个对象的index为0,取到选项卡标题的绝对坐标
然后鼠标移动到选项卡标题的上面,点击选项卡标题,需要的菜单在页面里正常显示出来了。
接着鼠标移动到菜单上,浮动菜单弹出来了,点击菜单。
很多时候,解决问题先要想清楚思路,然后分析每条路径,找到最合适自己的,也最方便快捷的。
前面给大家介绍过的ChildObject方法真的很强大,基本上我的案例的每个action里面至少会有一处用这个方法来识别对象,而且我做的系统的很多提示页面都是message为标题的页面,估计统一调用的方法,里面提示的信息不同,没法用一个具体名字来识别里面的WebElement,用了ChildObject方法,居然很容易实现了重用,因为每个message页面都一样,从其他地方写好的方法直接放到另一个地方,直接就能取到需要的信息,然后再进行判断。
最后,希望大家多加强自己编程方面的知识,有时候编程思想能更方便的去帮你解决问题。