-
VBS里Err对象的使用
2008-12-04 23:58:57
Err对象作为VBS里的一个固有内置全局对象,在使用时无需先创建一个对象实例。它有其属性和方法:
1. 属性
a) Number: 默认属性
b) Source
c) HelpFile
用法:object.HelpFile [= contextID]
d) Descrīption:当没有用户自定义Descrīption值时,该值为Number属性值
用法:object.Descrīption [= stringexpression]
e) HelpContext
用法:object.HelpContext [= contextID]
If both HelpFile and HelpContext are empty, the value of the Number property is checked.
2. 方法
Clear:重置Err对象
Raise:产生运行错误
当遇到On Error Resume Nex后,Err对象的属性被重置为0或者是长度为0的字符串。
典型的Err对象用法:
On Error Resume Next
Dim Msg
Err.Clear
Err.Raise 6 ' Generate "Overflow" error.
Err.Helpfile = "yourHelp.hlp"
Err.HelpContext = yourContextID
If Err.Number <> 0 Then
Msg = "Press F1 or Help to see " & Err.Helpfile & " topic for" & _
" the following HelpContext: " & Err.HelpContext
MsgBox Msg, , "error: " & Err.Descrīption, Err.Helpfile, Err.HelpContext
End If
-
第一次使用描述性编程
2008-12-04 23:56:49
过去一直认为描述性编程对于QTP的意义不是很大,所以一直都使用对象库进行脚本编写和维护。最近却遇到一个难题,使用对象库无法解决:一个WebEdit在一个表格里被一个WebElement覆盖,点击该WebElement,WebEdit才可见,Focus移走,它立马就不可见了,可以通过Spy来查看该WebEdit的属性,但是当加入到对象库时,由于对象已经不可见,可以最初抓到它,但是加入到对象库却没办法成功。
这样已经无法通过对象库加入到脚本语句里了,于是再粗略的翻看了一下用户手册,才想起来描述性编程可能可以解决这个问题,于是试验了一下,果然能行。因为先Click这个单元格里的WebElement,然后WebEdit可见,直接用描述性编程就可对其进行操作:
Browser(“browser”).Page(“page”).WebTable(“tablename”).ChildItem(2, 2, “WebElement”, 0).Click
Browser(“browser”).Page(“page”).WebTable(“tablename”).WebEdit(“name:=textbox”).Set “test”
不知道有没有人清楚还有其他哪些情况必须使用“描述性编程”才能解决问题的例子,希望可以一起交流一下。
-
vbs调用QTP
2008-11-13 14:19:40
Dim qtApp 'As QuickTest.Application ' Declare the Application object variable
Dim qtTest 'As QuickTest.Test ' Declare a Test object variable
Dim qtResultsOpt 'As QuickTest.RunResultsOptions ' Declare a Run Results Options object variable
Set qtApp = CreateObject("QuickTest.Application") ' Create the Application object
qtApp.Launch ' Start QuickTest
qtApp.Visible = True ' Make the QuickTest application visible
' Set QuickTest run options
qtApp.Options.Run.ImageCaptureForTestResults = "OnError"
qtApp.Options.Run.RunMode = "Fast"
qtApp.Open "C:\ Your Test Path Here", True ' Open the test in read-only mode
' set run settings for the test
Set qtTest = qtApp.Test
qtTest.Settings.Run.OnError = "NextStep" ' Instruct QuickTest to perform next step when error occurs
Set qtResultsOpt = CreateObject("QuickTest.RunResultsOptions") ' Create the Run Results Options object
qtResultsOpt.ResultsLocation = "C:\Your Results Path Here" ' Set the results location
qtTest.Run ' Run the test
'qtTest.Close ' Close the test
Set qtResultsOpt = Nothing ' Release the Run Results Options object
Set qtTest = Nothing ' Release the Test object
Set qtApp = Nothing ' Release the Application object -
Close redundant browser
2008-11-13 12:06:40
1. Through descrīption object
Dim WinIe,Ie,k,m
Set WinIe=descrīption.Create()
WinIe("micclass").value="Browser" 'The property regexpwndtitle of all pages is " Microsoft Internet Explorer"
Set Ie=desktop.ChildObjects(WinIe)
m=Ie.count
If m>1 Then
For k=0 to m-1
Ie(k).closeNext
End If
Set ie = nothing2. Through close process
SystemUtil.CloseProcessByName "iexplore.exe"
-
(转)使用 XML 文件记录操作日志
2008-11-07 18:20:12
记录应用程序的操作日志可以使用数据库、文本文件、XML文件等。我这里介绍的是使用 XML 文件记录操作日志。
我觉得使用 XML 记录操作日志有如下几点好处:
1. 不占用数据库的空间,可以任意的删除历史操作日志。
2. DataTable 可以方面的读入 XML 文件,DataTable 也可以方便的保存为 XML 文件。
3. 查看日志方便,可以直接打开 XML 文件查看,也可以读入 DataTable,然后通过程序查看。在 VS2005 中使用 XML 文件记录操作日志方法如下:
1. 建立数据集:JobLogDataSet.xsd
这里包括:TraceLevel(日志类型)、User(用户)、DateTime(操作时间)、Module(模块)、Function(功能)、Message(消息) 6 个字段。
不够自己再加吧, 其中 TraceLevel(日志类型) 是指 Info,Warning,Error,Trance,Off。2. 建立日志类型 /// <summary>
/// 日志类型
/// </summary>
public enum LogType
{
/// <summary>
/// 信息
/// </summary>
Info,
/// <summary>
/// 警告
/// </summary>
Warning,
/// <summary>
/// 错误
/// </summary>
Error,
/// <summary>
/// 跟踪
/// </summary>
Trace,
/// <summary>
/// 不记录日志
/// </summary>
Off
}
2. 写日志的方法
/// <summary>
/// 写日志
/// </summary>
/// <param name="traceLevel">日志类型(Info,Warning,Error,Trance,Off)</param>
/// <param name="user">用户</param>
/// <param name="module">模块</param>
/// <param name="function">功能</param>
/// <param name="message">消息</param>
public static void WriteLog(LogType logType,string user, string module, string function, string message)
{
try
{
// 类型为 LogType.Off 的 不记录日志
if (logType == LogType.Off)
return;JobLogDataSet.JobLogDataTable t = new JobLogDataSet.JobLogDataTable();
// 每天一个日志文件(.XML 文件),日志的文件名称为:JobLog yyyy-MM-dd.xml
string jobLogFile = AppDomain.CurrentDomain.BaseDirectory + "JobLog " +
DateTime.Today.ToString("yyyy-MM-dd") + ".xml";
if (!File.Exists(jobLogFile))
t.WriteXml(jobLogFile);// 从 .XML 文件中读取日志
t.ReadXml(jobLogFile);// 添加一条日志
JobLogDataSet.JobLogRow r = t.NewJobLogRow();
r.TraceLevel = logType.ToString();
r.User = user;
r.Datetime = DateTime.Now;
r.Module = module;
r.Function = function;
r.Message = message;
t.AddJobLogRow(r);// 保存到日志到 XML 文件
t.WriteXml(jobLogFile);
}
catch (Exception)
{}
}
3. 读日志的方法
/// <summary>
/// 读日志
/// </summary>
/// <returns>返回读取日志的 DataTable</returns>
public static JobLogDataSet.JobLogDataTable ReadLog()
{
JobLogDataSet.JobLogDataTable jobLogDataTable = new JobLogDataSet.JobLogDataTable();
try
{
// 从应用程序文件夹中,获得所有日志文件 JobLog*.xml
string[] jobLogFiles = Directory.GetFiles(
AppDomain.CurrentDomain.BaseDirectory, "JobLog*.xml", SearchOption.TopDirectoryOnly);// 把每个日志记录读取到日志 DataTable 中
foreach (string jobLogFile in jobLogFiles)
{
if (File.Exists(jobLogFile))
{
// 读取所有日志文件到临时 DataTable
JobLogDataSet.JobLogDataTable t = new JobLogDataSet.JobLogDataTable();
t.ReadXml(jobLogFile);
// 导入日志记录到主日志 DataTable
foreach (JobLogDataSet.JobLogRow r in t)
jobLogDataTable.ImportRow(r);
}
}
// 返回读取的日志 DataTable
return jobLogDataTable;
}
catch (Exception)
{
return jobLogDataTable;
}
}
4. 在需要写日志的地方,直接调用 WriteLog 方法即可。 -
(转)如何用QTP解决图片验证码(解析QuickTest文本识别机制)?
2008-10-15 10:06:30
本文出自songfun的51Testing软件测试博客,转载请保留出处及链接:http://www.51testing.com/?songfun51Testing软件测试网 lb(sdG/C-j*_
51Testing软件测试网U+OAT%VHj8j
大家在使用QTP进行自动化测试的过程中经常会遇到图片验证码的问题——大家所关心的就是如何解决此类问题。51Testing软件测试网S s)O @+m QJ E
这里我们首先要去了解为什么会有图片验证码。其实验证码的本质作用就是防止有人利用工具(灌水机、注册机,当然也不小心包括了我们的自动化测试工具)恶意猜解登陆或者不停的注册和灌水的。因此如果我们完全寄希望于通过GUI识别来获取内容是不切实际的——先打好预防针,免得读者希望太大,失望更大,呵呵!
Z3GZF4X0 下面说说验证码的解决思路:
Gy'`1Jd{ OeT0 其实解决图片验证码的思路有很多,我这里主要结合QTP9.5的新特性给大家介绍其中一种解决方案,就是利用它的OCR机制抓取文本内容。51Testing软件测试网%a4Q S1\y'n#QP,hP X
在QTP9.5中,对象识别能力有了进一步改善,其中针对文本识别方面进行了优化,引入了ABBYY公司的OCR解决方案——这个相关的功能体现在QTP菜单的“Tools-->Options-->General--Use text recognition mechanisms in this order”里,详细内容后面会有具体介绍。51Testing软件测试网7} O0imK?
先来看看ABBYY是何许公司,登录他们的官方网站可以看到一段相关介绍:“ABBYY是世界OCR(光学字符识别)、ICR(手写体识别)和语言软件的领航者。ABBYY 致力于人工智能(AI)和语言软件开发。提供全套文档识别,转换和数据捕获技术的产品解决方案。”如果你使用过图像文档转换的软件,一定会听说过FineReader OCR Professional ,其实它就是ABBYY公司的产品,用官方的说法就是“将通过扫描仪、MFP 或数码相机生成的图像快速转换为可编辑和可搜索的电子格式,而且识别率很高”,说白了就是可以借助它先进的OCR机制“读”出图片里的文本内容,并转换为PDF之类的文档。
S,h h} {)n(v i0 有了ABBYY这么强大的背后支持,QTP自然底气十足,那么QTP到底如何以OCR机制识别文本呢?我们首先先了解一下什么是OCR。
C;p;C#{.j2ZE5T0 打开“百度百科_OCR”,它的说明:“OCR(Optical Character Recognition,光学字符识别),是属于图型识别(Pattern Recognition,PR)的一门学问。其目的就是要让计算机知道它到底看到了什么,尤其是文字资料。 由于OCR是一门与识别率拔河的技术,因此如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(Intelligent Character Recognition)的名词也因此而产生。而根据文字资料存在的媒体介质不同,及取得这些资料的方式不同,就衍生出各式各样、各种不同的应用。”这里有个关键词:“正确率”,也就是“识别率”——既然不能够总是100%,我们自然不可能完全寄希望于通过QTP能够每次100%正确的去识别图片里的文本。尤其是“道高一尺魔高一丈”的今天,验证码加入了大量的干扰素,如扭曲、变形、错位、随机背景花纹,给OCR识别增加了很多难度——本来就不希望被软件识别到嘛。
.GIG)q"MQt:}C x0
)s+j h*z$}(O0 本文出自songfun的51Testing软件测试博客,转载请保留出处及链接:http://www.51testing.com/?songfun51Testing软件测试网 i.WC| {1W2ut2Q
51Testing软件测试网WN#`n'M1m
MhAXF,A/J0 了解了OCR之后,我们再来看看QTP对应的这个设置。如前面所说,通过QTP菜单的“Tools-->Options”选中到“General--Use text recognition mechanisms in this order”,这里的四个选项就是对应的不同设置。我们看看帮助的描述(我做了翻译):51Testing软件测试网 Uz"\;Oa g/kh
=================================51Testing软件测试网WZ4i"a9j,A|P&P
使用文本识别机制
sTP/dq0
7blEu"v!\R0R0 指定QTP在采用 “文本”或者“文本区域” 的 检查点或输出值 的步骤时,捕获文本内容所使用的文本识别机制。
!],H OBw[0 以下有三种识别方式:51Testing软件测试网'J W/RgZ1F*J
1、先使用Windows API,再使用OCR(默认)。
}2xU(l+?4^.n d._0 指示QTP首先尝试以基于Windows API的机制从对象上直接获取文本内容。如果未获取到文本(比如,文本属于图片的一部分),QTP就会使用OCR的机制尝试获取这段文本。51Testing软件测试网;D(Kc%_]*Y/C&R#e }|
强烈建议在使用中日韩(象形文字)、英的语言环境下采用这个设置。51Testing软件测试网 EL+r(h omoF
$Te;|V&teH$a0 2、先使用OCR,再使用Windows API。51Testing软件测试网X4E7}4lk4Z$w
指示QTP首先尝试使用OCR机制从对象上去获取文本。如果未获取到文本,QTP就会以Windows API的机制去获取文本内容。51Testing软件测试网7V/F2q ['Vv0}Fc-w4a
51Testing软件测试网(g M5zZ9T9a&K8Kh
3、仅使用Windows API方式。51Testing软件测试网hoBS;Rab\ r$Q
指示QTP仅采用基于Windows API的机制从对象上获取文本内容。51Testing软件测试网l)n Kf1Z%z
PO!H[:X6H:k9Q X0 4、仅使用OCR的方式。51Testing软件测试网3a[e[GSy Cp
指示QTP仅采用基于OCR的机制从对象上获取文本内容。51Testing软件测试网 QT6A M/w~ d:SZQ
在使用Windows Vista要使用这种方式。
0v?\+r&hj0
gL1T5u,\kD0 =================================51Testing软件测试网)Ps%t;G%co(^:Lt}
本文出自songfun的51Testing软件测试博客,转载请保留出处及链接:http://www.51testing.com/?songfun51Testing软件测试网k3t%f)d!GO Q]
51Testing软件测试网WN#`n'M1m
Bb4p,]pv FP0 上面的内容已经解释的很明确了,接下来我们通过TextArea Output Value看看效果。51Testing软件测试网D.sH.j Yt'd^#g
HG6`O!_0 如下图所示,QTP针对几张图片的识别效果:51Testing软件测试网(@rB:F7kF
(一)、内容是51Testing的,QTP获取正确;内容是51Testing的G风格彩字,QTP获取错误(显示为IC_CHECK_PATTERN)
I6hY8m:P g-\K0 51Testing软件测试网 xt Ow'bd
+bnq jEB+V`.g1D0
q:Q D!eO4T^)q/e0 (二)、内容是songfun的普通文本,QTP获取正确;内容是songfun的G风格彩字,QTP获取错误(也显示为IC_CHECK_PATTERN)
\+Q3F$q6G x:WV'U0
'n$rb.zs"D8tTc%h0 51Testing软件测试网*C0NR"a"i#|R:hz
51Testing软件测试网*g,EQ/gM'hx
51Testing软件测试网&dfgDO/?Av;G
有兴趣大家可以自己做一些图片,甚至可以用QQ的验证码图片来试验一下,看看OCR效果。
]~$d!X4D^ a G051Testing软件测试网a?#mt)u aH]-W
本文出自songfun的51Testing软件测试博客,转载请保留出处及链接:http://www.51testing.com/?songfun
e \.lI$r+L9B#l$Z051Testing软件测试网WN#`n'M1m51Testing软件测试网6W1R-V}go[p -
QTP日志实践的几点总结(转)
2008-03-25 22:49:01
背景:在日常使用QTP中,因为有QC的存在,导致了QTP的察看结果的功能并不是用的很顺手,所以笔者在脱离开QC的情况下,在工作实践中总结了QTP的日志实现的一些方法。
1、生成txt文件。这是从开发那边得到的启示。
首先定义一个sub:
Public Sub WriteLineToFile(message)
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim fileSystemObj, fileSpec
Dim currentTime
currentDate = Date
currentTime = Time
testName = "log"
Set fileSystemObj = CreateObject("scrīpting.FileSystemObject")
fileSpec ="C:\" &testName& ".txt" 'change this according to your directory
If Not (fileSystemObj.FileExists(filespec)) Then
Set logFile = fileSystemObj.CreateTextFile(fileSpec, ForWriting, True)
logFile.WriteLine ("#######################################################################")
logFile.WriteLine (currentDate & currentTime & " Test: " & environment.Value("TestName") )
logFile.WriteLine ("#######################################################################")
logFile.Close
Set logFile = Nothing
End If
Set logFile = fileSystemObj.OpenTextFile(fileSpec, ForAppending, False, True)
logFile.WriteLine (currentDate & currentTime & " " & message)
logFile.Close
Set logFile = Nothing
Set fileSystemObj = Nothing
End Sub
这样就能在txt中直接明了的看到自己的日志了。(个人感觉比看QTP的results好多了了,当然QTP自身的results还有错误图片等等,下面会介绍我的解决方案)
题外话:在实际应用中,我会在sub中增加一个flag,来标志不同的严重等级,在不同的情况下控制输出不一样类型的日志。
2、使用QTP自身的抓图功能
Public Function capture_desktop()
Dim datestamp
Dim filename
datestamp = Now()
filename = Environment("TestName")&"_"&datestamp&".png"
filename = Replace(filename,"/","")
filename = Replace(filename,":","")
filename = "C:\QTP_ScreenShots"&""&filename
Desktop.CaptureBitmap filename
Reporter.ReportEvent micFail,"image","<img src='" & filename & "'>"
End Function
该函数主要就是用到Desktop.CaptureBitmap的这个方法,把桌面的图片抓下来,这样比较自由的抓下任意时候桌面的图片,方便我们检查结果。
题外话:可以通过Function的返回值和上面提到的方法结合在一起的话,效果会更好的。
3、使用outlook发送邮件
Public Sub SendEmail(testname,strsubject,stremailcontent,attachment,strrecipient)
Set ōut = CreateObject("Outlook.Application")
Set mapi = out.GetNameSpace("MAPI")
Set email = out.CreateItem(0)
email.Recipients.Add(strrecipient)
email.Subject = strsubject
email.Body = stremailcontent
Set ōAttachment = email.Attachments.Add(attachment)
email.Send
Set ōutlook = Nothing
Set mapi = Nothing
End Sub
题外话:假如我们把日志和抓图都结合在一起作为附件发出去的话,在自动化测试中后期会很有用,当然前提是不使用QC的情况下。
4、这是一个针对上面第3点如何把抓图放在一个doc中。
Set ōWord = CreateObject("Word.Application")
oWord.DisplayAlerts = False
oWord.Visible = False
oWord.documents.open "testWordDoc.doc"
Set ōDoc = oWord.ActiveDocument
Set ōRange = oDoc.content
oRange.ParagraphFormat.Alignment = 0
oRange.insertafter vbcrlf '& " " & vbcrlf
oRange.collapse(0)
oRange.InlineShapes.AddPicture "ImagePath.bmp", False, True
oWord.ActiveDocument.Save
oWord.Application.Quit True
Set ōRange = Nothing
Set ōDoc = Nothing
Set ōWord = Nothing
当然QTP和excel,word结合的不错的,所以在测试中灵活运动,效果会很好的 -
QTP Excel函数
2008-03-25 22:45:07
Dim ExcelApp 'As Excel.Application
Dim excelSheet 'As Excel.worksheet
Dim excelBook 'As Excel.workbook
Dim fso 'As scrīpting.FileSystemObject' *********************************************************************************************
' 函数说明:创建一个Excel应用程序ExcelApp,并创建一个新的工作薄Workbook;
' 参数说明:无
' 调用方法:
' CreateExcel()
' *********************************************************************************************Function CreateExcel()
Dim excelSheet
Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.Workbooks.Add
ExcelApp.Visible = True
Set CreateExcel = ExcelApp
End Function
' *********************************************************************************************
' 函数说明:关闭Excel应用程序;
' 参数说明:
' (1)ExcelApp:Excel应用程序名称;
' 调用方法:
' CloseExcel(ExcelApp)
' *********************************************************************************************
Sub CloseExcel(ExcelApp)
Set excelSheet = ExcelApp.ActiveSheet
Set excelBook = ExcelApp.ActiveWorkbook
Set fso = CreateObject("scrīpting.FileSystemObject")
On Error Resume Next
fso.CreateFolder "C:\Temp"
fso.DeleteFile "C:\Temp\ExcelExamples.xls"
excelBook.SaveAs "C:\Temp\ExcelExamples.xls"
ExcelApp.Quit
Set ExcelApp = Nothing
Set fso = Nothing
Err = 0
On Error GoTo 0
End Sub
' *********************************************************************************************
' 函数说明:保存工作薄;
' 参数说明:
' (1)ExcelApp:Excel应用程序名称;
' (2)workbookIdentifier:属于ExcelApp的工作薄名称;
' (3)path:保存的路径;
' 返回结果:
' (1)保存成功,返回字符串:OK
' (2)保存失败,返回字符串:Bad Worksheet Identifier
' 调用方法:
' ret = SaveWorkbook(ExcelApp, "Book1", "D:\Example1.xls")
' *********************************************************************************************Function SaveWorkbook(ExcelApp, workbookIdentifier, path) 'As String
Dim workbook
On Error Resume Next '启用错误处理程序
Set workbook = ExcelApp.Workbooks(workbookIdentifier)
On Error GoTo 0 '禁用错误处理程序If Not workbook Is Nothing Then
If path = "" Or path = workbook.FullName Or path = workbook.Name Then
workbook.Save
Else
Set fso = CreateObject("scrīpting.FileSystemObject")
'判断路径中是否已添加扩展名.xls
If InStr(path, ".") = 0 Then
path = path & ".xls"
End If
'删除路径下现有同名的文件
On Error Resume Next
fso.DeleteFile path
Set fso = Nothing
Err = 0
On Error GoTo 0
workbook.SaveAs path
End If
SaveWorkbook = "OK"
Else
SaveWorkbook = "Bad Workbook Identifier"
End If
End Function
' *********************************************************************************************
' 函数说明:设置工作表excelSheet单元格的值
' 参数说明:
' (1)excelSheet:工作表名称;
' (2)row:列的序号,第一列为1;
' (3)column:行的序号,第一行为1;
' (4)value:单元格要设置的值;
' 返回结果:
' 无返回值
' 调用方法:
' SetCellValue excelSheet1, 1, 2, "test"
' *********************************************************************************************Sub SetCellValue(excelSheet, row, column, value)
On Error Resume Next
excelSheet.Cells(row, column) = value
On Error GoTo 0
End Sub
'The GetCellValue returns the cell's value according to its row column and sheet
'excelSheet - the Excel Sheet in which the cell exists
'row - the cell's row
'column - the cell's column
'return 0 if the cell could not be found
' *********************************************************************************************
' 函数说明:获取工作表excelSheet单元格的值
' 参数说明:
' (1)excelSheet:工作表名称;
' (2)row:列的序号;
' (3)column:行的序号;
' 返回结果:
' (1)单元格存在,返回单元格值;
' (2)单元格不存在,返回0;
' 调用方法:
' set CellValue = GetCellValue(excelSheet, 1, 2)
' *********************************************************************************************Function GetCellValue(excelSheet, row, column)
value = 0
Err = 0
On Error Resume Next
tempValue = excelSheet.Cells(row, column)
If Err = 0 Then
value = tempValue
Err = 0
End If
On Error GoTo 0
GetCellValue = value
End Function
' *********************************************************************************************
' 函数说明:获取并返回工作表对象
' 参数说明:
' (1)ExcelApp:Excel应用程序名称;
' (2)sheetIdentifier:属于ExcelApp的工作表名称;
' 返回结果:
' (1)成功:工作表对象Excel.worksheet
' (1)失败:Nothing
' 调用方法:
' Set excelSheet1 = GetSheet(ExcelApp, "Sheet Name")
' *********************************************************************************************Function GetSheet(ExcelApp, sheetIdentifier)
On Error Resume Next
Set GetSheet = ExcelApp.Worksheets.Item(sheetIdentifier)
On Error GoTo 0
End Function
' *********************************************************************************************
' 函数说明:添加一张新的工作表
' 参数说明:
' (1)ExcelApp:Excel应用程序名称;
' (2)workbookIdentifier:属于ExcelApp的工作薄名称;
' (2)sheetName:要插入的工作表名称;
' 返回结果:
' (1)成功:工作表对象worksheet
' (1)失败:Nothing
' 调用方法:
' InsertNewWorksheet(ExcelApp, workbookIdentifier, "new sheet")
' *********************************************************************************************Function InsertNewWorksheet(ExcelApp, workbookIdentifier, sheetName)
Dim workbook 'As Excel.workbook
Dim worksheet 'As Excel.worksheet
'如果指定的工作薄不存在,将在当前激活状态的工作表中添加工作表
If workbookIdentifier = "" Then
Set workbook = ExcelApp.ActiveWorkbook
Else
On Error Resume Next
Err = 0
Set workbook = ExcelApp.Workbooks(workbookIdentifier)
If Err <> 0 Then
Set InsertNewWorksheet = Nothing
Err = 0
Exit Function
End If
On Error GoTo 0
End If
sheetCount = workbook.Sheets.Count '获取工作薄中工作表的数量
workbook.Sheets.Add , sheetCount '添加工作表
Set worksheet = workbook.Sheets(sheetCount + 1) '初始化worksheet为新添加的工作表对象
'设置新添加的工作表名称
If sheetName <> "" Then
worksheet.Name = sheetName
End If
Set InsertNewWorksheet = worksheet
End Function
' *********************************************************************************************
' 函数说明:修改工作表的名称;
' 参数说明:
' (1)ExcelApp:Excel应用程序名称;
' (2)workbookIdentifier:属于ExcelApp的工作薄名称;
' (3)worksheetIdentifier:属于workbookIdentifier工作薄的工作表名称;
' (4)sheetName:修改后的工作表名称;
' 返回结果:
' (1)修改成功,返回字符串:OK
' (2)修改失败,返回字符串:Bad Worksheet Identifier
' 调用方法:
' set ret = RenameWorksheet(ExcelApp, "Book1", "Sheet1", "Sheet Name")
' *********************************************************************************************Function RenameWorksheet(ExcelApp, workbookIdentifier, worksheetIdentifier, sheetName)
Dim workbook
Dim worksheet
On Error Resume Next
Err = 0
Set workbook = ExcelApp.Workbooks(workbookIdentifier)
If Err <> 0 Then
RenameWorksheet = "Bad Workbook Identifier"
Err = 0
Exit Function
End If
Set worksheet = workbook.Sheets(worksheetIdentifier)
If Err <> 0 Then
RenameWorksheet = "Bad Worksheet Identifier"
Err = 0
Exit Function
End If
worksheet.Name = sheetName
RenameWorksheet = "OK"
End Function
' *********************************************************************************************
' 函数说明:删除工作表;
' 参数说明:
' (1)ExcelApp:Excel应用程序名称;
' (2)workbookIdentifier:属于ExcelApp的工作薄名称;
' (3)worksheetIdentifier:属于workbookIdentifier工作薄的工作表名称;
' 返回结果:
' (1)删除成功,返回字符串:OK
' (2)删除失败,返回字符串:Bad Worksheet Identifier
' 调用方法:
' set ret = RemoveWorksheet(ExcelApp, "Book1", "Sheet1")
' *********************************************************************************************Function RemoveWorksheet(ExcelApp, workbookIdentifier, worksheetIdentifier)
Dim workbook 'As Excel.workbook
Dim worksheet 'As Excel.worksheet
On Error Resume Next
Err = 0
Set workbook = ExcelApp.Workbooks(workbookIdentifier)
If Err <> 0 Then
RemoveWorksheet = "Bad Workbook Identifier"
Exit Function
End If
Set worksheet = workbook.Sheets(worksheetIdentifier)
If Err <> 0 Then
RemoveWorksheet = "Bad Worksheet Identifier"
Exit Function
End If
worksheet.Delete
RemoveWorksheet = "OK"
End Function
' *********************************************************************************************
' 函数说明:添加新的工作薄
' 参数说明:
' (1)ExcelApp:Excel应用程序名称;
' 返回结果:
' (1)成功:工作表对象NewWorkbook
' (1)失败:Nothing
' 调用方法:
' set NewWorkbook = CreateNewWorkbook(ExcelApp)
' *********************************************************************************************Function CreateNewWorkbook(ExcelApp)
Set NewWorkbook = ExcelApp.Workbooks.Add()
Set CreateNewWorkbook = NewWorkbook
End Function
' *********************************************************************************************
' 函数说明:打开工作薄
' 参数说明:
' (1)ExcelApp:Excel应用程序名称;
' (2)path:要打开的工作薄路径;
' 返回结果:
' (1)成功:工作表对象NewWorkbook
' (1)失败:Nothing
' 调用方法:
' set NewWorkbook = CreateNewWorkbook(ExcelApp)
' *********************************************************************************************Function OpenWorkbook(ExcelApp, path)
On Error Resume Next
Set NewWorkbook = ExcelApp.Workbooks.Open(path)
Set ōpenWorkbook = NewWorkbook
On Error GoTo 0
End Function
' *********************************************************************************************
' 函数说明:将工作薄设置为当前工作状态
' 参数说明:
' (1)ExcelApp:Excel应用程序名称;
' (2)workbookIdentifier:要设置为当前工作状态的工作薄名称;
' 返回结果:无返回值;
' 调用方法:
' ActivateWorkbook(ExcelApp, workbook1)
' *********************************************************************************************Sub ActivateWorkbook(ExcelApp, workbookIdentifier)
On Error Resume Next
ExcelApp.Workbooks(workbookIdentifier).Activate
On Error GoTo 0
End Sub
' *********************************************************************************************
' 函数说明:关闭Excel工作薄;
' 参数说明:
' (1)ExcelApp:Excel应用程序名称;
' (2)workbookIdentifier:
' 调用方法:
' CloseWorkbook(ExcelApp, workbookIdentifier)
' *********************************************************************************************Sub CloseWorkbook(ExcelApp, workbookIdentifier)
On Error Resume Next
ExcelApp.Workbooks(workbookIdentifier).Close
On Error GoTo 0
End Sub
' *********************************************************************************************
' 函数说明:判断两个工作表对应单元格内容是否相等
' 参数说明:
' (1)sheet1:工作表1的名称;
' (2)sheet2:工作表2的名称;
' (3)startColumn:开始比较的行序号;
' (4)numberOfColumns:要比较的行数;
' (5)startRow:开始比较的列序号;
' (6)numberOfRows:要比较的列数;
' (7)trimed:是否先除去字符串开始的空格和尾部空格后再进行比较,true或flase;
' 返回结果:
' (1)两工作表对应单元格内容相等:true
' (2)两工作表对应单元格内容不相等:flase
' 调用方法:
' ret = CompareSheets(excelSheet1, excelSheet2, 1, 10, 1, 10, False)
' *********************************************************************************************Function CompareSheets(sheet1, sheet2, startColumn, numberOfColumns, startRow, numberOfRows, trimed)
Dim returnVal 'As Boolean
returnVal = True
'判断两个工作表是否都存在,任何一个不存在停止判断,返回flase
If sheet1 Is Nothing Or sheet2 Is Nothing Then
CompareSheets = False
Exit Function
End If
'循环判断两个工作表单元格的值是否相等
For r = startRow to (startRow + (numberOfRows - 1))
For c = startColumn to (startColumn + (numberOfColumns - 1))
Value1 = sheet1.Cells(r, c)
Value2 = sheet2.Cells(r, c)
'如果trimed为true,去除单元格内容前面和尾部空格
If trimed Then
Value1 = Trim(Value1)
Value2 = Trim(Value2)
End If
'如果单元格内容不一致,函数返回flase
If Value1 <> Value2 Then
Dim cell 'As Excel.Range
'修改sheet2工作表中对应单元格值
sheet2.Cells(r, c) = "Compare conflict - Value was '" & Value2 & "', Expected value is '" & Value1 & "'."
'初始化cell为sheet2中r:c单元格对象
Set cell = sheet2.Cells(r, c) '
'将sheet2工作表中对应单元格的颜色设置为红色
cell.Font.Color = vbRed
returnVal = False
End If
Next
Next
CompareSheets = returnVal
End Function -
QTP User-Defined Function 学习经验汇总[转]
2008-01-30 15:31:15
1. 可以通过Function Definition Generator方便的定制自定义函数(Function)
2. Built-in Function优先级高于User-Defined Function。因此若存在同名的话,QTP会优先调用内置的Function
3. 通过RegisterUserFunc可以将自定义的函数注册为特定对象的方法,甚至可以覆盖原有对象的方法(Method)。通过UnRegisterUserFunc取消注册
注册方式:RegisterUserFunc TOClass, MethodName, FunctionName, True
反注册方式:UnRegisterUserFunc TOClass, MethodName
4. 定义在Action中的Function以及注册的Method只能在当前Action中使用,若需要供全局使用则定义到Function Library中
5. 如果Method在Action中注册并且被其他Action调用时,该Method定义也适用于调用Action(Calling Action)。但如果Function定义在被调用Action中(Called Action),则Calling Action会因为找不到Function定义而失败。这种情况的话,需要将Function 定义在Function Library中
6. QTP在测试执行前会清除所有的Method Register
7. 默认情况下,User-Defined Function的运行结果不会出现在Test Result中,可以自己用Reporter.ReportEvent添加log
8. QTP在打开Test时加载了关联的Function Library,因此,若其他人或者你用其他编辑器修改了对应的Function Library,只有在QTP重新打开该Test后才生效
9. QTP搜索Function的顺序是先Test在Function Library。另外,同名的Function存在于多个Function Library时,后一个被使用
10. 对于同一个Method先后注册了两个不同的Function,后面的Method注册会覆盖前面的。当用UnRegisterUserFunc反注册时,会将该Method返回到原始状态,而不会回到前一个注册
11. 在某Action中使用ExecuteFile后,该Function只能在当前Action中使用
12. 对于存储在QC中的外部资源,如Function Library,QTP打开时为其创建了一个本地副本。因此若其他人修改了QC上的外部资源,或你使用其他编辑器进行修改时,该修改只有在QTP重新打开该Test才生效。但对于存储在本地的外部资源,不存在该问题
13. 在Test Settings中设置了Default Function Library列表后,新建Test时这些Library即被集成到新创建的Test中。以后对Default Function Library列表的修改对已有Test不产生任何影响。 -
QTP自动化测试流程
2008-01-29 20:16:10
黑色字体是原文,蓝色字体是我的注释,代表我个人的看法,仅供参考。
1)准备TestCase
- 在进行自动化之前,将测试内容进行文档化,不建议直接录制脚本
- 在录制脚本之前设计好脚本,便于录制过程的流畅
- 由于测试用例设计和脚本开发可能不是同一个人完成,便于团队合作
- 便于后期的维护
- 文档化的方式:TD或者文档Test Case的建立是所有脚本成立的先觉条件,所以在正式开始编写脚本前,必须确保:
- Case覆盖率高(需求覆盖、代码覆盖等)
- Case书写步骤清晰,便于脚本与之一一对应
- Case期望结果明了,便于脚本对期望结果进行检查
- Case经过开发、测试Review,保证产品所有主要人员对产品及测试达成同一认识
- 针对不同测试阶段,挑选在回归测试中需要自动化实现的Case(实属脚本计划阶段)
2)配置QTP
QTP支持不同的开发环境,在正式录制之前,需要根据被测程序的开发环境,选择合适的Add-In,并进行加载。做到以下几点会对后期的脚本维护产生莫大的方便:
- 建立统一的脚本架构
- 共享资源的建立(对象库、测试数据等等)
- 共用Function Library的建立
- 建立统一的代码规范(含命名规范、注释、代码缩进、位图检查等)
- 统一所有的编码风格
- 统一配置测试环境,确保所有测试环境均能运行所写脚本3)录制脚本
启动QTP的录制功能,按照Test Case的操作步骤描述执行,QTP自动记录每一步操作,并自动生成VBscrīpt脚本。除必要的位图检查之外,严格要求脚本必须使用手写,防止脚本录制导致代码臃肿以及可读性差。
4)修改增强脚本
刚刚录制好的脚本可能包含错误,或者没有达到预期的目的,这就需要在录制脚本的基础上,进行修改增强
- 删除录制过程中多余的以及错误的操作,以最少的脚本完成任务
- 如果前面操作的输出是后面操作的输入,则需要使用变量或者输出值来进行替换
- 不是所有的操作都可以通过录制产生的,有些需要通过手工编码实现这些功能
- 录制产生的脚本是线性的,可以加入条件、循环控制语句,实现更复杂的流程
- 对脚本进行结构化
- 加入注释,便于阅读和维护
5)调试脚本
- 回放通过的脚本,不一定是正确的,也可能会包含错误
- 在测试脚本正式使用之前,要保证其本身的正确性
- 避免测试脚本故障和被测程序故障搅在一起,不容易定位脚本调试完成后,需要完成如下几步才能真正的用在实际项目当中:
- 单个脚本调试成功后,需要其他人员Review(类似极限编程)后方可Checkin代码
- 把所有单独运行成功的脚本集合在一起,进行脚本的集成测试和系统测试6)回放脚本
- 对于回放的错误,不要急于马上提交Bug,首先要判断是脚本本身的错误还是程序的错误,确认后再提交。
7)脚本维护
- 随着工作的不断推进,脚本量会越来越多
- 被测试程序的不断更新,也需要更新相应的测试脚本
- 采用版本管理工具保存脚本,如CVS、VSS,可以随时获取历史版本
- 采用统一的脚本架构
- 采用统一的命名规范
- 添加充分的注释,避免时间久了,自己都不能马上读懂脚本如果前期工作做的好,脚本维护的成本会低出很多,所以强烈建议在前期能够形成统一的制度。
-
如何解决返回数据库查询纪录条数(转)
2008-01-29 19:37:21
方法一
Set oRs = Server.CreateObject("ADODB.RecordSet")
oRs.Open sSql, oConn, 1, 1
来读数据.
仅检索数据:rs.open SQL,conn,1
更新数据:rs.open SQL,conn,2,2,1
方法二
用Select Count(*) As RecordCount From [table]
oRs("RecordCount")来获取
方法三
用Do While Not oRs.Eof
RecordCount = RecordCount + 1
Loop
方法一原理如下:
通常人们使用以下两种方法来执行SQL语句:
Set Rs=Conn.Execute(SqlStr)
和
Set Rs=Server.CreateObject(“ADODB.RecordSet“)
Rs.Open SqlStr,Conn,CursorType,LockType
(RecordSet对象方法请看这里)
由于默认的记录集游标是服务器游标,
Rs.CursorLocation = adUseServer
所以返回Rs.RecordCount=-1,
应该把服务器游标改为客户端游标,
Rs.CursorLocation = adUseClient
Rs.Open SqlStr,Conn,CursorType,LockType
rs.cursortype
光标类型 recordcount 属性
---------------------------------------------
ForwardOnly 0(默认) 返回-1
Keyset 1 正确的记录数
Dynamic 2 -1或不正确的记录数,依数据源而定
Static 3 正确的记录数 -
Scripting Techniques (转)
2008-01-29 18:29:42
Adding Elements to a Dictionary
Demonstration scrīpt that adds three key-item pairs to a scrīpt Runtime Dictionary. scrīpt must be run on the local computer.Set ōbjDictionary = CreateObject("scrīpting.Dictionary") objDictionary.Add "Printer 1", "Printing" objDictionary.Add "Printer 2", "Offline" objDictionary.Add "Printer 3", "Printing"
Creating an Instance of Internet Explorer
Demonstration scrīpt that creates an instance of Internet Explorer, opened to a blank page.Set ōbjExplorer = Wscrīpt.CreateObject("InternetExplorer.Application") objExplorer.Navigate "about:blank" objExplorer.ToolBar = 0 objExplorer.StatusBar = 0 objExplorer.Width=300 objExplorer.Height = 150 objExplorer.Left = 0 objExplorer.Top = 0 objExplorer.Visible = 1
Creating scrīpt Documentation Using scrīpt Comments
Demonstrates the use of the FileSystemObject as a way to copy comments from a scrīpt to a separate text file. Requires comments to have been marked using '*.Const ForReading = 1 Const ForWriting = 2 Set ōbjFSO = CreateObject("scrīpting.FileSystemObject") Set ōbjscrīptFile = objFSO.OpenTextFile("c:\scrīpts\Service_Monitor.vbs", _ ForReading) Set ōbjCommentFile = objFSO.OpenTextFile("c:\scrīpts\Comments.txt", _ ForWriting, TRUE) Do While objscrīptFile.AtEndOfStream <> TRUE strCurrentLine = objscrīptFile.ReadLine intIsComment = Instr(1,strCurrentLine,"'*") If intIsComment > 0 Then objCommentFile.Write strCurrentLine & VbCrLf End If Loop objscrīptFile.Close objCommentFile.Close
Determining the Number of Items in a Dictionary
Demonstration scrīpt that counts the number of key-item pairs in a scrīpt Runtime Dictionary. scrīpt must be run on the local computer.Set ōbjDictionary = CreateObject("scrīpting.Dictionary") objDictionary.Add "Printer 1", "Printing" objDictionary.Add "Printer 2", "Offline" objDictionary.Add "Printer 3", "Printing" Wscrīpt.Echo objDictionary.Count
Displaying Real Time Events in a Command Window
Creates a temporary event consumer that monitors the event log for error events. When an error event occurs, the scrīpt displays the event information in the command window.strComputer = "." Set ōbjWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate,(Security)}!\\" & _ strComputer & "\root\cimv2") Set colMonitoredEvents = objWMIService.ExecNotificationQuery _ ("Select * from __InstanceCreationEvent within 5 where TargetInstance isa " _ & "'Win32_NTLogEvent' and TargetInstance.EventType = '1'") Do Set ōbjLatestEvent = colMonitoredEvents.NextEvent Wscrīpt.Echo "Record No.: " & _ objLatestEvent.TargetInstance.RecordNumber Wscrīpt.Echo "Event ID: " & objLatestEvent.TargetInstance.EventCode Wscrīpt.Echo "Time: " & objLatestEvent.TargetInstance.TimeWritten Wscrīpt.Echo "Source: " & objLatestEvent.TargetInstance.SourceName Wscrīpt.Echo "Category: " & _ objLatestEvent.TargetInstance.CategoryString Wscrīpt.Echo "Event Type: " & objLatestEvent.TargetInstance.Type Wscrīpt.Echo "Computer: " & _ objLatestEvent.TargetInstance.ComputerName Wscrīpt.Echo "User: " & objLatestEvent.TargetInstance.User Wscrīpt.echo "Text: " & objLatestEvent.TargetInstance.Message Loop
Displaying Tabular Output in a Command Window
Retrieves service data from a computer, and then outputs that data in tabular format in a command window.Set colServices = GetObject("winmgmts:"). _ ExecQuery("Select * from Win32_Service") For Each objService in colServices intPadding = 50 - Len(objService.DisplayName) intPadding2 = 17 - Len(objService.StartMode) strDisplayName = objService.DisplayName & Space(intPadding) strStartMode = objService.StartMode & Space(intPadding2) Wscrīpt.Echo strDisplayName & strStartMode & objService.State Next
Masking Command Line Passwords
Demonstration scrīpt that uses scrīptPW.dll to mask passwords entered at the command line.Set ōbjPassword = CreateObject("scrīptPW.Password") Wscrīpt.StdOut.Write "Please enter your password:" strPassword = objPassword.GetPassword() Wscrīpt.Echo Wscrīpt.Echo "Your password is: " & strPassword
Masking Passwords Using Internet Explorer
Demonstration scrīpt that creates an instance of Internet Explorer, and retrieves a password typed into a password-style text box. Requires a Web page named password.htm with the appropriate text box.Set ōbjExplorer = Wscrīpt.CreateObject _ ("InternetExplorer.Application", "IE_") objExplorer.Navigate "file:///c:\scrīpts\password.htm" objExplorer.Visible = 1 objExplorer.ToolBar = 0 objExplorer.StatusBar = 0 objExplorer.Width=400 objExplorer.Height = 250 objExplorer.Left = 0 objExplorer.Top = 0 Do While (objExplorer.Document.Body.All.OKClicked.Value = "") Wscrīpt.Sleep 250 Loop strPassword = objExplorer.Document.Body.All.PasswordBox.Value objExplorer.Quit Wscrīpt.Sleep 250 Wscrīpt.Echo strPassword
Removing All Elements from a Dictionary
Demonstration scrīpt that deletes all the key-item pairs from a scrīpt Runtime Dictionary. scrīpt must be run on the local computer.Set ōbjDictionary = CreateObject("scrīpting.Dictionary") objDictionary.Add "Printer 1", "Printing" objDictionary.Add "Printer 2", "Offline" objDictionary.Add "Printer 3", "Printing" colKeys = objDictionary.Keys Wscrīpt.Echo "First run: " For Each strKey in colKeys Wscrīpt.Echo strKey Next objDictionary.RemoveAll colKeys = objDictionary.Keys Wscrīpt.Echo VbCrLf & "Second run: " For Each strKey in colKeys Wscrīpt.Echo strKey Next
Removing Debugging Comments
Demonstrates the use of the FileSystemObject as a way to remove debugging comments from a scrīpt. Requires comments to have been marked as '* BUG.Const ForReading = 1 Const ForWriting = 2 Set ōbjFSO = CreateObject("scrīpting.FileSystemObject") Set ōbjTextFile = objFSO.OpenTextFile("C:\scrīpts\CreateUser.vbs", ForReading) Do While objTextFile.AtEndOfStream <> true strNextLine = objTextFile.Readline intCheckForBugComment = Instr(strNextLine, "'* BUG") If intCheckForBugComment = 0 Then strSavedLines = strSavedLines & strNextLine & VbCrLf End If Loop Set ōbjTextFile = objFSO.OpenTextFile _ ("c:\scrīpts\CreateUser.vbs ", ForWriting) objTextFile.Write strSavedLines objTextFile.Close
Removing One Element from a Dictionary
Demonstration scrīpt that deletes a specific key-item pair from a scrīpt Runtime Dictionary. scrīpt must be run on the local computer.Set ōbjDictionary = CreateObject("scrīpting.Dictionary") objDictionary.Add "Printer 1", "Printing" objDictionary.Add "Printer 2", "Offline" objDictionary.Add "Printer 3", "Printing" colKeys = objDictionary.Keys Wscrīpt.Echo "First run: " For Each strKey in colKeys Wscrīpt.Echo strKey Next objDictionary.Remove("Printer 2") colKeys = objDictionary.Keys Wscrīpt.Echo VbCrLf & "Second run: " For Each strKey in colKeys Wscrīpt.Echo strKey Next
Retrieving Command Line Arguments from an Active Directory Container
Demonstration scrīpt that retrieves the names of all the computers in an Active Directory container, and then returns service information from each of those computers.Set ōbjDictionary = CreateObject("scrīpting.Dictionary") i = 0 Set ōbjOU = GetObject("LDAP://CN=Computers, DC=fabrikam, DC=com") objOU.Filter = Array("Computer") For Each objComputer in objOU objDictionary.Add i, objComputer.CN i = i + 1 Next For Each objItem in objDictionary Set colServices = GetObject("winmgmts://" & _ objDictionary.Item(objItem) _ & "").ExecQuery("Select * from Win32_Service") Wscrīpt.Echo colServices.Count Next
Retrieving Command Line Arguments from a Text File
Demonstration scrīpt that opens a hypothetical text file consisting of server names, then retrieves service information from each on the servers in the file.Const ForReading = 1 Set ōbjDictionary = CreateObject("scrīpting.Dictionary") Set ōbjFSO = CreateObject("scrīpting.FileSystemObject") Set ōbjTextFile = objFSO.OpenTextFile("c:\scrīpts\servers.txt", ForReading) i = 0 Do Until objTextFile.AtEndOfStream strNextLine = objTextFile.Readline objDictionary.Add i, strNextLine i = i + 1 Loop For Each objItem in objDictionary Set colServices = GetObject("winmgmts://" & _ objDictionary.Item(objItem) _ & "").ExecQuery("Select * from Win32_Service") Wscrīpt.Echo colServices.Count Next
Retrieving a Web Page
Retrieves the HTML source for the Web page http://www.microsoft.com. This scrīpt contributed by Maxim Stepin of Microsoft.url="http://www.microsoft.com" Set ōbjHTTP = CreateObject("MSXML2.XMLHTTP") Call objHTTP.Open("GET", url, FALSE) objHTTP.Send Wscrīpt.Echo(objHTTP.ResponseText)
Saving Data in XML Format
Demonstration scrīpt that retrieves service information for a computer, and then saves that data as an XML file.Const ForAppending = 2 Set ōbjFSO = CreateObject("scrīpting.FileSystemObject") Set ōbjTextFile = objFSO.OpenTextFile _ ("c:\scrīpts\service_status.xml", ForAppending, True) objTextFile.WriteLine "" objTextFile.Write "" objTextFile.WriteLine "" strComputer = "." Set colServices = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2"). _ ExecQuery("Select * from Win32_Service") For Each objService in colServices objTextFile.WriteLine "" objTextFile.WriteLine "" objTextFile.WriteLine objService.DisplayName objTextFile.WriteLine "" objTextFile.WriteLine "" objTextFile.WriteLine objService.State objTextFile.WriteLine "" objTextFile.WriteLine "" Next objTextFile.WriteLine "" objTextFile.Close
Sorting WMI Data
Demonstration scrīpt showing how WMI data can be sorted using a disconnected recordset (by itself, WMI does not allow you to specify a sort order for returned data). In this scrīpt, service information is retrieved using WMI and is stored in a disconnected recordset, a recordset that is not tied to a physical data source. The Sort method is then used to sort the service data by service state rather than by service name.Const adVarChar = 200 Const MaxCharacters = 255 Set DataList = CreateObject("ADOR.Recordset") DataList.Fields.Append "ServiceName", adVarChar, MaxCharacters DataList.Fields.Append "ServiceState", adVarChar, MaxCharacters DataList.Open strComputer = "." Set ōbjWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set ServiceList = objWMIService.ExecQuery _ ("Select * from Win32_Service") For Each Service in ServiceList DataList.AddNew DataList("ServiceName") = Service.Name DataList("ServiceState") = Service.State DataList.Update Next DataList.Sort = "ServiceState" DataList.MoveFirst Do Until DataList.EOF Wscrīpt.Echo DataList.Fields.Item("ServiceName") _ & vbTab & DataList.Fields.Item("ServiceState") DataList.MoveNext Loop
Suppressing Multiple Event Notifications
Issues an alert if available space on a disk drive falls below 100 megabytes. Will wait one hour before issuing the next alert.dtmStartTime = Now strComputer = "." Set ōbjWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set ōbjDiskDrives = objWMIService.ExecQuery _ ("Select * from Win32_LogicalDisk") For Each objDrive in objDiskDrives If objDrive.FreeSpace < 10000000 Then Wscrīpt.Echo "Drive is low on disk space." End If Next Do Set ōbjDiskDrives = objWMIService.ExecQuery _ ("Select * from Win32_LogicalDisk") For Each objDrive in objDiskDrives If objDrive.FreeSpace < 10000000 Then intElapsedHours = DateDiff("h", dtmStartTime, Now) If intElapsedHours >= 1 Then Wscrīpt.Echo "Drive is low on disk space." dtmStartTime = Now End If End If Next Wscrīpt.Sleep 1000 Loop
Tracking scrīpt Progress in a Command Window
Demonstrates the use of StdOut as a method for indicating the progress being made by a scrīpt.Wscrīpt.Echo "Processing information. This might take several minutes." strComputer = "." Set colServices = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2"). _ ExecQuery("Select * from Win32_Service") For Each objService in colServices Wscrīpt.StdOut.Write(".") Next Wscrīpt.StdOut.WriteLine Wscrīpt.Echo "Service information processed."
Tracking scrīpt Progress Using Internet Explorer
Demonstrates how to use Internet Explorer as a method for indicating the progress being made by a scrīpt.Set ōbjExplorer = Wscrīpt.CreateObject("InternetExplorer.Application") objExplorer.Navigate "about:blank" objExplorer.ToolBar = 0 objExplorer.StatusBar = 0 objExplorer.Width=400 objExplorer.Height = 200 objExplorer.Left = 0 objExplorer.Top = 0 Do While (objExplorer.Busy) Wscrīpt.Sleep 200 Loop objExplorer.Visible = 1 objExplorer.Document.Body.InnerHTML = "Retrieving service information. " _ & "This might take several minutes to complete." strComputer = "." Set colServices = GetObject("winmgmts: \\" & strComputer & "\root\cimv2"). _ ExecQuery("Select * from Win32_Service") For Each objService in colServices Wscrīpt.Sleep 200 Next objExplorer.Document.Body.InnerHTML = "Service information retrieved." Wscrīpt.Sleep 3000 Wscrīpt.Quit
Using a Text File as a Command Line Argument
Demonstration scrīpt that allows you to drag a text file (consisting of server names) onto the scrīpt icon in Windows Explorer. The scrīpt then opens the text file, then retrieves service information from each on the servers in the file.Set ōbjArgs = Wscrīpt.Arguments Const ForReading = 1 Set ōbjDictionary = CreateObject("scrīpting.Dictionary") Set ōbjFSO = CreateObject("scrīpting.FileSystemObject") Set ōbjTextFile = objFSO.OpenTextFile(objArgs(0), ForReading) i = 0 Do While objTextFile.AtEndOfStream <> True strNextLine = objTextFile.Readline objDictionary.Add i, strNextLine i = i + 1 Loop For Each objItem in objDictionary Set colServices = GetObject("winmgmts://" & objDictionary.Item(objItem) _ & "").ExecQuery("Select * from Win32_Service") Wscrīpt.Echo colServices.Count Next
Verifying the Existence of a Dictionary Key
Demonstration scrīpt that verifies the existence of a particular key within a scrīpt Runtime Dictionary. scrīpt must be run on the local computer.Set ōbjDictionary = CreateObject("scrīpting.Dictionary") objDictionary.Add "Printer 1", "Printing" objDictionary.Add "Printer 2", "Offline" objDictionary.Add "Printer 3", "Printing" If objDictionary.Exists("Printer 4") Then Wscrīpt.Echo "Printer 4 is in the Dictionary." Else Wscrīpt.Echo "Printer 4 is not in the Dictionary." End If
-
QTP调用.NET类库(转)
2008-01-29 17:14:25
QTP9.2这个版本提供了调用.net框架的功能,使用DotNetFactory对象就可以实现。QTP的帮助文档里面提供了一个例子:
Set var_CreateInstance = DotNetFactory.CreateInstance("System.Windows.Forms.Form", "System.Windows.Forms")var_CreateInstance.Show
下面说一下如何用DotNetFactory调用自己开发的.net类库。
首先用Visual Studio 2003或者2005创建一个新项目:类库,用的是C#。新建一个类,假设命名空间是Test.myTest,类名是QTPTest。我们再新建一个公共方法: public string DoAction()
假设编译后产生的文件是d:\mtTest.dll。下面在QTP里面写脚本:
Set ōbj = DotNetFactory.CreateInstance("Test.myTest.QTPTest", "d:\mtTest.dll")
obj.DoAction
这样就可以在QTP中使用.net类库了,我们可以借助于.net框架的强大功能,把很多测试脚本需要使用的公用功能(比如测试数据准备),用C#实现,然后在QTP中调用,让QTP脚本更强大。 -
Send Email through VBS
2008-01-29 15:20:54
脚本资源来自微软脚本库:
Set ōbjEmail = CreateObject("CDO.Message")
objEmail.From = "monitor1@fabrikam.com"
objEmail.To = "admin1@fabrikam.com"
objEmail.Subject = "Atl-dc-01 down"
objEmail.Textbody = "Atl-dc-01 is no longer accessible over the network."
objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "STMP" 'Server
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 ' Port
objEmail.Configuration.Fields.UpdateobjEmail.Send
-
QTP基础代码(转)
2008-01-12 23:10:05
1 生产随机数列
第一种方法
randomize'更新反回的数据
funcation rand(k)
n=int((k-1)*rnd+1)
rand=n
end funcation第二种方法
n=randomnumber.value(1,255)2 当运行到表中的某一行,自动导出表中的所有数据
row=datatable.getcurrentrow
if row="5" then
datatable.export("d:\data.xml")
end if3
webedit("txtpass").setsecure"sdsdf...."
如果参数化密码,可以直接在数据表中写入未加密的密码,它会自动识别,即不用把setsecure改为set4 如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证
if browser("web_name").dialog("dialog_name").exist(1) then'如果不出现=false
error_message=browser("web_name").dialog("diaglog_name").static("用户密码错误!".getRoproperty("text")
if error_message<>(datatable.value("error_info"))then
msgbox(error_message)
end if
browser("web_name").dialog("diaglog_name").close
end if
这里我总结了两点技巧:
一是:对于dialog中,虽然提示信息对象名称是"用户密码错误",但如果信息对象名称是“该用户不存在”,不用更改会自动识别,我想主要是录制第一遍时,“用户密码错误”只是让运行时能找到这个控制,而不管它是什么内容,因为在对象仓库中,text不是决定该对象的属性
二是:如果对于提示信息比较长的,可以用mid(error_message,n,m)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理5 datatable.value("num")只在global形式下的一种省略形式;完整形式是:
datatable.value("num",dtlocalsheet)-----向某一列的单元格赋值:
datatable.value("column_name",dtlocalsheet)="nanjing"-----取得某一行具体值:
datatable.setcurrentrow(n)
msgbox(datatable.getsheet("global").getparameter("column_name").Rawvalue)
或者kk=datatable.Rawvalue("column_name","action1")----在run-time时,动态添加表格与数据
kk=datatable.addsheet("sheet_name").addparameter("column_name","value").name;7 wintreeview一些操作
选择一个条目:wintreeview.select(item)'根是0
根的名称:wintreeview.getitem(0)8 数据库检查点模块:
sub database_check
set con=createobject("adodb.connection")
con.open "Descrīption=IBM_ODBC;DRIVER=SQL Server;SERVER=IBM;UID=sa;"&_
"PWD=123456;APP=Quick Test Pro;WSID=IBM;DATABASE=IBM_table"
'access方式:con.open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=d:\test.mdb"
'Orocle方式:con.open "DRIVER={Oracle in OraHome92};SERVER=CESHI;UID=CND_TEST;PWD=CND;DBQ=CESHI;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;"
set record=createobject("adodb.recordset")
sql="select*from ibm_one_table"
record.open sql,con
DO
if(record("ibm_table_column")="kai")then'//查找表格中有多少kai
num=num+1;
end if
record.movenext
loop until record.eof=true
record.close
set record=nothing
con.close
set con=nothing
end sub9 换行符
vbcr----chr(13)回车符// vblf----chr(10)换行符
vbcrlf----chr(13)+chr(10)结合//type(chr(13)就相当于按了一上键盘上的enter10 Run from step有两种方式:
在Keyword View模式会从本步骤运行到所有action结束
在expert view模式仅会将本action运行结束11 由于对象属性原因,无法识别对象
-----对于对象属性是变化的,可以参数化/或者用正则表达式
-----报匹配多个对象错误,可以spy查看对象,添加一个该对象另一个唯一标识属性
-----有时可以删除对象的变化的属性来解决识别问题
------对于多个完全相同的对象,可以采用添加index,location,createtime等特殊属性来识别
(index:按照程序源码,绘制对象的先后标识对象,所以与其它相同对象是相互依赖,当其它对象发生
变化后,原先的所有对象index属性要发生变化,开始是0;如index:=0;
location:根据对象的位置进行确定,从上到下,从左到右;
CreateTime:按照对象被浏览器打开的先后标识对象)
------另外换一种思维方式,采取等效的方法;比如用键盘代替鼠标或用操作系统本身特性去解决问题12 对系统文件的操作
-------从系统的文件中获取信息及删除文件
get_file_infor("c:\she.mpg")
function get_file_infor(url)
dim fso,f
set fso=createobject("scrīpting.filesystemobject")
set f=fso.getfile(url)
f.name:f.size:f.type:f.datacreated'///获取文件信息
fso.deletefile(url)'/////删除文件
end function
--------获取文件夹里所有文件信息
get_folder_infor("c:\kai")
function get_folder_infor(folder)
dim fso,f,f1,n
set fso=createobject("scrīpting,filesystemobject")
set f=fso.getfolder(folder)
set fc=f.files
for each f1 in fc
select case f1.name
case"kai.mpg","she.mpg","dd.mp3"'//检查文件夹里是否含有这些文件
end select
next
end function13 等待某个对象出现方法
y=......waitproperty("visible",true,10000)14 防程序中断方法
On error resume next
On error goto handle15 数组的应用:
name=array(1,2,"aa","bb")
name(2)="aa"
16 正则表达式应用模板
进行日期YYYY-MM-DD的格式检查 :
Function RegExpTest(patrn, strng)
Dim regEx, Match, Matches ' Create variable.
Set regEx = New RegExp ' Create a regular expression.
regEx.Pattern = patrn ' Set pattern.
regEx.IgnoreCase = True ' Set case insensitivity.
regEx.Global = True ' Set global applicability.
Set Matches = regEx.Execute(strng) ' Execute search.
For Each Match in Matches ' Iterate Matches collection.
RetStr = RetStr & "Match found at position "
RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
RetStr = RetStr & Match.Value & "'." & vbCRLF
Next
RegExpTest = RetStr
End Function
date_pattern="^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((01,3-9])|(1[0-2]))-(29|30)))))$"
result_message=RegExpTest(date_pattern, inputbox("请你输入要检查的时间:"))'用其它正则表达式更改此处
Select case result_message
Case ""
msgbox("你输入的日期格式与标准不匹配")
case else MsgBox(result_message)
end select17 返回一个字符串在另一字符串中的位置
instr(string1,string2)18 有时回放出现找不到对象时,可能不是由于你的代码问题,而是由于你的操作系统等设置问题;
举例说明1:
比如:你录制一个选择磁盘中的文件动作
会录制为:
.winlistview(" ").drap 46,99
.winlistview(" ").draponitem "she.mp3"
下次录制的时候,如果你的系统文件改为不显示扩展名,下次执行的时候,QTP就找不到she.mp3,只能找到she;
举例说明2:
有时由于不同操作系统以及不同的ie,导致有些窗口不能识别,比如在2000下弹出的网页对话框的标题是:
“web对话框",而在2003上是”网页对话框"19 "is+*"类型function
isarray'是否是数组
isconnected'判断QTP是否连接到TD
isdate'是否是合法的日期类型
isempty'判断是否初始化
isNull'判断是否为空值
isNumeric'判断是否是数字型
isobject'判断是否一个功能对象
isready'判断设备是否准备就绪
isRootFolder'是否是根目录20 Action之间的参数传递
例如:在Action1中,有如下代码:
out_str="This is out_string"
RunAction "Action2",oneIteration,out_str
在Acton2中,在其step->Action Properties中的,input参数栏,加入out_str后,
msgbox(parameter("out_str")),就能正确显示参数了21 Wscrīpt.Shell的一些应用
set WshShell =CreateObject("Wscrīpt.Shell")
WshShell.SendKeys "{ENTER}" '模拟键盘进行操作
WshShell.AppActivate "Calculator" '启动应用程序22 获取对象属性名称用法:
GetRoProperty----从应用程序界面上获取对象属性(即,是脚本运行时,获取的对象动态属性值)
例如:获取对象库中index属性值,似乎只能用GetToProperty,因为应用程序界面上对象没有该属性,只是QTP为识别该对象创立的描述属性;
GetToproperty----从对象库中描述对象的属性,静态值
GetToProperties----获取用于标识对象的属性集;对于这个集合,有count等属性方法23 FireEvent的使用-
可以对一个对象进行更复杂的操作
如:FireEvent("onfocus") '使一个控件获取焦点
FireEvent("ondblclick") '实现双击/也可以在事件设定中针对该对象事件响应24 模板的应用
-----新建一个文本,输入一些新建Action时常包含的信息,然后保存为ActionTemplate.MST文件,
并复制到QTP/dat目录下;这样每次新建action都会包含固定的信息了;
例如:
'-------------------脚本说明---------------
'产品版本: __Build( )
'测试员:
'编写日期:
'测试功能:
'脚本类型:
'被测试对象初始状态:
'进展程度:
'基本思路:
'主要功能函数:
'历史修改:
'没解决的问题:
'--------------------脚本内容-------------25 在对象库中,两个对象有时不能通过更改属性或命名来达到两个对象完全一致的替换;
在web-mod项目中,我在对象库里添加了一个自动含有index标识属性的对象,然后每次通过SetToproperty来改变
index值,对对象进行数据驱动,使其操作另一个对象,但脚本始终操作原先index属性值的对象;后来,把该对象
删除掉,重新添加一个不自动含有index标识属性的该类对象,然后,手工添加,index标识属性,后来脚本能正常 工作了,可见两次的对象属性完全一致,但形成方式不一样,导致的结果往往也不一样;26 childobject的应用
childobject可以返回界面上满足条件的对象集合,而且与对象库里是否有这些对象无关,这就可以简化对象库;
返回的对象集合的count方法可以返回对象个数,这就可以通过下标对单个对象进行操作;在出现index标识对象时
可以进行运用
如:Set m_WinCheck=Descrīption.Create()
m_WinCheck("nativeclass").Value="Button"
set All_WinCheck=Window("").Dialog("").Childobject(m_WinCheck)
n=All_WinCheck.Count()
for i=0 to n-1
All_WinCheck(i).Set "ON"
next
再加三个27 Create Log File:
Dim LOGFile, fso, MyFile
LOGFile="C:\Log.txt"
Set fso = CreateObject("scrīpting.FileSystemObject")
If fso.FileExists(LOGFile) = False Then
Set MyFile = fso.CreateTextFile(LOGFile, True)
MyFile.Close
end if
Set MyFile = fso.OpenTextFile(LOGFile, 8, True)
MyFile.WriteLine("")
MyFile.WriteLine(" " & Cstr(Now) & " ---------------------------------------------------------")
MyFile.WriteLine("LOG Information!")
MyFile.Close
28 数据输入输出方法
数据输入输出的方法:
1 ExecuteFile"e:\kk.vbs"
2 Environment.LoadFromFile("e:\k.xml")
3 Datatable.ImportSheet/Import
4 GetData from DataBase
5 Datatable autofill
6 Action input/output
7 Use GetxxProperty to get data from Object
8 Use Some Function to Product data -
QTP获取本机打印机(含本地与网络)与网络打印机属性
2008-01-11 15:02:42
1. 获取本机所有本地与网络打印机属性:
strComputer = "."
Set ōbjWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colInstalledPrinters = objWMIService.ExecQuery ("Select * from Win32_PrinterDriver")PrtNameArray = Array ()
ReDim PrtNameArray (colInstalledPrinters.Count-1)
i = 0
For each objPrinter in colInstalledPrinters
PrtNameArray(i) = objPrinter.Name
i = i + 1
NextReference from Microsoft.com (scrīpt Center)
strComputer = "."
Set ōbjWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colInstalledPrinters = objWMIService.ExecQuery _
("Select * from Win32_PrinterDriver")
For each objPrinter in colInstalledPrinters
Wscrīpt.Echo "Configuration File: " & objPrinter.ConfigFile
Wscrīpt.Echo "Data File: " & objPrinter.DataFile
Wscrīpt.Echo "Descrīption: " & objPrinter.Descrīption
Wscrīpt.Echo "Driver Path: " & objPrinter.DriverPath
Wscrīpt.Echo "File Path: " & objPrinter.FilePath
Wscrīpt.Echo "Help File: " & objPrinter.HelpFile
Wscrīpt.Echo "INF Name: " & objPrinter.InfName
Wscrīpt.Echo "Monitor Name: " & objPrinter.MonitorName
Wscrīpt.Echo "Name: " & objPrinter.Name
Wscrīpt.Echo "OEM Url: " & objPrinter.OEMUrl
Wscrīpt.Echo "Supported Platform: " & objPrinter.SupportedPlatform
Wscrīpt.Echo "Version: " & objPrinter.Version
Next2. 获取网络打印机属性
Reference from QTP Help (Windows scrīpt Host)
Set WshNetwork = Wscrīpt.CreateObject("Wscrīpt.Network")
Set ōDrives = WshNetwork.EnumNetworkDrives
Set ōPrinters = WshNetwork.EnumPrinterConnections
Wscrīpt.Echo "Network drive mappings:"
For i = 0 to oDrives.Count - 1 Step 2
Wscrīpt.Echo "Drive " & oDrives.Item(i) & " = " & oDrives.Item(i+1)
Next
Wscrīpt.Echo
Wscrīpt.Echo "Network printer mappings:"
For i = 0 to oPrinters.Count - 1 Step 2
Wscrīpt.Echo "Port " & oPrinters.Item(i) & " = " & oPrinters.Item(i+1)
Next -
QTP获取内存占有量
2008-01-10 20:24:57
On Error Resume Next
strComputer = "localhost"
Set ōbjWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_PerfRawData_PerfOS_Memory",,48)
For Each objItem in colItems
msgbox objItem.AvailableBytes
Next
Set ōbjWMIService = Nothing
Set colItems = Nothing -
VBS的常用函数
2008-01-10 19:28:12
Abs(number) 取得数值的绝对值。
Asc(String) 取得字符串表达式的第一个字符ASCII 码。
Atn(number) 取得一个角度的反正切值。
CallByName (object, procname, usecalltype,[args()]) 执行一个对象的方法、设定或传回对象的属性。
CBool(expression) 转换表达式为Boolean 型态。
CByte(expression) 转换表达式为Byte 型态。
CChar(expression) 转换表达式为字符型态。
CDate(expression) 转换表达式为Date 型态。
CDbl(expression) 转换表达式为Double 型态。
CDec(expression) 转换表达式为Decimal 型态。
CInt(expression) 转换表达式为Integer 型态。
CLng(expression) 转换表达式为Long 型态。
CObj(expression) 转换表达式为Object 型态。
CShort(expression) 转换表达式为Short 型态。
CSng(expression) 转换表达式为Single 型态。
CStr(expression) 转换表达式为String 型态。
Choose (index, choice-1[, choice-2, ... [, choice-n]]) 以索引值来选择并传回所设定的参数。
Chr(charcode) 以ASCII 码来取得字符内容。
Close(filenumberlist) 结束使用Open 开启的档案。
Cos(number) 取得一个角度的余弦值。
Ctype(expression, typename) 转换表达式的型态。
DateAdd(dateinterval, number, datetime) 对日期或时间作加减。
DateDiff(dateinterval, date1, date2) 计算两个日期或时间间的差值。
DatePart (dateinterval, date) 依接收的日期或时间参数传回年、月、日或时间。
DateSerial(year, month, day) 将接收的参数合并为一个只有日期的Date 型态的数据。
DateValue(datetime) 取得符合国别设定样式的日期值,并包含时间。
Day(datetime) 依接收的日期参数传回日。
Eof(filenumber) 当抵达一个被开启的档案结尾时会传回True。
Exp(number) 依接收的参数传回e 的次方值。
FileDateTime(pathname) 传回档案建立时的日期、时间。
FileLen(pathname) 传回档案的长度,单位是Byte。
Filter(sourcearray, match[, include[, compare]]) 搜寻字符串数组中的指定字符串,凡是数组元素中含有指定字符串,会将它们结合成新的字符串数组并传回。若是要传回不含指定字符串的数组元素,则 include 参数设为False。compare 参数则是设定搜寻时是否区分大小写,此时只要给TextCompare 常数或1 即可。
Fix(number) 去掉参数的小数部分并传回。
Format(expression[, style[, firstdayofweek[, firstweekofyear]]]) 将日期、时间和数值资料转为每个国家都可以接受的格式。
FormatCurrency(expression[,numdigitsafterdecimal [,includeleadingdigit]]) 将数值输出为金额型态。numdigitsafterdecimal 参数为小数字数,includeleadingdigit 参数为当整数为0 时是否补至整数字数。
FormatDateTime(date[,namedformat]) 传回格式化的日期或时间数据。
FormatNumber(expression[,numdigitsafterdecimal [,includeleadingdigit]]) 传回格式化的数值数据。Numdigitsafterdecimal 参数为小数字数,includeleadingdigit 参数为当整数为0 时是否补至整数字数。
FormatPercent(expression[,numdigitsafterdecimal [,includeleadingdigit]]) 传回转换为百分比格式的数值数据。numdigitsafterdecimal 参数为小数字数,includeleadingdigit 参数为当整数为0 时是否补至整数字数。
GetAttr(filename) 传回档案或目录的属性值。
Hex(number) 将数值参数转换为16 进制值。
Hour(time) 传回时间的小时字段,型态是Integer。
Iif(expression, truepart, falsepart) 当表达式的传回值为True 时执行truepart 字段的程序,反之则执行falsepart 字段。
InStr([start, ]string1, string2) 搜寻string2 参数设定的字符出现在字符串的第几个字符,start 为由第几个字符开始寻找,string1 为欲搜寻的字符串,string2 为欲搜寻的字符。
Int(number) 传回小于或等于接收参数的最大整数值。
IsArray(varname) 判断一个变量是否为数组型态,若为数组则传回True,反之则为False。
IsDate(expression) 判断表达式内容是否为DateTime 型态,若是则传回True,反之则为False。
IsDbNull(expression) 判断表达式内容是否为Null,若是则传回True,反之则为False。
IsNumeric(expression) 判断表达式内容是否为数值型态,若是则传回True,反之则为False。
Join(sourcearray[, delimiter]) 将字符串数组合并唯一个字符串,delimiter 参数是设定在各个元素间加入新的字符串。
Lcase(string) 将字符串转换为小写字体。
Left(string, length) 由字符串左边开始取得length 参数设定长度的字符。
Len(string) 取得字符串的长度。
Log(number) 取得数值的自然对数。
Ltrim(string) 去掉字符串的左边空白部分。
Mid(string, start[, length]) 取出字符串中strat 参数设定的字符后length 长度的字符串,若length 参数没有设定,则取回start 以后全部的字符。
Minute(time) 取得时间内容的分部分,型态为Integer。
MkDir(path) 建立一个新的目录。
Month(date) 取得日期的月部分,型态为Integer。
MonthName(month) 依接收的月份数值取得该月份的完整写法。
Now() 取得目前的日期和时间。
Oct(number) 将数值参数转换为8 进制值。
Replace(expression, find, replace) 将字符串中find 参数指定的字符串转换为replace 参数指定的字符串。
Right(string,length) 由字符串右边开始取得length 参数设定长度的字符。
RmDir(path) 移除一个空的目录。
Rnd() 取得介于0 到1 之间的小数,如果每次都要取得不同的值,使用前需加上Randomize 叙述。
Rtrim(string) 去掉字符串的右边空白部分。
Second(time) 取得时间内容的秒部分,型态为Integer。
Sign(number) 取得数值内容是正数或负数,正数传回1,负数传回-1,0 传回0。
Sin(number) 取得一个角度的正弦值。
Space(number) 取得number 参数设定的空白字符串。
Split(expression[, delimiter]) 以delimiter 参数设定的条件字符Abs 函数:返回数的绝对值。
Array函数:返回含有数组的变体。
Asc 函数:返回字符串首字母的 ANSI 字符码。
Atn 函数:返回数值的反正切。
CBool函数:返回已被转换为 Boolean 子类型的变体的表达式。
CByte函数:返回已被转换为字节子类型的变体的表达式。
CCur 函数:返回已被转换为货币子类型的变体的表达式。
CDate函数:返回已被转换为日期子类型的变体的表达式。
CDbl函数:返回已被转换为双精度子类型的变体的表达式。
Chr 函数:返回与指定的 ANSI 字符码相关的字符。
CInt 函数:返回已被转换为整形子类型的变体的表达式。
CLng 函数;返回已被转换为Long子类型的变体的表达式。
Cos 函数:返回角度的余弦。 C
reateObject函数:创建并返回对“自动”对象的引用。
CSng函数:返回已被转换为单精度子类型的变体的表达式。
CStr函数:返回已被转换为字符串子类型的变体的表达式。
Date函数:返回当前系统日期。
DateAdd 函数:返回的日期已经加上了指定的时间间隔。
DateDiff 函数:返回两个日期之间的间隔。
DatePart 函数:返回给定日期的指定部分。
DateSerial函数:返回指定年月日的日期子类型的变体。
DateValue 函数:返回日期子类型的变体。
Day 函数:返回日期,取值范围为 1 至 31。
Eval 函数:计算表达式并返回结果。
Exp 函数:返回 e (自然对数的底) 的多少次方。
Filter函数:根据指定的筛选条件,返回含有字符串数组子集的、下限为 0 的数组。
Fix 函数:返回数的整数部分。
FormatCurrency 函数:返回的表达式为货币值格式,其货币符号采用系统控制面板中定义的。
FormatDateTime 函数:返回的表达式为日期和时间格式。
FormatNumber 函数:返回的表达式为数字格式。
FormatPercent 函数:返回的表达式为百分数(乘以 100)格式,后面有 % 符号。
GetObject 函数:返回从文件对“自动”对象的引用。
GetRef 函数:返回对能够绑定到一事件的过程的引用。
Hex 函数:返回一字符串,代表一个数的十六进制值。
Hour函数:返回表示钟点的数字,取值范围为 0 至 23。
InputBox函数:在对话框中显式一提示,等待用户输入文本或单击按钮,并返回文本框的内容。
InStr函数:返回一个字符串在另一个字符串中首次出现的位置。
InStrRev函数;返回一个字符串在另一个字符串中出现的位置,但是从字符串的尾部算起。 -
VBS启动QTP并自动运行测试脚本
2008-01-10 16:11:05
VBS启动QTP并自动运行:
Set qtApp = CreateObject("QuickTest.Application")
qtApp.Launch
qtApp.Visible = True
qtApp.Open "C:\Test1"
qtApp.Test.Run -
wsh键值表
2007-12-29 16:14:18
wsh键值表
键 参数
退格键 {BACKSPACE}、{BS}或{BKSP}
BREAK {BREAK}
CAPS LOCK {CAPSLOCK}
DEL或DELETE{DELETE}或{DEL}
下箭头 {DOWN}
END {END}
ENTER {ENTER}或~
ESC {ESC}
HOME {HOME}
INS或INSERT{INSERT}或{INS}
左箭头 {LEFT}
NUM LOCK {NUMLOCK}
PAGE DOWN {PGDN}
PAGE UP {PGUP}
PRINT SCREEN{PRTSC}
右箭头 {RIGHT}
SCROLL LOCK{SCROLLLOCK}
TAB {TAB}
上箭头 {UP}
F1、F2、F3...{F1}、{F2}、{F3}Q