首页 > C/C++开发工具专区 > VC技术 > WshShell对象常用方法介绍
2012
02-27

WshShell对象常用方法介绍

作者:李唯新

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)就是其中一个,表示为引号,这样就可以把相对路径成功转化为字符串方式来运行,也就不会报错了。

FROM:http://www.vckbase.com/document/viewdoc/?id=1950

留下一个回复