WEB-QTP随想录—关于停电的回想

注:原文最早是发表在www.automationqa.com上面的,后来因为网站被黑而文章内容消失了,希望csdn别被黑了。

关于转载:本文为原创文章,欢迎转载,但转载需要标注出处以及保证内容的完整性,请理解写作的寂莫和苦处。

关于版权:本文不得应用于以赢利为目的的任何场景,否则本人保留相应的权利。

昨晚刚把 Web 对象共有的方法和属性复制下来,本想解释一下函数的意义的,结果就发生了在城市里极少有的停电现象。还好, word 设置了每隔 1 分钟自我保存的选项,不然今晚还得复现上面的内容。因为停电,所以没来得及翻译各个方法的含义,又由于种种原因,现在又不太想翻译上面的内容了,所以上面的内容就让他那样生着吧。
关于停电,在我进入城市读有中国特色的高等教育之前,那是很有些印象的。每年冬季和春季,村里面白天一般是没有电的,晚上 18:30-19:30 之间来电,新闻联播一完,没一会又停电,然后半夜时分才来,这时场面很有些意思了,小院有一群着裤衩装忙碌着,打米、打面粉什么的人,然后机器常常突突地响到鸡叫,然后又归复宁静。每年每个季节都是如此,偶尔夏季也会这样,现在回忆满脑子都是摇扇的动作和流汗的脸颊。从读所谓的大学到现在,已经快 6 年了, 6 年来我们那个小村庄的供电情况,并没有多大改善,要说改善没有也不对,准确地说现在每年过春节的 1 个月供电还是很足的,虽然 100W 的灯泡亮度还没有纯 5W 的亮,但起码还是有电充手机的。联想到最近大家都说农村户口难弄的现象,我觉得实在有些怪,从用电的情况这一点也可以看出农村不是啥好地方,基本用电都没什么保障,还能谈其它什么吗,不过要说这一现象没起点作用,我还是不这么认为的,因为就这个传说,村里还是有不少亲戚和朋友,转城的“小康之家”都放弃了,因为新闻都说农村户口好嘛!


还是不叙事了,咱们叙 QTP CaptureBitmap 方法吧!


CaptureBitmap 方法完整的使用方法应该是


object .CaptureBitmap FullFileName, [OverrideExisting]
Object ,指 Web 对象中的任何一个,可以是 Browser WebEdit WebButton 等等。


FullFileName ,指存放图片文件的地址,这里有两种方式,如果是 Object. CaptureBitmap “1.png” 代表图片文件存放在当前 Res 结果文件夹中,如果是 Object. CaptureBitmap “D:\1\1.png” 代表图片文件存放在指定的目录中。注意,如果你指定的目录不存在或者你规定的图片名含有一些特殊字符的话, QTP 是会报 系统找不到指定路径 的错的,尤其是大家保存图片的时候,喜欢用 Date 来命名保存,此时请注意要转换成 String 类型并转义符号 ”:” 。另外,此函数保存的格式只有两种, png bmp bmp 的格式内容较小,但失真度较大, png 的格式内容较大,但失真度较小,那种比较好,你自己选吧。


[OverrideExisting] ,指是否重写已存在的图片,默认是 False 。这人参数从实际使用此方法的意义来说,只有当 Object. CaptureBitmap “D:\1\1.png” true时, 才有设置为 true 的意义。至于原因嘛,因为 QTP 运行时,保存的结果文件都不同,所以直接指定文件名时,可以不用设置。
让我们来看看它的运行效果,修改我们的HelloWord_BaiDu脚本为以下内容:

'定义test_url变量

Dim test_url

test_url="http://www.baidu.com"

'删除历史Res

Call delRes()

'启动IE

Call UrlIE(test_url)

'##   HelloWord_BaiDu生成的代码

Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").Set "HelloWord_BaiDu"

'浏览器截图函数的效果

Browser("百度一下,你就知道").CaptureBitmap "D:\截图\browser.png",True

'页面内容的截图函数效果

Browser("百度一下,你就知道").Page("百度一下,你就知道").CaptureBitmap "D:\截图\page.png",True

