QTP自动化测试之VBScript基础

  1. 云栖社区>
  2. 博客>
  3. 正文

QTP自动化测试之VBScript基础

cometwo123 2014-08-14 20:50:00 浏览960
展开阅读全文

要想使用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问候语呢?很简单,代码如下:

  1. MsgBox("Hello world!")  
  2. MsgBox "Hello world!"  
  3. result = MsgBox("Hello World!", vbOKOnly, "Greeting")  
  4. MsgBox "Hello World!", vbOKOnly, "Greeting"  

既然在此出现的第一个函数是MsgBox,那么就简单介绍一下该函数,其签名如下:

  1. 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语句强制显式声明所有变量。声明示例如下:

  1. Option Explicit  
  2. Dim i, conn   '声明多个变量时用逗号隔开  
  3. Public UserName, Password  
  4. Private m_id  

注意:在VBScript中,变量名是不区分大小写,即userName与UserName是指同一个变量。

4.2. 命名规则

VBScript中变量命名是有其规则标准的,变量命名必须遵循:

  • 第一个字符必须是字母。
  • 不能包含嵌入的句点。
  • 长度不能超过255个字符。
  • 在被声明的作用域内必须唯一。

4.3. 作用域与存活期

变量的作用域由声明它的位置所决定。如果在过程中声明的,则只有该过程可以使用,即过程级变量;如果在过程之外声明的,则该变量可以被脚本中所有过程所使用,即Script级变量。

变量所存在的时间为存活期。Script级变量的存活期为从被声明开始,直到脚本运行结束为止;过程级变量的存活期仅是过程被调用执行开始到结束的时间。不同的过程可以使用相同的变量名,因为局部变量只有声明它的过程才能识别。

4.4. 变量赋值

给变量赋值很简单,使用等号进行赋值,等号左边为变量名,右边为变量值。若该变量是对象引用级别的,则需使用Set语句。示例代码如下:

  1. Dim i, conn, ui  
  2. i = 0  
  3. Set conn = CreateObject("ADODB.Connection")  
  4. Set ui = New UserInfo  

4.5. 标量与数组

只包含一个值的变量成为标量变量;有时候为了方便将一组相关值赋给一个变量,则成为数组变量。区别标量与数组的唯一方式是声明时数组变量名后面带有括号()。变量声明就不说了,前面已经提到,这里我们看看怎样声明一维数组及多维数组(最大60维——:)只要您能够理解)。

  1. Dim a(9), table(2, 3)  
  2. a(0) = 1  
  3. ...  
  4. a(9) = 11  
  5. MsgBox(a(1))   '输出数组变量值  
  6.   
  7. table(0, 0) = 1  
  8. ...  
  9. table(2, 3) = 10  

我们也可以声明动态数组(在运行脚本时大小发生变化的数组),使用Dim或ReDim语句,但括号中不包含任何数字。要使用动态数组,必须随后使用ReDim确定维数和每一维的大小。若同时使用Preserve关键字,则在重新调整大小时保留数组的内容。

  1. Dim count, a()  
  2. count = 9  
  3. ReDim a(count)  
  4. ReDim Preserve a(10)  

5. 常数

常数在VBScript中是表示不变的值,用于代替数字或字符串。其内部定义了许多常数,都是以vb开头,例如在Hello World程序中涉及到的MsgBox常数“vbOKOnly”。除了MsgBox常数外,还有颜色常数、比较常数、日期和时间常数等等,详见参考文档。

