标签:des style blog http color 使用 os io
要想使用QTP进行自动化测试,必须了解VBScript这门语言,对于使用过ASP或VB开发的人来说,VBScript已经再熟悉不过了,但是没有接触过VBScript的同学也不要灰心,因为这门语言简单易学。
1. VBScript利器
2. Hello World
3. 数据类型
4. 变量
5. 常数
6. 运算符
1. VBScript利器
子曰:工欲善其事,必先利其器。学习一门语言自然是离不开工具及文档,有好的工具及文档在手,学习起来也会得心应手。在此,我推荐大家一个很不错的编辑工具——VbsEdit,该工具既能编辑代码,又可调试代码,有不错的智能提示,还有很多示例代码。可惜不是免费使用,不过网上已经有绿色版,您可以搜索下载。若你已经安装了QTP,那么使用QTP工具也是一个不错的选择。参考文档可以使用在线版《Microsoft
Windows脚本技术》,也可以从网上搜索下载CHM文件。
2. Hello World
每种语言的入门都是一样,从简单的Hello World开始,我们也不例外。如何使用VBScript来弹出一个对话框显示Hello World问候语呢?很简单,代码如下:
-
MsgBox("Hello world!")
-
MsgBox "Hello world!"
-
result = MsgBox("Hello World!", vbOKOnly, "Greeting")
-
MsgBox "Hello World!", vbOKOnly, "Greeting"
既然在此出现的第一个函数是MsgBox,那么就简单介绍一下该函数,其签名如下:
-
MsgBox(prompt[, buttons][, title][, helpfile, context])
主要参数:
- prompt:为要显示的消息,其他带[]参数为可选参数;
- buttons:为显示对话框按钮及类型,默认值为0,即只显示“确定”按钮;
- title:为对话框标题栏文字。
MsgBox函数也有返回值,当你点击确定或取消按钮时,其返回的值是不一样的。其他详细内容,大家可以去查阅参考文档,这里就不逐一说明。
3. 数据类型
VBScript只有一种数据类型——Variant,它是根据上下文来判断是数字还是字符串。因为Variant是VBScript中唯一的数据类型,所以它也是VBScript中所有函数的返回值的数据类型。为了进一步区分数据类型,它包含如下数据子类型:
子类型 |
描述 |
Empty |
未初始化的Variant。对于数值变量,值为0;对于字符串变量,值为零长度字符串 ("")。 |
Null |
不包含任何有效数据的Variant。 |
Boolean |
包含True或False。 |
Byte |
包含0到255之间的整数。 |
Integer |
包含-32,768到32,767之间的整数。 |
Currency |
-922,337,203,685,477.5808到922,337,203,685,477.5807。 |
Long |
包含-2,147,483,648到2,147,483,647之间的整数。 |
Single |
包含单精度浮点数,负数范围从-3.402823E38到-1.401298E-45,正数范围从1.401298E-45到3.402823E38。 |
Double |
包含双精度浮点数,负数范围从-1.79769313486232E308到-4.94065645841247E-324,正数范围从4.94065645841247E-324到1.79769313486232E308。 |
Date (Time) |
包含表示日期的数字,日期范围从公元100年1月1日到公元9999年12月31日。 |
String |
包含变长字符串,最大长度可为20亿个字符。 |
Object |
包含对象。 |
Error |
包含错误号。 |
您可以使用转换函数(CInt,CStr等等)来转换数据的子类型。另外,可使用VarType函数返回数据的Variant子类型。
4. 变量
4.1. 变量声明
变量声明有两种方式——显式与隐式,显式使用Dim、Public、Private语句进行声明,隐式直接使用变量名。使用隐式声明方式的习惯不好,因为这样有时会由于变量名拼错而导致程序运行出现意外,因此,最好在每个脚本开始第一行使用Option Explicit语句强制显式声明所有变量。声明示例如下:
-
Option Explicit
-
Dim i, conn
-
Public UserName, Password
-
Private m_id
注意:在VBScript中,变量名是不区分大小写,即userName与UserName是指同一个变量。
4.2. 命名规则
VBScript中变量命名是有其规则标准的,变量命名必须遵循:
- 第一个字符必须是字母。
- 不能包含嵌入的句点。
- 长度不能超过255个字符。
- 在被声明的作用域内必须唯一。
4.3. 作用域与存活期
变量的作用域由声明它的位置所决定。如果在过程中声明的,则只有该过程可以使用,即过程级变量;如果在过程之外声明的,则该变量可以被脚本中所有过程所使用,即Script级变量。
变量所存在的时间为存活期。Script级变量的存活期为从被声明开始,直到脚本运行结束为止;过程级变量的存活期仅是过程被调用执行开始到结束的时间。不同的过程可以使用相同的变量名,因为局部变量只有声明它的过程才能识别。
4.4. 变量赋值
给变量赋值很简单,使用等号进行赋值,等号左边为变量名,右边为变量值。若该变量是对象引用级别的,则需使用Set语句。示例代码如下:
-
Dim i, conn, ui
-
i = 0
-
Set conn = CreateObject("ADODB.Connection")
-
Set ui = New UserInfo
4.5. 标量与数组
只包含一个值的变量成为标量变量;有时候为了方便将一组相关值赋给一个变量,则成为数组变量。区别标量与数组的唯一方式是声明时数组变量名后面带有括号()。变量声明就不说了,前面已经提到,这里我们看看怎样声明一维数组及多维数组(最大60维——:)只要您能够理解)。
-
Dim a(9), table(2, 3)
-
a(0) = 1
-
...
-
a(9) = 11
-
MsgBox(a(1))
-
-
table(0, 0) = 1
-
...
-
table(2, 3) = 10
我们也可以声明动态数组(在运行脚本时大小发生变化的数组),使用Dim或ReDim语句,但括号中不包含任何数字。要使用动态数组,必须随后使用ReDim确定维数和每一维的大小。若同时使用Preserve关键字,则在重新调整大小时保留数组的内容。
-
Dim count, a()
-
count = 9
-
ReDim a(count)
-
ReDim Preserve a(10)
5. 常数
常数在VBScript中是表示不变的值,用于代替数字或字符串。其内部定义了许多常数,都是以vb开头,例如在Hello World程序中涉及到的MsgBox常数“vbOKOnly”。除了MsgBox常数外,还有颜色常数、比较常数、日期和时间常数等等,详见参考文档。
内部自带常数,我们可以直接使用。当自带常数不能满足我们的需求时,我们也可以自定义常数,在VBScript中是使用Const语句来定义常数,该语句的签名如下:
-
[Public | Private] Const constname = expression
主要参数:
- constname:为常数名称,为了区分常数与变量,最好有一套自己的命名规则,这里推荐字母全大写,单词间用下划线分割;
- expression:文字或其他常数,或包括除 Is 外的所有算术运算符和逻辑运算符的任意组合。
常数默认是Public级别,您也可以指定为Private级别,在同一行中声明多个常数需要用逗号分割,常数声明中不能使用变量、自定义函数及内部函数。下面是常数的一些示例代码:
-
Const PI = 3.14
-
Private Const STEP_APPLY = "Apply"
-
Const STEP_APPLY = "Apply", PI = 3.14
6. 运算符
VBScript有一套完整的运算符,包括算术运算符、比较运算符、连接运算符和逻辑运算符。当表达式中含有多个运算符时,它们的运算优先级是:算术运算符 > 比较运算符 > 逻辑运算符。所有比较运算符的优先级相同,算术运算符和逻辑运算符的优先级如下所示:
6.1. 算术运算符
描述 |
符号 |
求幂 |
^ |
负号 |
- |
乘 |
* |
除 |
/ |
整除 |
\ |
求余 |
Mod |
加 |
+ |
减 |
- |
字符串连接 |
& |
字符串连接 (&) 运算符不是算术运算符,但是在优先级顺序中,它排在所有算术运算符之后和所有比较运算符之前。
6.2. 逻辑运算符
描述 |
符号 |
逻辑非 |
Not |
逻辑与 |
And |
逻辑或 |
Or |
逻辑异或 |
Xor |
逻辑等价 |
Eqv |
逻辑隐含 |
Imp |
6.3. 比较运算符
描述 |
符号 |
等于 |
= |
不等于 |
<> |
小于 |
< |
大于 |
> |
小于等于 |
<= |
大于等于 |
>= |
对象引用比较 |
Is |
Is 运算符是对象引用比较运算符。它并不比较对象或对象的值,而只是进行检查,判断两个对象引用是否引用同一个对象。
7. 条件语句
VBScript中可以使用以下条件语句:
- If…Then…Else语句
- Select Case语句
7.1. If…Then…Else语句
If…Then…Else语句结构如下:
-
If condition Then statements [Else elsestatements]
或者使用块形式
-
If condition Then
-
[statements]
-
[ElseIf condition-n Then
-
[elseifstatements]] . . .
-
[Else
-
[elsestatements]]
-
End If
主要参数:
- condition:为一个(多个)数值或字符串表达式,其运算结果为True或False,若condition为Null,则被视为False。
- statements:为condition等于True时执行的一条或多条(以冒号分开)语句。
对于短小简单的测试,可以使用单行形式(第一种语法),但块形式(第二种语法)提供了比单行形式更强的结构化与适应性,比较容易阅读、维护及调试。
-
-
-
Dim myDate
-
myDate = #2011-9-8#
-
If myDate < Now Then myDate = Now
-
-
If i = 100 Then
-
c = True
-
i = 0
-
End If
-
-
-
If user.UserName = "admin" Then
-
showAdminPage = True
-
Else
-
showAdminPage = False
-
End If
-
-
-
If value = 0 Then
-
MsgBox(0)
-
ElseIf value = 1 Then
-
MsgBox(9999)
-
Else
-
MsgBox("输入不合法!")
-
End If
7.2. Select Case语句
语法结构如下:
-
Select Case testexpression
-
[Case expressionlist-n
-
[statements-n]] . . .
-
[Case Else expressionlist-n
-
[elsestatements-n]]
-
End Select
主要参数:
- testexpression:任意数值或字符串表达式。
- statements:当testexpression与expressionlist-n中的任意部分匹配时,执行的一条或多条语句。
Select Case结构提供了If...Then...ElseIf结构的另一个变通形式,功能与If...Then...ElseIf类似,但可以使代码更加简练易读,它与Case语句关联使用。
-
Dim value : value = 5
-
Select Case value
-
Case 0:
-
MsgBox(0)
-
Case 1:
-
MsgBox(9999)
-
Case Else
-
MsgBox("输入不合法!")
-
End Select
8. 循环语句
VBScript中可以使用以下循环语句:
- Do...Loop语句
- While...Wend语句
- For...Next语句
- For Each...Next语句
8.1. Do…Loop语句
当(或直到)条件为True时循环,语法结构如下:
当条件为True时重复执行某语句块。
-
Do [{While | Until} condition]
-
[statements]
-
[Exit Do]
-
[statements]
-
Loop
当条件变为True之前重复执行某语句块。
-
Do
-
[statements]
-
[Exit Do]
-
[statements]
-
Loop [{While | Until} condition]
主要参数:
- condition:数值或字符串表达式,其值为True或False。如果condition为Null,则condition被当作False。
- statements:当condition为True时被重复执行的一条或多条命令。
Exit Do可以退出循环体,循环可以嵌套使用。
-
Do Until response = vbNo
-
myNum = Int(6 * Rnd + 1)
-
response = MsgBox(myNum & "想要另一个数吗?", vbYesNo)
-
Loop
-
-
Dim check, counter
-
check = True : counter = 0
-
Do
-
Do While count < 20
-
counter = counter + 1
-
If counter = 10 Then
-
check = false
-
Exit Do
-
End If
-
Loop
-
Loop Until Not check
8.2. While…Wend语句
当条件为True时循环,语法结构如下:
-
While condition
-
[statements]
-
Wend
主要参数:
- condition:数值或字符串表达式,其值为True或False。如果condition为Null,则condition被当作False。
- statements:当condition为True时被重复执行的一条或多条命令。
While…Wend没有Exit语句,从头一直循环到尾,若要在中途退出,则需用Do…Loop语句。
8.3. For…Next语句
指定循环次数,使用计数器重复运行语句,语法结构如下:
-
For counter = start To end [Step step]
-
[statements]
-
[Exit For]
-
[statements]
-
Next
主要参数:
- counter:用做循环计数器的数值变量。这个变量不能是数组元素或用户自定义类型的元素。
- start:counter的初值。
- end:counter的终值。
- step:counter的步长。如果没有指定,则step的默认值为1。
8.4. For Each…Next语句
对于集合中的每项或数组中的每个元素,重复执行一组语句,语法结构如下:
-
For Each element In group
-
[statements]
-
[Exit For]
-
[statements]
-
Next [element]
主要参数:
- element:用来枚举集合或数组中所有元素的变量。对于集合,element可能是Variant变量、通用Object变量或任意指定的Automation对象变量。对于数组,element只能是Variant变量。
- group:对象集合或数组的名称。
9. 过程
在VBScript中,过程被分为两类:Sub过程和Function过程。
9.1 Sub过程
语法结构如下:
-
[Public [Default] | Private] Sub name [(arglist)]
-
[statements]
-
[Exit Sub]
-
[statements]
-
End Sub
主要参数:
- Public:表示Sub过程可被所有脚本中的所有其他过程访问。
- Default:只与Class块中的Public关键字连用,用来表示Sub过程是类的默认方法。如果在类中指定了不止一个Default过程,就会出错。
- Private:表示Sub过程只可被声明该过程的脚本中的其他过程访问。
- name:Sub的名称,遵循标准变量命名规则。
- arglist:代表在调用时要传递给Sub过程的参数的变量列表。用逗号隔开多个变量。其语法为:[ByVal | ByRef] varname[()],ByVal表示该参数是按值传递的,ByRef表示该参数按引用传递,varname代表参数的变量名称。
如没有显式地指定使用Public或Private,则Sub过程默认为Public。调用Sub过程时,只需输入过程名及所有参数值,参数值之间使用逗号分隔。不需使用Call语句,但如果使用了此语句,则必须将所有参数包含在括号之中。调用Sub过程的两种方式。一种使用Call语句;另一种则不使用。两种方式效果相同,如:Call MySub(a, b)或MySub a, b。
9.2 Function过程
语法结构如下:
-
[Public [Default]| Private] Function name [(arglist)]
-
[statements]
-
[name = expression]
-
[Exit Function]
-
[statements]
-
[name = expression]
-
End Function
主要参数:
- Public:表示Function过程可被所有脚本中的所有其他过程访问。
- Default:只与Class块中的Public关键字连用,用来表示Function过程是类的默认方法。如果在类中指定了不止一个Default过程,就会出错。
- Private:表示Function过程只可被声明该过程的脚本中的其他过程访问。
- name:Function的名称,遵循标准变量命名规则。
- arglist:代表在调用时要传递给Function过程的参数的变量列表。用逗号隔开多个变量。其语法为:[ByVal | ByRef] varname[()],ByVal表示该参数是按值传递的,ByRef表示该参数按引用传递,varname代表参数的变量名称。
如没有显式地指定使用Public或Private,则Function过程默认为Public。调用Function过程时,函数名必须用在变量赋值语句的右端或表达式中,如:b = MyFunction(a)。要从函数返回一个值,只需将值赋给函数名。在过程的任意位置都可以出现任意个这样的赋值。
9.3 Sub与Function的区别
- Sub没有返回值,而Function有返回值。
- Sub不能放在表达式中,而Function可以。
VBScript作为脚本语言不仅能够编写简单的脚本,而且还能够创建及使用对象编写复杂的脚本,如Class对象,数据字典,操作文件夹及文件,错误处理,正则表达式等等。
1. Class对象
2. Dictionary对象
3. FileSystemObject对象
4. Err对象
5. RegExp对象
1. Class对象
使用Class语句可以创建一个对象,可以为它编写字段、属性及方法,它只有两个对象事件——Initialize与Terminate。首先来看一个简单的Class示例:
-
Class User
-
-
Private m_UserName
-
Private m_Profile
-
-
-
Private Sub Class_Initialize
-
m_UserName = Empty
-
End Sub
-
-
-
Private Sub Class_Terminate
-
Set m_Profile = Nothing
-
End Sub
-
-
-
Public Default Property Get UserName
-
UserName = m_UserName
-
End Property
-
-
Public Property Let UserName(newUserName)
-
m_UserName = newUserName
-
End Property
-
-
Public Property Get Profile
-
Set Profile = m_Profile
-
End Property
-
-
Public Property Set Profile(newProfile)
-
Set m_Profile = newProfile
-
End Property
-
-
-
Public Function ToString()
-
ToString = "Hello! " & Me.UserName
-
End Function
-
End Class
用VBScript创建的对象并不是真正的面向对象,它不能继承和实现多态,但是在QTP对象模型Utility中,提供了一个RegisterUserFunc方法可以覆写对象的方法,但这也不是真正意义上的面向对象。Class及其成员如何创建,上面已经简单介绍过,若要对其中的一些语句进一步了解,还需要去仔细阅读一些参考文档。下面我们来看看如何调用对象,在《VBScript基础上》变量赋值中也已经提到过。
-
Dim u
-
Set u = New User
-
u.UserName = "known"
-
MsgBox u.ToString()
2. Dictionary对象
Dictionary是存储数据键和项目对的对象,其主要属性有Count、Item、Key,主要方法有Add、Exists、Items、Keys、Remove、RemoveAll。下面是该对象的一个综合示例:
-
-
Dim d
-
Set d = CreateObject("Scripting.Dictionary")
-
-
-
d.Add "a", "Known"
-
d.Add "b", "Christina"
-
d.Add "c", "test"
-
d.Add "d", "fuck"
-
Call ShowDictionary(d)
-
-
-
For i = 0 To d.Count - 1
-
If d.Exists("c") Then
-
d.Item("c") = "Test"
-
End If
-
Next
-
d.Remove("d")
-
Call ShowDictionary(d)
-
-
-
Sub ShowDictionary(dic)
-
Dim str, a
-
a = dic.Items
-
For i = 0 To dic.Count - 1
-
str = str & a(i) & vbCrlf
-
Next
-
MsgBox(str)
-
End Sub
3. FileSystemObject对象
FileSystemObject对象可以操作驱动器、文件夹及文件,其对象模型包含下面的对象和集合。
对象/集合 |
描述 |
FileSystemObject |
主对象。包含用来创建、删除和获得有关信息,以及通常用来操作驱动器、文件夹和文件的方法和属性。和该对象相关联的许多方法,与其他 FSO 对象中的方法完全相似;它们是为了方便才被提供的。 |
Drive |
对象。包含用来收集信息的方法和属性,这些信息是关于连接在系统上的驱动器的,如驱动器的共享名和它有多少可用空间。请注意,"drive" 并非必须是硬盘,也可以是 CD-ROM 驱动器,RAM 磁盘等等。并非必须把驱动器实物地连接到系统上;它也可以通过网络在逻辑上被连接起来。 |
Drives |
集合。提供驱动器的列表,这些驱动器实物地或在逻辑上与系统相连接。Drives 集合包括所有驱动器,与类型无关。要可移动的媒体驱动器在该集合中显现,不必把媒体插入到驱动器中。 |
File |
对象。包含用来创建、删除或移动文件的方法和属性。也用来向系统询问文件名、路径和多种其他属性。 |
Files |
集合。提供包含在文件夹内的所有文件的列表。 |
Folder |
对象。包含用来创建、删除或移动文件夹的方法和属性。也用来向系统询问文件夹名、路径和多种其他属性。 |
Folders |
集合。提供在 Folder 内的所有文件夹的列表。 |
TextStream |
对象。用来读写文本文件。 |
FileSystemObject对象所有属性、方法及对象和集合的详细说明,您可以查阅参考文档,因为内容比较多,我们就看一个简单的示例,直观地来了解一下该对象的使用,该示例是将一个文件复制到指定文件夹下。
-
-
Dim fso, filePath, folderPath
-
Set fso = CreateObject("Scripting.FileSystemObject")
-
filePath = "C:\\Test.txt"
-
folderPath = "D:\\Test"
-
Call MoveFile(filePath, folderPath)
-
-
-
Sub MoveFile(sourceFile, targetFolder)
-
Dim file, fileName
-
-
Set file = fso.GetFile(sourceFile)
-
-
If Not fso.FolderExists(targetFolder) Then
-
fso.CreateFolder(targetFolder)
-
End If
-
-
file.Move(targetFolder & "\\" & file.Name)
-
End Sub
4. Err对象
Err对象是一个具有全局范围的内部对象,不必在代码中创建它的实例,含有关于运行时错误的信息。主要属性有Description、HelpContext、HelpFile、Number、Source,主要方法有Clear、Raise,其属性及方法的详细说明详见参考文档。下面的示例说明了Err对象的用法:
-
-
On Error Resume Next
-
Err.Raise 6
-
MsgBox("Error #" & CStr(Err.Number) & " " & Err.Description)
-
Err.Clear
-
-
-
-
Dim conn
-
Set conn = CreateObject("ADODB.Connection")
-
conn.BeginTrans
-
-
...
-
-
-
On Error Resume Next
-
If conn.Errors.Count > 0 Then
-
conn.RollbackTrans
-
Else
-
conn.CommitTrans
-
End If
-
Err.Clear
5. RegExp对象
RegExp是正则表达式对象,提供简单的正则表达式支持功能。主要属性有Global、IgnoreCase、Pattern,主要方法有Execute、Replace、Test,其属性及方法的详细说明详见参考文档。下面的示例说明了RegExp对象的用法:
-
Function RegExpTest(patrn, strng)
-
Dim regEx, match, matches
-
Set regEx = New RegExp
-
regEx.Pattern = patrn
-
regEx.IgnoreCase = True
-
regEx.Global = True
-
Set matches = regEx.Execute(strng)
-
For Each match in matches
-
retStr = retStr & "Match found at position "
-
retStr = retStr & match.FirstIndex & ". Match Value is ‘"
-
retStr = retStr & match.Value & "‘." & vbCRLF
-
Next
-
RegExpTest = retStr
-
End Function
-
-
MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))
每当使用C#中的Array.ForEach时,感觉很爽。最近在做QTP自动化测试时,偶然在QTP自带示例中看到一段代码可以动态调用方法,于是先喜若狂,着手改编了一下,写了一个VBScript版的Array.ForEach功能,使用起来确实不错。其实关键的一个地方就在于使用了VBScript中的Eval函数。首先我们来看看Eval函数的作用。
1. Eval函数
Eval函数主要是计算一个表达式的值并返回结果。其签名如下:
-
[result = ]Eval(expression)
参数如下:
- result:可选项。是一个变量,用于接受返回的结果。如果未指定结果,应考虑使用Execute语句代替。
- expression:必选项。可以是包含任何有效VBScript表达式的字符串。
在VBScript中,x = y可以有两种解释。第一种方式是赋值语句,将y的值赋予x。第二种解释是测试x和y是否相等。如果相等,result为True;否则result为False。Eval方法总是采用第二种解释,而Execute语句总是采用第一种。下面是Eval函数的简单示例:
-
Dim a, b
-
a = 1
-
b = 2
-
MsgBox Eval("a + b")
2. Excute语句
执行一个或多个指定的语句。其签名如下:
所需要的statements参数是一个字符串表达式,其中包含一个或多个要执行的语句。如果要在statements参数中包含多条语句,应使用冒号或嵌入的分行将其分隔开。下面是Execute语句的简单示例:
-
Dim a, b, c, d
-
a = 1
-
b = 2
-
Execute "c = a + b : d = a + c"
-
MsgBox c
-
MsgBox d
3. 自定义ForEach函数
ForEach函数有两个参数,一个是数组变量,一个是遍历方法名称。其实现代码如下:
-
Sub ForEach(source, method)
-
Dim i, current
-
For i = 0 To UBound(source)
-
If IsObject(source(i)) Then
-
Set current = source(i)
-
Else
-
current = source(i)
-
End If
-
Eval(method & "(current)")
-
Next
-
End Sub
遍历一个整数数组的示例:
-
-
Function ShowValue(val)
-
MsgBox val
-
End Function
-
-
Dim i, arr(10)
-
-
For i = 0 To 10
-
arr(i) = i
-
Next
-
-
Call ForEach(arr, "ShowValue")
遍历一个对象数组的示例:
-
-
Class User
-
-
Public UserName, Email
-
-
-
Function ToString()
-
ToString = Me.UserName & " : " & Me.Email
-
End Function
-
End Class
-
-
-
Function ShowUser(usr)
-
MsgBox usr.ToString()
-
End Function
-
-
Dim arr(5), u
-
-
For i = 0 To 5
-
Set u = New User
-
u.UserName = "user" & CStr(i)
-
u.Email = "user" & CStr(i) & "@xxx.com"
-
Set arr(i) = u
-
Next
-
-
Call ForEach(arr, "ShowUser")
看代码很简洁,不是嘛,原来VBScript也可以像C#一样使用ForEach。VBScript应该还能够实现C#中的其他很多特性,以后在编写测试代码过程中,要不断去总结。
QTP自动化测试之VBScript基础
标签:des style blog http color 使用 os io
原文地址:http://blog.csdn.net/libin_1/article/details/38563851