'输入框的截图函数效果

Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").CaptureBitmap "D:\截图\edit.png",True

Browser("百度一下,你就知道").Page("百度一下,你就知道").WebButton("百度一下").Click

'按钮函数的截图函数效果

Browser("百度一下,你就知道").Page("百度一下,你就知道").WebButton("百度一下").CaptureBitmap "D:\截图\button.png",True

Browser("百度一下,你就知道").Close()

'当浏览器不存在时,看看浏览器的截图函数结果

Browser("百度一下,你就知道").CaptureBitmap "D:\截图\closebrowser.png",True

'## End   HelloWord_BaiDu生成的代码

''启动IE

Public Function UrlIE(sUrl)

                     systemutil.Run "iexplore.exe",sUrl

End Function

'删除历史Res

Function delRes()

                     On error resume next

                     Set fs = CreateObject("Scripting.FileSystemObject")

                     fs.DeleteFolder environment("TestDir")&"\Res*",True

                     wait(1)

                     set fs=nothing

End Function

运行后,程序会一直执行到 当浏览器不存在时,看看浏览器的截图函数结果 时,报错。为什么会报错呢,因为此时Browser("百度一下,你就知道")对象经过Close之后,已经关闭了,Browser对象已经不存在了,不存在的内容,你让他截图能不报错吗?所以,使用CaptureBitmap方法时请注意,要保证Object是一定存在的,使用其它方法的道理也是这样的。

Stop程序的运行,到D盘的截图文件夹中我们可以看到有4个图片,QTP把Browser、Page、WebEdit、WebButton对象截了下来。一个个漂亮的MM啊,都罗列在那里,完美的样子是如此的令人着谜,仔细选选你的对象,观察发现browser.png和page.png没什么区别,他们截的图的内容都是浏览器内容页中的内容,如果你在'浏览器截图函数的效果 前面加入以下代码:

'改变浏览器大小后截图

Browser("百度一下,你就知道").Object.width="200"

Browser("百度一下,你就知道").Object.height="300"

运行后会发现,Browser对象截图函数截的只有浏览器窗口可见区域的图像,而其它对象是可以截取的对象的内容的图像,而watiN(.net3.5)框架下的截图函数截的却是页面内容中的全图,并且watiN(.net3.5)的截图函数在firefox3.0下截出来的是黑妹

另外,我以前一直以为QTP的Browser对象指的是浏览器整个页面,即下图中的所有区域,但后来使用Window(“hwnd:=”&BrowserObj.GetROProperty(“hwnd”)).Maximize老出错,使用Window(“hwnd:=”&BrowserObj.GetROProperty(“hwnd”)).HighLight方法后才发现QTP的Browser()对象,只指红色区域部分。QTP真不是东西,要不是我刻意地去调试还发现不了跟我想象中的不一样,画个圈圈诅咒一下。


说了这么多,那CaptureBitmap方法倒底在实现项目中有何作用呢?不会仅仅拿来画儿嬉的的样子吧(在我们老家,对象的意思跟老婆差不多)。从某种角度来说,他的使用方向还是挺大的,大体上可以划分为以下几个方向,欢迎大家继续补充新的类别:
1、 项目测试用,比如Case:1、在不同分辨率下,页面最大化时的截图,观察UI;2、改变浏览器大小后截图观察UI;3、移动窗口,截图观察UI。

2、 调试用,比如:某个对象我们看不见,却又存在,我们我们可以截个图看看情况。

3、 作为公用函数用,比如:封装成截图函数。
可能CaptureBitmap方法的主要使用方向是项目测试用和做为公用截图函数用,在这里我举一下“改变浏览器大小后截图”和公用函数的例子。关于分辨率,那个API的参数有些复杂,所以我封装成.net Dll了,之后讲到.net Dll引用的时候再说说它吧。

改变浏览器大小后截图,难点在火狐中的应用,在火狐中使用主要是因为火狐Object属性不支持,当执行到BrowserObj.Object.width= width时会报错。

IE实现可以调用下面的函数:

Fuction SizeIE(BrowserObj,fileName,Twidth,Theight)

       BrowserObj.Object.width= Twidth

       BrowserObj.Object.height=Theight

       BrowserObj. CaptureBitmap fileName

