QTP编码小知识:本文转自http://lyg5623.blog.163.com/blog/static/53274011200891911126654/
【QTP编码小知识 一】
在这里先给大家看看一下代码:
if browser("百度一下").page("百度一下").webbutton("百度一下").exist(0) and _
browser("百度一下").page("百度一下").webbutton("百度一下").object.disabled and _
browser("百度一下").page("百度一下").webbutton("百度一下").object.visible then
browser("百度一下").page("百度一下").webbutton("百度一下").click
end if
自然,如果学过编程的人,会觉得,恩,这样写很正常,但是没有怎么学过的人,他或者会写成这样
if browser("百度一下").page("百度一下").webbutton("百度一下").exist(0) then
if browser("百度一下").page("百度一下").webbutton("百度一下").object.disabled then
if browser("百度一下").page("百度一下").webbutton("百度一下").object.visible then
browser("百度一下").page("百度一下").webbutton("百度一下").click
end if
end if
end if
你学习过了编程,知道了,如果and的条件,如果有一个否,哪么就全部为否,自然是这个是逻辑条件的问题,你有学过,所以
你写成2个and的方法去简略代码。但问题往往发生在这里,就和变魔术一样,大人看不出,但小孩就可以看出里面的问题,因为大人
的思想会被自己所谓的经验所左右。
这段代码的错误地方发生在那里,估计读到这里的人大部分已经猜到了,错误会发生在第1片中的2 3行!!你会问为什么?这应
该没错菜对的呀?不存在它就条不进行点击了么?但不存在时候,其实QTP会去判断and的其他2个条件,因为webbutton的不存在,导致
了object不能使用,所以在这里会出现报错的情况。
首先说下QTP它在 逻辑判断这块的处理,有人说,如果and其中第一个条件是假的,哪么判断就直接跳出去了,对,没错,这个
是针对某些语言而言,但是QTP自己在使用VBS中,自己又加了点手脚,或者是VBS自己本身就存在这样的问题。
这些也都是在实际编码过程中会发现的问题,大家慢慢积累,让自己的代码出现更少的BUG,哈哈,感觉好像在做白盒测试。
【QTP 编码小知识 二】
大家看看下面代码,代码是运行在谷歌的主页面,如果大家要试的话,大家同样也可以试试这代码的运行结果。
Dim LinkDes
Set LinkDes=description.Create()
LinkDes("html tag").value="A"
Set LinkObj=browser("Google").Page("Google").ChildObjects(LinkDes)
For i=0 to LinkObj.count
LinkObj(i).click
browser("Google").Back
Next
代码运行完后,你会发现,原来在循环第2次连接点击的时候,抛出了一个“General run error”。这个是为什么会这样?之前也同样有论坛的朋友问到这样的问题,所以今天就在这里提到。
问题是出在了对第一个连接点击后,做了返回操作所导致的,在第一次back的时候,LinkObj对象就已经丢失了,失效了。所以你在做第2次操作的时候,LinkObj(i)就已经找不到了,因此它会出错。
正确的方法,这个也是我目前想到的,或者还有其它达人能做更好的方法出来。
Dim LinkDes
Set LinkDes=description.Create()
LinkDes("html tag").value="A"
Set LinkObj=browser("Google").Page("Google").ChildObjects(LinkDes)
For i=0 to LinkObj.count
Set LinkObj=browser("Google").Page("Google").ChildObjects(LinkDes)
LinkObj(i).click
browser("Google").Back
Next
【QTP编码小知识 三 IE内存释放】
由于编码小知识出到第三帖,特此帖送出API手册一份,想要会自动化,还离不开Win32 API。
先说下小编对关于Web内存的一些小看法,之前已经有讨论过关于IE内存占用居高不下,导致了QTP对Web页面的操作出现种种问题。今天和大家说下简单的内存释放方法。首先我们使用的将浏览器最小化然后再做最大化的操作来实现这个释放工作。很多人知道,IE最小化后,内存占用不到2M,最大化后,会比之前最小化前占的内存更少。
先看下下面的代码,因为QTP中对Browser没有提供最小化的方法,因此我们需要借助window的中的方法:
hwnd=borwser("...").getroproperty("hwnd")
window("hwnd:="&hwnd).Minimize
wait(1)
window("hwnd:="&hwnd).Maximize
看完小编的这4句代码,很高兴,哇,就这么简单?!慢着,你丢进QTP里面运行看看。打开任务管理器,注意,你可以把wait的时间调长点,你可以看到,原来内存居然是有增无减?然后愤怒的拿着砖头丢过来。
至于为什么使用了Minimize的方法后仍然无效,这个小编猜想是因为QTP本身并没有真正意义上的最小化。好了,说了哪么多,先来个真的可以做到释放内存的,再看看下面代码:
Public Function QTP_Release_Memory(hwnd)
Extern.Declare micVoid ,"SendMessageA","user32.dll","SendMessageA",micHwnd,micInteger,micInteger,micInteger
SC_MINIMIZE = &HF020&
SC_MAXIMIZE = &HF030&
WM_SYSCOMMAND = &H112
Extern.SendMessageA hwnd,WM_SYSCOMMAND,SC_MINIMIZE,0
wait 1
Extern.SendMessageA hwnd,WM_SYSCOMMAND,SC_MAXIMIZE,0
End Function
大家会问,你怎么要用Function呢,小编这人比较环保,东西能重用就重用,大家只要把窗口的句柄丢给Function就可以用了,以后都可以在同个项目中用到,下次有时间和大家说说如何把脚本写得重用性更高些。
这个主要是使用的是Win32API的方法,用SendMessage的方法去实现了最大化最小化。在这里小编偷偷告诉大家,SendMessage称得上是Win32 API中最强的一个,它几乎可以模拟所有的你想要的操作,至于真的有多强大,你下载小编给你们的文档看看它的所谓参数就知道。
好了,打开任务管理器,瞧瞧结果,别乐坏了。