作者:李唯新
WshShell对象常用方法介绍
阶段要点
● WshShell对象的简单介绍。
●
激活窗口AppActivate。
● 获取当前路径CurrentDirectory。
● 最常用的sendkeys发送。
●
注册表信息的操作。
WshShell对象介绍
这一节主要讲一下WSH对象的一些应用,在QTP项目实践中经常会遇到一些与Windows连接比较紧密的操作,这些操作如果使用QTP来完成可能并不是最佳的方案,甚至可能QTP就根本无法完成那么此时可以使用WSH对象来帮助解决此类问题,如最常见的就是读写注册表、运行(command)、发送键盘(sendkeys)等。以上这些操作步骤如果通过WshShell对象来操作即可以轻松完成。下面了解一下什么是WshShell对象。
1.Wscript对象:Windows Script Host object
model
首先了解Wscript根对象,简单地说,Wscript对象就是一个Windows脚本宿主对象模型,而Wscript是一个基于Windows脚本宿主对象的根对象。利用它可以创建两种COM对象:WshShell和WshNetWork。
2.WshShell(Wscript.Shell)
可以使用此对象访问Windows
Shell的一些应用,主要用于运行本地程序、操作注册表程序、创建快捷键、处理环境变量、发送键盘符等。
(1)实例:
'创建WshShell对象 Set WshShell = CreateObject("WScript.Shell") '运行notepad命令,启动记事本 WshShell.Run "notepad" '释放WshShell对象 Set WshShell = Nothing
分析:
脚本是利用WshShell对象运行Windows命令,启动记事本的操作。这里只是一个最简单的应用,下一节开始会重点讲解COM对象在自动化测试过程中的应用。
(2)WshNetWork
(Wscript.NetWork)。
可以使用此对象访问局域网环境下的共享资源,主要用于连接网络共享、网络打印机、访问局域网中用户的信息。
'创建WshNetWork对象 Set WshNetwork = CreateObject("WScript.Network") '打印计算机名 MsgBox WshNetwork.ComputerName '打印用户所在的域名 MsgBox wshnetwork.UserDomain '打印用户名 MsgBox wshnetwork.UserName
分析:
此处WshNetWork主要作用是,在局域网中获取用户的一些资源信息。这里就简单介绍一下。在自动化测试过程应用比较少,本节主要还是以WshShell的讲解为主。
激活窗口AppActivat
窗口的激活经常会在自动化测试过程中被使用到,特别是在需要同步等待测试对象时,有时页面需要一定的切换时间,往往很多新手会认为,加适当的等待时间即可解决此问题,其实这样的想法绝对是错误的,因为测试机本身可能会出现不稳定的情况,举个例子,当一台测试机运行时间比较长了,或者此测试机正在做可靠性测试需要执行上千次脚本,那么此时用wait是比较危险的,其关键原因是因为,任何时候切换页面的间隔时间都是不等的,如果wait时间设置短了,可能由于计算机运行的次数太多,内存积攒多导致切换时间超过了wait时间,而如果wait时间太长,会浪费太多的时间。不管哪种方式都不是一个非常可取的办法,如果加入循环等待页面切换直到切换成功,这样便可更好地提高代码的执行效率。因此,循环判断页面切换是否成功就成了关键,WshShell对象就提供了这样一个非常有用的功能。
● 语法:
object.AppActivate title
● 参数:
Title为需要激活窗口的title属性值,也就是标题或者是Process ID。
●
返回值:
布尔类型,如果当前窗口被激活,返回True,反之返回False。
实例:
完成一个打开记事本,循环判断其是否被激活,一旦窗口被激活成功之后即输入
字符串“zzxxbb112”。
'创建WSH对象 Set oWshShell = CreateObject("wscript.shell") '启动notepad记事本应用 oWshShell.Run "notepad" '循环等待记事本页面是否被激活,没有激活就一直循环直到激活为止 While Not oWshShell.AppActivate("无标题 - 记事本") : Wend '发送字符串zzxxbb112 oWshShell.SendKeys "zzxxbb112" '释放对象 Set oWshShell = Nothing
分析:
执行以上脚本后可以看到,脚本自动启动了记事本后,在记事本中输入了zzxxbb112字符串,看似非常简单,其实对于新手来说还是比较容易出错,如果此处没有“While
Not oWshShell.AppActivate(“无标题?-?记事本”) :
Wend”这一步骤,zzxxbb112可能就无法输入到被打开的记事本中去,接下来我们就仔细探究竟。
比较两个脚本的运行结果。
(1)脚本1:
Set oWshShell = CreateObject("wscript.shell") '启动notepad记事本应用 oWshShell.Run "notepad" '激活记事本窗口 oWshShell.AppActivate("无标题 - 记事本") '提示消息框 Msgbox “suc” '释放对象 Set oWshShell = Nothing
(2)脚本2:
'创建WSH对象 Set oWshShell = CreateObject("wscript.shell") '启动notepad记事本应用 oWshShell.Run "notepad" '循环等待记事本激活 While Not oWshShell.AppActivate("无标题 - 记事本") : Wend '提示消息框 Msgbox “suc” '释放对象 Set oWshShell = Nothing
图1:脚本1 执行结果
图2:脚本2
执行结果
分析:
这个例子非常经典,在对比了这两脚本执行结果之后应该很明显地看到,第一个是在窗口激活之前就弹出消息框了,由于记事本挡住了,因此这里看不出。虽然已经在脚本中加入了AppActivate方法来激活记事本窗口了,但是由于脚本执行速度比激活窗口快很多倍,因此脚本执行激活窗口时,往往是还没来得及等窗口激活,就已经执行了下一句弹出消息框脚本了,就会出现不想看到的局面。但脚本2就很好地避免了这样的问题,通过循环遍历了对象的激活状态,同步窗口的激活状态,一旦窗口激活后才弹出消息框,这样的做法是最安全的。可以在图3-43中明显地看到消息弹出框在记事本前面,很明显此处的消息弹出框是在记事本窗口激活后才弹出的。
获取当前路径CurrentDirectory
对于自动化测试脚本开发来说,相对路径也是一个比较常用的技术,不管是对于脚本移植,还是在自动化测试框架中都有着非常重要的意义。在WshShell中就有这样一个获取相对路径的方法,虽然知道在QTP中可以直接在folder里设置相对文件夹路径,但是本人认为,在一些特殊应用中,如在自己搭建框架时,或者需要使用脚本来获取相对路径时,再或者在纯VBS环境下等,这些都是QTP无法做到的。除此之外,利用WshShell也是非常方便的。(后续章节会讲解如何使用fso的getfile方法来获取文件的相对路径)
● 语法:
object.CurrentDirectory
● 参数:
无。
●
返回值:
布尔类型,如果当前窗口被激活,返回True,反之则返回False。
实例:实现相对路径。
首先建立一个文件夹,在文件夹下同级目录建立两个VBS,一个命名为main.vbs,另一个命名为msg.vbs,在msg.vbs中输入一个msgbox“zzxxbb112”并保存,如图所示。
接着在main.vbs中输入以下脚本:
'创建WshShell对象 Set wshShell = CreateObject("wscript.shell") '获取相对文件夹 RelativeFolder = wshShell.CurrentDirectory '拼装需要执行文件的相对路径 msgVbsPath = RelativeFolder + "\msg.vbs" '运行msg.Vbs wshShell.Run msgVbsPath '释放对象 Set WshShell = Nothing
分析:
此脚本首先是调用了currentDirectory方法,获取了当前执行VBS文件的父文件夹,接着拼接需要执行的vbs文件路径后,执行此msg.vbs文件。在完成了以上脚本后,其实就已经实现了路径参数化,也就是相对路径。可以直接复制父文件夹到任何路径下来执行Main.vbs。但是注意,如果路径中间出现的文件夹名存在空格,这种情况下会出现路径找不到的情况,例如,类似这样的路径“C:\Documents
and Settings\Administrator\桌面\zzxxbb112
”,因为WshShell.run方法必须保证路径中的文件夹名字不含有空格字符,否则就会报类似这样的错误,如图所示。
如果要解决这问题,必须避免空格的直接输入,解决方案为。
●
引号转化字符串。
办法其实很简单,由于此处不能直接输入空格,可以使用字符串形式,这样run命令就会把此路径作为一个整体,这样就顺利解决了问题,来看一下脚本:
'创建WshShell对象 Set wshShell = CreateObject("wscript.shell") '获取相对文件夹路径 RelativeFolder = wshShell.CurrentDirectory '拼接相对路径 msgPath = RelativeFolder + "\msg.vbs" '加入引号转化相对路径为字符串 chrMsgPath = Chr(34) & msgPath & Chr(34) '运行相对路径下的main.vbs wshShell.Run chrMsgPath '释放对象 Set wshShell = Nothing
分析:
此处脚本只是加入了chr(34),由于脚本中需要加入引号时不可以直接添加,因此,VBS特别设立了一些特殊符号的输入,chr(34)就是其中一个,表示为引号,这样就可以把相对路径成功转化为字符串方式来运行,也就不会报错了。
>> 本文固定链接: http://www.vcgood.com/archives/3584