End Function

FireFox实现需要调用API函数FindWindowA函数和QTP的Windows对象Window().Resize()方法或API函数SetWindowPos函数。可能你不知道API这哥哥是干嘛用的,其实你也可以不必知道这哥哥具体有啥能耐,因为这哥哥的宝库太多了,如果你花大量时间去研究他,那么我建议你还是去做开发吧!你只需要知道下面例子中的这个API函数能起到我们要的作用就行了:

‘FireFox下使用API改变窗口后截图

Function SizeFF(BrowserObj,fileName,Twidth,Theight)

       ‘调用API FindWindow函数,获得FireFox窗口的句柄

       Extern.Declare micHwnd, "FindWindow", "user32.dll", "FindWindowA", micString, micString

   ‘调用API SetWindowPos函数,重新绘制FireFox的大小

   Extern.Declare micLong, "SetWindowPos", "user32.dll", " SetWindowPos ", micHwnd, micLong, micLong, micLong, micLong, micLong, micLong

   ‘获得当前窗口中的句柄

   hwnd = Extern.FindWindow("MozillaUIWindowClass", BrowserObj.GetROProperty("name"))

if hwnd = 0 then

SizeFF=””

Else

   Extern.SetWindowPos hwnd,0,0,0,Twidth,Theight,0

   BrowserObj. CaptureBitmap fileName

end if

End Function

‘FireFox下使用Window对象改变窗口大小

Function SizeFF(BrowserObj,fileName,Twidth,Theight)

       ‘调用API FindWindow函数,获得FireFox窗口的句柄

       Extern.Declare micHwnd, "FindWindow", "user32.dll", "FindWindowA", micString, micString

   ‘获得当前窗口中的句柄

   hwnd = Extern.FindWindow("MozillaUIWindowClass", BrowserObj.GetROProperty("hwnd"))

if hwnd = 0 then

SizeFF=””

Else

   Window(“hwnd:=”&hwnd).ReSize Twidth,Theight

   BrowserObj. CaptureBitmap fileName

end if

End Function




注意以上两个函数都有个共同之处,那就是获得窗口的句柄方法都是通过FindWindow方法获得的,如果采用BrowserObj.GetROProperty("hwnd")方法获得窗口句柄,重绘窗口后会马上恢复窗口大小,而第二种方法会直接报错,其主要原因可能是由于QTP Browser对象认为的Browser只是内容区域(上面有图示例)。另外,Tarun Lalwani写的《QuickTest Professional Unplugged》一书中第26节的源码中,提供的BrowserType(oBrw, Text)等一系列函数在10.0中是运行不了的,报错原因和我上面分析的内容是一致的(其它版本我没有试过)。

关于CaptureBitmap方法做为公用截图函数,主要是我们可以改造网上流传已久的这个函数,写一个专供浏览器使用的函数。

传说已久的函数:

'捕获当前屏幕(截图)
Public Function QTP_Capture(pathway)
  Dim datestamp
  Dim filename
  datestamp = Now()
  filename = Environment("TestName")&"_"&datestamp&".png"
  filename = Replace(filename,"/","")
  filename = Replace(filename,":","")
  filename = pathway + "\" + ""&filename
  Desktop.CaptureBitmap filename
End Function
专供浏览器使用的截图函数,只截与浏览有关的:

Function WebCapture()

Dim datestamp

Dim filename

datestamp = Now()

filename = Environment("TestDir")&"_"&datestamp&".png"

filename = Replace(filename,"/","")

filename = Replace(filename,":","")

filename = pathway + "\" + ""&filename

Borwser(“miclass:=Browser”). CaptureBitmap filename,true

End Function

好了,快十一点了,上面提供的这些方法,我只是草草地写了一下,其实如果你细心的话,可以生出很多其它方法来,可以解决很多实际问题,比如如何让IE窗口最大化、最小化等等。靠,感冒似乎加重了,今晚就到此吧。

文青山

2011-4-7

 
 

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那美那美

失业了,写文章求吃碗炒面

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值