内部自带常数,我们可以直接使用。当自带常数不能满足我们的需求时,我们也可以自定义常数,在VBScript中是使用Const语句来定义常数,该语句的签名如下:

  1. [Public | PrivateConst constname = expression  

主要参数:

  • constname:为常数名称,为了区分常数与变量,最好有一套自己的命名规则,这里推荐字母全大写,单词间用下划线分割;
  • expression:文字或其他常数,或包括除 Is 外的所有算术运算符和逻辑运算符的任意组合。

常数默认是Public级别,您也可以指定为Private级别,在同一行中声明多个常数需要用逗号分割,常数声明中不能使用变量、自定义函数及内部函数。下面是常数的一些示例代码:

  1. Const PI = 3.14   '常数默认为公有。  
  2. Private Const STEP_APPLY = "Apply"   '定义私有常数。  
  3. 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语句结构如下:

  1. If condition Then statements [Else elsestatements]  

或者使用块形式

  1. If condition Then  
  2.     [statements]  
  3. [ElseIf condition-n Then  
  4.     [elseifstatements]] . . .  
  5. [Else  
  6.     [elsestatements]]  
  7. End If  

主要参数:

  • condition:为一个(多个)数值或字符串表达式,其运算结果为True或False,若condition为Null,则被视为False。
  • statements:为condition等于True时执行的一条或多条(以冒号分开)语句。

对于短小简单的测试,可以使用单行形式(第一种语法),但块形式(第二种语法)提供了比单行形式更强的结构化与适应性,比较容易阅读、维护及调试。

  1. '1. 条件为True时  
  2. '单行形式  
  3. Dim myDate  
  4. myDate = #2011-9-8#   '日期时间字符串需用#括起来  
  5. If myDate < Now Then myDate = Now  
  6. '块形式  
  7. If i = 100 Then  
  8.     c = True  
  9.     i = 0  
  10. End If  
  11.   
  12. '2. 条件为True和False时  
  13. If user.UserName = "admin" Then  
  14.     showAdminPage = True  
  15. Else  
  16.     showAdminPage = False  
  17. End If  
  18.   
  19. '3. 对多个条件判断  
  20. If value = 0 Then  
  21.     MsgBox(0)  
  22. ElseIf value = 1 Then  
  23.     MsgBox(9999)  
  24. Else  
  25.     MsgBox("输入不合法!")  
  26. End If  

7.2. Select Case语句

语法结构如下:

  1. Select Case testexpression  
  2.     [Case expressionlist-n  
  3.         [statements-n]] . . .  
  4.     [Case Else expressionlist-n  
  5.         [elsestatements-n]]  
  6. End Select  

主要参数:

  • testexpression:任意数值或字符串表达式。
  • statements:当testexpression与expressionlist-n中的任意部分匹配时,执行的一条或多条语句。

Select Case结构提供了If...Then...ElseIf结构的另一个变通形式,功能与If...Then...ElseIf类似,但可以使代码更加简练易读,它与Case语句关联使用。

  1. Dim value : value = 5   '多条语句在一行,需用冒号分开  
  2. Select Case value  
  3.     Case 0:  
  4.         MsgBox(0)  
  5.     Case 1:  
  6.         MsgBox(9999)  
  7.     Case Else  
  8.         MsgBox("输入不合法!")  
  9. End Select  

8. 循环语句

VBScript中可以使用以下循环语句:

  • Do...Loop语句
  • While...Wend语句
  • For...Next语句
  • For Each...Next语句

8.1. Do…Loop语句

当(或直到)条件为True时循环,语法结构如下:

当条件为True时重复执行某语句块。

  1. Do [{While | Until} condition]  
  2.     [statements]  
  3.     [Exit Do]  
  4.     [statements]  
  5. Loop  

当条件变为True之前重复执行某语句块。

  1. Do  
  2.     [statements]  
  3.     [Exit Do]  
  4.     [statements]  
  5. Loop [{While | Until} condition]  

主要参数:

  • condition:数值或字符串表达式,其值为True或False。如果condition为Null,则condition被当作False。
  • statements:当condition为True时被重复执行的一条或多条命令。

Exit Do可以退出循环体,循环可以嵌套使用。

  1. Do Until response = vbNo  
  2.     myNum = Int(6 * Rnd + 1)   '产生1到6之间的随机数  
  3.     response = MsgBox(myNum & "想要另一个数吗?", vbYesNo)  
  4. Loop  
  5.   
  6. Dim check, counter  
  7. check = True : counter = 0  
  8. Do  
  9.     Do While count < 20  
  10.         counter = counter + 1  '增加计数器  
  11.         If counter = 10 Then  
  12.             check = false  
  13.             Exit Do   '终止内循环  
  14.         End If  
  15.     Loop  
  16. Loop Until Not check  

8.2. While…Wend语句

当条件为True时循环,语法结构如下:

  1. While condition  
  2.     [statements]  
  3. Wend  

主要参数:

  • condition:数值或字符串表达式,其值为True或False。如果condition为Null,则condition被当作False。
  • statements:当condition为True时被重复执行的一条或多条命令。

While…Wend没有Exit语句,从头一直循环到尾,若要在中途退出,则需用Do…Loop语句。

8.3. For…Next语句

指定循环次数,使用计数器重复运行语句,语法结构如下:

  1. For counter = start To end [Step step]  
  2.     [statements]  
  3.     [Exit For]  
  4.     [statements]  
  5. Next  

主要参数:

  • counter:用做循环计数器的数值变量。这个变量不能是数组元素或用户自定义类型的元素。
  • start:counter的初值。
  • end:counter的终值。
  • step:counter的步长。如果没有指定,则step的默认值为1。

8.4. For Each…Next语句

对于集合中的每项或数组中的每个元素,重复执行一组语句,语法结构如下:

  1. For Each element In group  
  2.     [statements]  
  3.     [Exit For]  
  4.     [statements]  
  5. Next [element]  

主要参数:

  • element:用来枚举集合或数组中所有元素的变量。对于集合,element可能是Variant变量、通用Object变量或任意指定的Automation对象变量。对于数组,element只能是Variant变量。
  • group:对象集合或数组的名称。

9. 过程

在VBScript中,过程被分为两类:Sub过程和Function过程。

9.1 Sub过程

语法结构如下:

  1. [Public [Default] | PrivateSub name [(arglist)]   
  2.     [statements]  
  3.     [Exit Sub]  
  4.     [statements]  
  5. 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过程

语法结构如下:

  1. [Public [Default]| PrivateFunction name [(arglist)]  
  2.     [statements]  
  3.     [name = expression]  
  4.     [Exit Function]   
  5.     [statements]  
  6.     [name = expression]  
  7. 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可以。

 

 

QTP自动化测试之VBScript对象

VBScript作为脚本语言不仅能够编写简单的脚本,而且还能够创建及使用对象编写复杂的脚本,如Class对象,数据字典,操作文件夹及文件,错误处理,正则表达式等等。

1. Class对象
2. Dictionary对象
3. FileSystemObject对象
4. Err对象
5. RegExp对象

1. Class对象

使用Class语句可以创建一个对象,可以为它编写字段、属性及方法,它只有两个对象事件——InitializeTerminate。首先来看一个简单的Class示例:

  1. Class User  
  2.     '私有字段,也可以使用Public语句定义公有字段  
  3.     Private m_UserName  
  4.     Private m_Profile  
  5.   
  6.     'Initialize事件相当于构造函数  
  7.     Private Sub Class_Initialize  
  8.         m_UserName = Empty   '设置UserName初始值为空字符串  
  9.     End Sub  
  10.   
  11.     'Terminate事件相当于析构函数  
  12.     Private Sub Class_Terminate  
  13.         Set m_Profile = Nothing   '将对象设置为Nothing,销毁对象  
  14.     End Sub  
  15.   
  16.     'Property Get语句,获取属性值或对象引用,Default只与Public一起使用,表示该属性为类的默认属性  
  17.     Public Default Property Get UserName  
  18.         UserName = m_UserName  
  19.     End Property  
  20.     'Property Let语句,设置属性值  
  21.     Public Property Let UserName(newUserName)  
  22.         m_UserName = newUserName  
  23.     End Property  
  24.   
  25.     Public Property Get Profile  
  26.         Set Profile = m_Profile  
  27.     End Property  
  28.     'Property Set语句,设置属性对象引用  
  29.     Public Property Set Profile(newProfile)  
  30.         Set m_Profile = newProfile  
  31.     End Property  
  32.   
  33.     'ToString方法  
  34.     Public Function ToString()  
  35.         ToString = "Hello! " & Me.UserName   'Me相当于C#中的this关键字  
  36.     End Function  
  37. End Class  

用VBScript创建的对象并不是真正的面向对象,它不能继承和实现多态,但是在QTP对象模型Utility中,提供了一个RegisterUserFunc方法可以覆写对象的方法,但这也不是真正意义上的面向对象。Class及其成员如何创建,上面已经简单介绍过,若要对其中的一些语句进一步了解,还需要去仔细阅读一些参考文档。下面我们来看看如何调用对象,在《VBScript基础上》变量赋值中也已经提到过。

  1. Dim u                  '定义对象变量名,注意变量名不能与类名相同,即使是大小写不同  
  2. Set u = New User       '创建对象用New语句  
  3. u.UserName = "known"   '给属性赋值  
  4. MsgBox u.ToString()    '调用方法  

2. Dictionary对象

Dictionary是存储数据键和项目对的对象,其主要属性有Count、Item、Key,主要方法有Add、Exists、Items、Keys、Remove、RemoveAll。下面是该对象的一个综合示例:

  1. '定义并创建Dictionary对象,使用CreateObject创建并返回自动化对象的引用  
  2. Dim d  
  3. Set d = CreateObject("Scripting.Dictionary")  
  4.   
  5. '向Dictionary对象中添加键值对  
  6. d.Add "a""Known"    'Add方法第一个参数是Key值,第二个是Item值  
  7. d.Add "b""Christina"  
  8. d.Add "c""test"  
  9. d.Add "d""fuck"  
  10. Call ShowDictionary(d)  
  11.   
  12. '遍历Dictionary对象,更改Item值  
  13. For i = 0 To d.Count - 1     'Count返回Dictionary对象中的项目数  
  14.     If d.Exists("c"Then    'Exists判断Dictionary对象中是否存在指定关键字  
  15.         d.Item("c") = "Test" 'Item返回Dictionary对象中指定Key的Item值  
  16.     End If  
  17. Next  
  18. d.Remove("d")  'Remove从Dictionary对象中删除一个关键字,项目对。  
  19. Call ShowDictionary(d)  
  20.   
  21. '输出Dictionary对象所有键值  
  22. Sub ShowDictionary(dic)  
  23.     Dim str, a  
  24.     a = dic.Items  'Items返回一个包含所有Item值的数组  
  25.     For i = 0 To dic.Count - 1  
  26.         str = str & a(i) & vbCrlf  
  27.     Next  
  28.     MsgBox(str)  
  29. End Sub  

3. FileSystemObject对象

FileSystemObject对象可以操作驱动器、文件夹及文件,其对象模型包含下面的对象和集合。

对象/集合 描述
FileSystemObject 主对象。包含用来创建、删除和获得有关信息,以及通常用来操作驱动器、文件夹和文件的方法和属性。和该对象相关联的许多方法,与其他 FSO 对象中的方法完全相似;它们是为了方便才被提供的。
Drive 对象。包含用来收集信息的方法和属性,这些信息是关于连接在系统上的驱动器的,如驱动器的共享名和它有多少可用空间。请注意,"drive" 并非必须是硬盘,也可以是 CD-ROM 驱动器,RAM 磁盘等等。并非必须把驱动器实物地连接到系统上;它也可以通过网络在逻辑上被连接起来。
Drives 集合。提供驱动器的列表,这些驱动器实物地或在逻辑上与系统相连接。Drives 集合包括所有驱动器,与类型无关。要可移动的媒体驱动器在该集合中显现,不必把媒体插入到驱动器中。
File 对象。包含用来创建、删除或移动文件的方法和属性。也用来向系统询问文件名、路径和多种其他属性。
Files 集合。提供包含在文件夹内的所有文件的列表。
Folder 对象。包含用来创建、删除或移动文件夹的方法和属性。也用来向系统询问文件夹名、路径和多种其他属性。
Folders 集合。提供在 Folder 内的所有文件夹的列表。
TextStream 对象。用来读写文本文件。

FileSystemObject对象所有属性、方法及对象和集合的详细说明,您可以查阅参考文档,因为内容比较多,我们就看一个简单的示例,直观地来了解一下该对象的使用,该示例是将一个文件复制到指定文件夹下。

  1. '定义并创建对象  
  2. Dim fso, filePath, folderPath  
  3. Set fso = CreateObject("Scripting.FileSystemObject")  
  4. filePath = "C:\\Test.txt"  
  5. folderPath = "D:\\Test"  
  6. Call MoveFile(filePath, folderPath)  
  7.   
  8. '将文件移动到指定文件夹  
  9. Sub MoveFile(sourceFile, targetFolder)  
  10.     Dim file, fileName  
  11.     '获取文件对象  
  12.     Set file = fso.GetFile(sourceFile)  
  13.     '判断目标文件夹是否存在  
  14.     If Not fso.FolderExists(targetFolder) Then  
  15.         fso.CreateFolder(targetFolder)  
  16.     End If  
  17.     '将文件移动到目标位置  
  18.     file.Move(targetFolder & "\\" & file.Name)  
  19. End Sub  

4. Err对象

Err对象是一个具有全局范围的内部对象,不必在代码中创建它的实例,含有关于运行时错误的信息。主要属性有Description、HelpContext、HelpFile、Number、Source,主要方法有Clear、Raise,其属性及方法的详细说明详见参考文档。下面的示例说明了Err对象的用法:

  1. '示例1:  
  2. On Error Resume Next  
  3. Err.Raise 6  '产生溢出错误  
  4. MsgBox("Error #" & CStr(Err.Number) & " " & Err.Description)  
  5. Err.Clear  
  6.   
  7. '示例2:  
  8. '定义数据库连接  
  9. Dim conn  
  10. Set conn = CreateObject("ADODB.Connection")  
  11. conn.BeginTrans  '开始事务  
  12.   
  13. ...  
  14.   
  15. '提交数据库事务错误处理  
  16. On Error Resume Next  
  17. If conn.Errors.Count > 0 Then  
  18.     conn.RollbackTrans  '回滚事务  
  19. Else  
  20.     conn.CommitTrans    '提交事务  
  21. End If  
  22. Err.Clear  

5. RegExp对象

RegExp是正则表达式对象,提供简单的正则表达式支持功能。主要属性有Global、IgnoreCase、Pattern,主要方法有Execute、Replace、Test,其属性及方法的详细说明详见参考文档。下面的示例说明了RegExp对象的用法:

  1. Function RegExpTest(patrn, strng)  
  2.     Dim regEx, match, matches            '建立变量。  
  3.     Set regEx = New RegExp               '建立正则表达式。  
  4.     regEx.Pattern = patrn                '设置模式。  
  5.     regEx.IgnoreCase = True              '设置是否区分字符大小写。  
  6.     regEx.Global = True                  '设置全局可用性。  
  7.     Set matches = regEx.Execute(strng)   '执行搜索。  
  8.     For Each match in matches            '遍历匹配集合。  
  9.         retStr = retStr & "Match found at position "  
  10.         retStr = retStr & match.FirstIndex & ". Match Value is '"  
  11.         retStr = retStr & match.Value & "'." & vbCRLF  
  12.     Next  
  13.     RegExpTest = retStr  
  14. End Function  
  15.   
  16. MsgBox(RegExpTest("is.""IS1 is2 IS3 is4"))  

 

VBScript之Eval函数与Execute语句(Array.ForEach的实现)

每当使用C#中的Array.ForEach时,感觉很爽。最近在做QTP自动化测试时,偶然在QTP自带示例中看到一段代码可以动态调用方法,于是先喜若狂,着手改编了一下,写了一个VBScript版的Array.ForEach功能,使用起来确实不错。其实关键的一个地方就在于使用了VBScript中的Eval函数。首先我们来看看Eval函数的作用。

1. Eval函数

Eval函数主要是计算一个表达式的值并返回结果。其签名如下:

  1. [result = ]Eval(expression)  

参数如下:

  • result:可选项。是一个变量,用于接受返回的结果。如果未指定结果,应考虑使用Execute语句代替。
  • expression:必选项。可以是包含任何有效VBScript表达式的字符串。

在VBScript中,x = y可以有两种解释。第一种方式是赋值语句,将y的值赋予x。第二种解释是测试x和y是否相等。如果相等,result为True;否则result为False。Eval方法总是采用第二种解释,而Execute语句总是采用第一种。下面是Eval函数的简单示例:

  1. Dim a, b  
  2. a = 1  
  3. b = 2  
  4. MsgBox Eval("a + b")  

2. Excute语句

执行一个或多个指定的语句。其签名如下:

  1. Execute statements  

所需要的statements参数是一个字符串表达式,其中包含一个或多个要执行的语句。如果要在statements参数中包含多条语句,应使用冒号或嵌入的分行将其分隔开。下面是Execute语句的简单示例:

  1. Dim a, b, c, d  
  2. a = 1  
  3. b = 2  
  4. Execute "c = a + b : d = a + c"  
  5. MsgBox c  
  6. MsgBox d  

3. 自定义ForEach函数

ForEach函数有两个参数,一个是数组变量,一个是遍历方法名称。其实现代码如下:

  1. Sub ForEach(source, method)  
  2.     Dim i, current  
  3.     For i = 0 To UBound(source)  
  4.         If IsObject(source(i)) Then '判断数组元素是否为对象  
  5.             Set current = source(i)  
  6.         Else  
  7.             current = source(i)  
  8.         End If  
  9.         Eval(method & "(current)"'调用遍历方法  
  10.     Next  
  11. End Sub   

遍历一个整数数组的示例:

  1. '显示数组元素方法  
  2. Function ShowValue(val)  
  3.     MsgBox val  
  4. End Function  
  5.   
  6. Dim i, arr(10)  
  7. '给数组元素赋值  
  8. For i = 0 To 10  
  9.     arr(i) = i  
  10. Next  
  11. '调用ForEach遍历  
  12. Call ForEach(arr, "ShowValue")  

遍历一个对象数组的示例:

  1. '用户类  
  2. Class User  
  3.     '用户属性  
  4.     Public UserName, Email  
  5.   
  6.     'ToString方法  
  7.     Function ToString()  
  8.         ToString = Me.UserName & " : " & Me.Email  
  9.     End Function  
  10. End Class  
  11.   
  12. '显示用户信息方法  
  13. Function ShowUser(usr)  
  14.     MsgBox usr.ToString()  
  15. End Function  
  16.   
  17. Dim arr(5), u  
  18. '给数组元素赋值  
  19. For i = 0 To 5  
  20.     Set u = New User  
  21.     u.UserName = "user" & CStr(i)  
  22.     u.Email    = "user" & CStr(i) & "@xxx.com"  
  23.     Set arr(i) = u  
  24. Next  
  25. '调用ForEach遍历  
  26. Call ForEach(arr, "ShowUser")  

看代码很简洁,不是嘛,原来VBScript也可以像C#一样使用ForEach。VBScript应该还能够实现C#中的其他很多特性,以后在编写测试代码过程中,要不断去总结。

网友评论

登录后评论
0/500
评论
cometwo123
+ 关注