注:原文最早是发表在www.automationqa.com上面的,后来因为网站被黑而文章内容消失了,希望csdn别被黑了。
关于转载:本文为原创文章,欢迎转载,但转载需要标注出处以及保证内容的完整性,请理解写作的寂莫和苦处。
关于版权:本文不得应用于以赢利为目的的任何场景,否则本人保留相应的权利。
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