发布新日志

  • (转)QTP脚本中使用正则表达式,匹配字符串方法

    2009-09-10 23:01:20

    第一、首先正则表达式使用如下对象。

      1、RegExp 这是使用正则表达式匹配模式的主要对象了

      属性:

      Pattern:一个字符串,用来定义正则表达式<匹配规则>。

      IgnoreCase:如果True,则忽略英文字母大小的匹配,False对大小写进行匹配。

      Global:设置True则必须匹配整个<匹配规则>,设置False只匹配第一个<匹配规则>。

      MultiLine:设置True则在多行中搜索。设置False则在换行时停止。

      方法:

      Execute:返回一个MatchCollection对象,该对象包含每个成功匹配的Match对象。

      Replace:返回一个将符合<匹配规则>的字符串替换为指定字符串。

      Test:返回一个布尔值,该值指示正则表达式是否与字符串成功匹配。

      2、MatchCollection 是集合对象,该对象包含每个成功匹配的Match对象。

      属性:

      Count:匹配对象的总数。

      Item:匹配对象的索引。

      3、Match 是成功匹配的对象。

      属性:

      FirstIndex:匹配对象所匹配字符串的起始位置。

      Length:匹配对象所匹配字符串的字符长度。

      SubMatches:匹配对象所匹配结果的子项。也就是<匹配规则>中下一个匹配项“一般一个()代表一个匹配项”

      Value:匹配对象所匹配的值。

    第二、RegExp对象的Test方法:测试字符串是否符合匹配规则。

    FunctionRTest(s, p)
        Setre =NewRegExp
         re.IgnoreCase =False '设置是否忽略大小写
         re.Pattern = p
         RTest= re.Test(s)
    End Function

      一般我们在QTP中使用正则表达式来匹配字符串的话,会编写如上面那样的一个函数。使用方法如下:

      s = “我的邮箱: test@163.com 。欢迎致电!"'用来匹配的字符串,也就是实际上我们要测试的内容

      '检查测试字符串中是否包含数字

      p = “\d+” ’测试是否包含数字的匹配规则

      MsgBoxRTest(s, p)

      '检查测试字符串是否全是由数字组成:

      p = “^\d+$”

      MsgBoxRTest(s, p)

      '检查测试字符串是否有大写字母:

      p = “[A-Z]+”

      MsgBoxRTest(s, p)

      第三、RegExp的Replace方法:把测试字符串中符合匹配规则的字符串替换为指定内容

    FunctionStrReplace(s, p, r)
        Setre =NewRegExp
         re.IgnoreCase =True'设置忽略大小写
         re.Global =True '设置必须匹配整个规则
         re.Pattern = p
         StrReplace = re.Replace(s, r)
    End Function

      上面的就是一般情况下使用这个方法所需要编写的一个函数,下面的就是如何使用

      ‘以下是如何使用这个方法替换邮箱地址

         s = "我的E-mail: Test@163.com 。欢迎致电!"
         p = "\w+@\w+\.(com|cn|net)"
         r = "E_Mail@sohu.net"
         s = StrReplace(s, p, r)
        MsgBox s
        '结果:我的E-mail: E_Mail@sohu.net 。欢迎致电!

      第四、Match的SubMatches属性:下一个匹配项的匹配内容

      仔细看下面这段代码的含义...

        inpStr = "我的E-mail: lucky@163.com 。欢迎致电!"
        Setre =NewRegExp
        re.Pattern = "(\w+)@(\w+).(\w+)" '注意!这个匹配规则有3个(),一个()代表一个匹配项

        Setmhs = re.Execute(inpStr)
        Setmh = mhs(0)            '根据上面的匹配规则可以计算出只有一个匹配结果
       
        MsgBox "电子邮件地址是:"&mh.Value      '这里是匹配的内容
        MsgBox "用户名是:"&mh.SubMatches(0)  '第一个括号<匹配项>中的内容
        MsgBox "邮箱是:"&mh.SubMatches(1)  '第二个括号<匹配项>中的内容
        MsgBox "域名是:"&mh.SubMatches(2)  '第三个括号<匹配项>中的内容


  • DOM

    2009-08-18 19:35:32

    HTML 文档中的每个成分都是一个节点。
    DOM 是这样规定的:
       1. 整个文档是一个文档节点
       2. 每个 HTML 标签是一个元素节点
       3. 包含在 HTML 元素中的文本是文本节点
       4. 每一个 HTML 属性是一个属性节点
       5. 注释属于注释节
    举例:<head> 和 <body> 的父节点是 <html> 节点,文本节点 "Hello world!" 的父节点是 <p> 节点。
    <html>
      <head>
        <title>DOM Tutorial</title>
      </head>
      <body>
        <h1>DOM Lesson one</h1>
        <p>Hello world!</p>
      </body>
    </html>

    访问节点:1. 通过使用 getElementById() 和 getElementsByTagName() 方法
             2. 通过使用一个元素节点的 parentNode、firstChild 以及 lastChild 属性
    注释:getElementById() 无法工作在 XML 中


    字节信息
    每个节点都拥有包含着关于节点某些信息的属性。这些属性是:
         
    nodeName(节点名称) 、nodeValue(节点值) 、nodeType(节点类型)
    nodename
    nodeName 属性含有某个节点的名称。
        1. 元素节点的 nodeName 是标签名称
        2. 属性节点的 nodeName 是属性名称
        3. 文本节点的 nodeName 永远是 #text
        4. 文档节点的 nodeName 永远是 #document
    注释:nodeName 所包含的 XML 元素的标签名称永远是大写的
    nodevalue
        对于文本节点,nodeValue 属性包含文本。
        对于属性节点,nodeValue 属性包含属性值。
        nodeValue 属性对于文档节点和元素节点是不可用的。
    nodetype
    nodeType 属性可返回节点的类型。

    最重要的节点类型是:

    元素类型 节点类型
    元素 1
    属性 2
    文本 3
    注释 8
    文档 9

  • 描述性语言

    2009-08-16 17:08:38

    1. 使用Description
       Set bj = Description.Create()
       Obj("name") = "username"
       Browser().Page().WebEdit(Obj).Set ""

    2. 使用正则
       Browser("name:=" & BrowserName & ".*").Page("title:=" & PageName & ".*").WebEdit(Obj).Set "" 

    3. 使用环境变量
       导入xml,注意编码,否则汉字显示乱码
       可以直接在Test Setting 中导入xml文件,也可以通过loadfromfile函数导入
       Environment.LoadFromFile(filepath)
       Browser("name:=" & BrowserName & ".*").Page("title:=" & PageName & ".*").WebEdit(Obj).Set Environment.value("username")

     

  • QTP操作xml文件的方法(转)

    2009-08-12 11:00:05

    目前,企业中对XML的应用越来越广泛,作为自动化测试的测试工程师,也应该掌握XML的读写操作。
      以下我使用XML DOM技术演示一个例子,用以读取XML指定节点的节点内容值。
      读取函数原型 GetXml strXmlPath,nodeName
      这个函数的第一个参数表示xml文件所在路径,第二个参数表示希望获取到的xml节点名,请结合下列例子看
      首先,新建一个vbs文件(取个名字叫readXml.vbs),输入代码:
    Dim strXML

      GetXml "c:search.xml","TestResult"  '这个函数的第一个参数表示xml文件所在路径,第二个参数表示希望获取到的xml节点名,请结合下列例子看
    MsgBox strXML

    Function GetXml (ByVal strXmlFilePath,ByVal xmlNodeName)
            Dim xmlDoc,xmlRoot
           
            Set xmlDoc = CreateObject("Microsoft.XMLDOM") '创建XML DOM对象
            xmlDoc.async = False  '控制加载模式为同步模式(xml树加载完毕后再执行后续代码)
            xmlDoc.load strXmlFilePath        '载入xml文件
            If xmlDoc.parseError.errorCode <> 0 Then
                    MsgBox "XML文件格式不对,原因是:" & Chr(13) &  xmlDoc.parseError.reason
                    Exit Function               
            End If
            Set xmlRoot = xmlDoc.documentElement       
            xmlRecursion xmlRoot,xmlNodeName        '调用xml递归函数传入指定的根和节点名       
            GetXml = True 'xmlRecursion (xmlRoot)
           
    End Function

    Function xmlRecursion(byval xmlNode,byval strNodeName)
            If xmlNode.nodeName = strNodeName And xmlNode.hasChildNodes Then
                    If  xmlNode.childNodes.item(0).nodeName = "#text" Then
                            strXML = strXML & xmlNode.nodeName & ":" & xmlNode.childNodes.item(0).nodeValue & Chr(13)                                               
                    End If               
            End If                       
            If xmlNode.hasChildNodes Then
                    For Each childNodeItem In xmlNode.ChildNodes
                            If childNodeItem.hasChildNodes Then
                                    xmlRecursion childNodeItem,strNodeName                               
                            End If                       
                    Next
            End If       
    End Function
     
    问题:
      haschildnodes()这个方法好奇怪,明明已经没有子节点了,却仍然返回true,
      比如<TestResult>1</TestResult>这个节点,它的childNodes.item(0).nodeName竟然是“#text”,但是根据例子来看TestResult已经没有子节点了阿
    回答:
      因为在xml有一个特殊的“子节点”——文本节点。比如 <TestResult>100</TestResult>
      这个节点TestResult下并不是没有子节点,而是有一个文本节点,这个节点的nodeName就是“#text”,而nodeValue是100.如果是 <TestResult/> 这种节点的话,那么用hasChildNodes则返回False
     
    遍历xml的代码:
    Option Explicit
    Dim xmlDoc,myErr,strXML
    Set xmlDoc = CreateObject("Microsoft.XMLDOM")
    xmlDoc.async = False  
    xmlDoc.load "c:calc1.xml"
    If xmlDoc.parseError.errorCode <> 0 Then  
       Set myErr = xmlDoc.parseError
       MsgBox("XML Loads Failed. " & myErr.reason)
    Else
            Set rootNode = xmlDoc.documentElement
            Call rTravel(rootNode)
            MsgBox strXML
    End If

    Sub rTravel (rNode)
            Dim blnTwo,intTestCase,
            blnTwo = False
            iLen = rNode.childNodes.length
            If iLen > 0 Then
                    For i = 0 To rNode.childNodes.length -1
                            Set child = rNode.childNodes.item(i)
                            Call rTravel(child)                       
                            childtext = child.nodeValue                       
                            strXML = strXML & childtext & chr(13)
                    Next
            Else
                    Exit Sub               
            End If
    End Sub


    方法二:
    Option Explicit
    Dim xmlDoc,myErr,strXML

    Set xmlDoc = CreateObject("Microsoft.XMLDOM")
    xmlDoc.async = False  
    xmlDoc.load "c:calc1.xml"
    If xmlDoc.parseError.errorCode <> 0 Then  
       Set myErr = xmlDoc.parseError
       MsgBox("XML Loads Failed. " & myErr.reason)
    Else
            Set rootNode = xmlDoc.documentElement
            Call rTravel(rootNode)
            MsgBox strXML
    End If
    Sub rTravel (rNode)
            Dim blnTwo,intTestCase,
            blnTwo = False
            iLen = rNode.childNodes.length
            If iLen > 0 Then
                    For i = 0 To rNode.childNodes.length -1
                            Set child = rNode.childNodes.item(i)
                            Call rTravel(child)                       
                            childtext = child.nodeValue                       
                            strXML = strXML & childtext & chr(13)
                    Next
            Else
                    Exit Sub               
            End If
    End Sub

  • 自动化测试中如何利用WMI(转)

    2009-08-10 20:56:29

    WMI即Windows 管理规范,是用户管理本地和远程计算机的一种模型。通过它可以访问、配置、管理和监视几乎所有的 Windows 资源。WMI的语法十分简单,基本上常见的命名空间、对象等用几乎一模一样。它对应的是Windows里的WMI服务(winmgmt)

    WMI实际是由两部分组成:CIM库和WMI脚本对象库。在具体使用过程中,我们是通过WMI脚本对象库去访问CIM库,管理托管的资源。也就是说,在我们编写脚本的过程大致可以分为这么几步:

    1)创建WMI对象脚本库的指针实例;

    2)调用其实例的方法,连接到CIM库,并指明需要访问的资源的逻辑位置;

    )获得托管资源也就是类的实例的集合;

    4)枚举实例,完成工作

    WMI的命名空间共有16个,不过我们常用的只有两个:

    1)root\cimv2  在这个命名空间里包括了绝大多数与计算机、操作系统相关联的类。

    2)root\default  管理注册表的类

    给出两个实例参考:

    日志报告中记录测试机器的地址:

    Public Function GetIP()
     '获取测试机器的IP
      ComputerName="."
      Dim objWMIService,colItems,objItem,objAddress
      Set ōbjWMIService = GetObject("winmgmts:\\" & ComputerName & "\root\cimv2")
      Set colItems = objWMIService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")
      For Each objItem in colItems
         For Each objAddress in objItem.IPAddress
             If objAddress <> "" Then
               GetIP = objAddress
               Exit Function
             End If
         Next
      Next
    End Function

    如何在判断进程是否存在

    Function ProcessExist(processName)
      For each Process in GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_process")
       If Process.Name = processName Then
         ProcessExist = True
         Exit Function 
       End If
     Next
     ProcessExist = False
    End Function

  • DTParameter 对象

    2009-08-06 20:25:06

    DTParameter对象指的是运行时DataTable Sheet中的列对象。

    注意:所有应用于DTParameter对象的方法仅适用于run-time DataTable对象。所有对run-time DataTable对象的改变只影响测试结果,不影响design-time Data Table

     

    1.     Property

    Ø        Name

    描述

    返回run-time Data Table的列名。

    语法

    DTParameter.Name

    示例

    下面的例子使用“Name”方法返回run-time Data Table中新创建的列的名称,并将列名写入Report

    Dim paramname

    paramname = DataTable.LocalSheet.AddParameter("Food", "pizza").Name

    Reporter.ReportEvent 1, "The New Parameter name is", paramname

    Ø        RawValue

    描述

    获取当前行指定列所对应的单元格的原始数据。原始数据是尚未计算处理过的数据,如单元格中的公式内容等。

    语法

    DTParameter.RawValue

    本语法与DataTable.RawValueParameterID[,SheetID]用途是一样的,但是使用方法不同。

    示例

    下面的例子使用RawValue属性来获取run-time Data Table的“ActionA”表“Date”列的当前行所对应的单元格中的公式。本例中的返回值应该是“=Now()“。

    FormulaVal=DataTable.GetSheet("ActionA").GetParameter("Date").RawValue

    Ø        Value

    描述

    这个属性是列对象的默认属性。获取或设置列的当前行所对应的单元格的数据。

    注意:这个方法返回的数据是计算后的数据。假如单元格中包括公式,则这个方法返回TrueFalse

    语法

    获取单元格数据:

    DTParameter.Value or DTParameter

    设置单元格数据:

    DTParameter.Value=newvalueor DTParameter=newvalue

    示例

    下面的例子使用Value来设置SheetActionA”的“Destination”列的当前行所对应的单元格的数据。

    DataTable.GetSheet("ActionA").GetParameter("Destination").Value="New York"

    注意:可以省略本语句中的“Value”,因为ValueDTParameter的默认属性。

    Ø        ValueByRow

    描述

    获取指定列指定行所对应的单元格的数据。

    语法

    DTParameter.ValueByRow(RowNum)

    Argument

    Type

    Descrīption

    RowNum

    Number

    指定行号。行号从1开始。

    示例

    下面的例子使用“ValueByRow”来获得表“ActionA”的“Destination”列的第4行数据。

    DataTable.GetSheet("ActionA").GetParameter("Destination").ValueByRow(4)

  • Wscript.Shell 对象详细介绍(转)

    2009-08-02 11:52:27

    WshShell 对象
    ProgID Wscript.Shell
    文件名 WSHom.Ocx
    CLSID F935DC22-1CF0-11d0-ADB9-00C04FD58A0B
    IID F935DC21-1CF0-11d0-ADB9-00C04FD58A0B

    下表说明和 WshShell 对象有关的属性。
    属性 说明
    Environment 返回 WshEnvironment 集合对象。
    SpecialFolders 使用 WshSpecialFolders 对象提供对 Windows shell 文件夹的访问,如桌面文件夹,开始菜单文件夹和个人文档文件夹。

    下表说明和 WshShell 对象有关的方法。
    方法 说明
    CreateShortcut 创建并返回 WshShortcut 对象。
    ExpandEnvironmentStrings 扩展 PROCESS 环境变量并返回结果字符串。
    Popup 显示包含指定消息的消息窗口。
    RegDelete 从注册表中删除指定的键或值。
    RegRead 从注册表中返回指定的键或值。
    RegWrite 在注册表中设置指定的键或值。
    Run 创建新的进程,该进程用指定的窗口样式执行指定的命令。

    WshShell.Environment
    Environment 属性返回 WshEnvironment 对象。
    语法
    WshShell.Environment ( [strType]) = objWshEnvironment
    注释
    若 strType 指定了环境变量所处的位置,可能值为 "System"、"User"、"Volatile" 和 "Process"。若未提供 strType,则该方法在 Windows NT 中检索系统环境变量或在 Windows 95 中检索进程环境变量。
    对于 Windows 95,strType 参数仅支持 "Process"。
    下列变量是由 Windows 操作系统提供的。脚本也可获取由其他应用程序设置的环境变量。
    名称 说明
    NUMBER_OF_PROCESSORS 计算机上运行的处理器数目。
    PROCESSOR_ARCHITECTURE 用户工作站使用的处理器类型。
    PROCESSOR_IDENTIFIER 用户工作站的处理器 ID。
    PROCESSOR_LEVEL 用户工作站的处理器级。
    PROCESSOR_REVISION 用户工作站的处理器版本。
    OS 用户工作站所用的操作系统。
    COMSPEC 用于运行“命令提示”窗口的命令(通常为 cmd.exe)。
    HOMEDRIVE 本地主驱动器(通常为 C 驱动器)。
    HOMEPATH 用户的默认路径(在 Windows NT 上通常为 usersdefault)。
    PATH 路径环境变量。
    PATHEXT 可执行文件的扩展名(通常为 .com、 .exe、.bat 或 .cmd)。
    PROMPT 命令提示符(通常为 $P$G)。
    SYSTEMDRIVE 系统所在的本地驱动器(例如,c:)。
    SYSTEMROOT 系统目录(例如,c:winnt)。和 WINDIR 相同。
    WINDIR 系统目录(例如 c:winnt)。和 SYSTEMROOT 相同。
    TEMP 存储临时文件的目录(例如,c:temp)。用户可更改。
    TMP 存储临时文件的目录(例如,c:temp)。用户可更改。

    示例
    '' Retrieve the NUMBER_OF_PROCESSORS system environment variable
    Set WshShell = Wscript.CreateObject("Wscript.Shell")
    Set WshSysEnv = WshShell.Environment("SYSTEM")
    Wscript.Echo WshSysEnv("NUMBER_OF_PROCESSORS")
    请参阅
    WshEnvironment 对象

    WshEnvironment 对象
    WshEnvironment 对象未直接给出,可用 WshShell.Environment 属性来访问。
    ProgID N/A
    文件名 WSHom.Ocx
    CLSID
    IID

    下表描述与 WshEnvironment 对象关联的属性。
    属性 说明
    Item 获取或设置指定的环境变量值。
    Count 枚举项的数目。
    length 枚举项的数目 (JScript)。

    下表描述与 WshEnvironment 对象关联的方法。
    方法 说明
    Remove 删除指定的环境变量。

    WshShell.SpecialFolders
    SpecialFolders 属性提供 WshSpecialFolders 对象以便访问 Windows 的 shell 文件夹,例如桌面文件夹、开始菜单文件夹和个人文档文件夹。
    语法
    WshShell.SpecialFolders = objWshSpecialFolders
    示例
    '' This code fragment shows how to access the desktop folder
    Set WshShell = Wscript.CreateObject("Wscript.Shell")
    MsgBox "Your desktop is " & WshShell.SpecialFolders("Desktop")
    请参阅
    WshSpecialFolders 对象
    WshSpecialFolders 对象
    该对象未直接给出。要得到 WshSpecialFolders 对象,请使用 WshShell.SpecialFolders 属性。
    ProgID N/A
    文件名 WSHom.Ocx
    CLSID
    IID

    下表描述与 WshSpecialFolders 对象关联的属性。
    属性 描述
    Item 指定文件夹的完整路径(默认)。
    Count 枚举项的数目。
    length 枚举项的数目 (JScript) 。
    WshSpecialFolders.Item
    Item 属性返回由 strFolderName 指定的文件夹的完整路径。它是默认属性。
    语法
    WshShell.SpecialFolders.Item("strFolderName") = strFolderPath
    WshShell.SpecialFolders("strFolderName") = strFolderPath
    注释
    若请求的文件夹 (strFolderName) 不可用,则 WshShell.SpecialFolders("strFolderName") 返回 NULL。例如,Windows 95 没有 AllUsersDesktop 文件夹,如果 strFolderName = AllUsersDesktop,则返回 NULL。
    Windows 95 和 Windows NT 4.0 操作系统提供下列指定文件夹:
    AllUsersDesktop
    AllUsersStartMenu
    AllUsersPrograms
    AllUsersStartup
    Desktop
    Favorites
    Fonts
    MyDocuments
    NetHood
    PrintHood
    Programs
    Recent
    SendTo
    StartMenu
    Startup
    Templates
    示例
    '' This fragment returns the full path for the Windows Desktop folder
    Set WshShell = Wscript.CreateObject("Wscript.Shell")
    StrMyDesktop = WshShell.SpecialFolders("Desktop")
    '' List all special folders
    For Each strFolder In WshShell.SpecialFolders
    MsgBox strFolder
    Next
    请参阅
    WshShell.SpecialFolders 属性

    WshShell.CreateShortcut
    CreateShortcut 方法创建 WshShortcut 对象并将其返回。如果快捷方式标题以 .url 结尾,就会创建 WshURLShortcut 对象。
    语法
    WshShell.CreateShortcut(strPathname) = objShortcut
    示例
    '' This code fragment creates a shortcut
    '' to the currently executing script
    Set WshShell = Wscript.CreateObject("Wscript.Shell")
    Set ShellLink = WshShell.CreateShortcut("Current Script.lnk")
    oShellLink.TargetPath = Wscript.ScriptFullName
    oShellLink.Save
    Set UrlLink = WshShell.CreateShortcut("Microsoft Web Site.URL")
    oUrlLink.TargetPath = "
    http://www.microsoft.com"
    oUrlLink.Save
    请参阅
    WshShortcut 对象、WshUrlShortcut 对象
    WshShortcut 对象
    该对象未直接给出。要获得 WshShortcut 对象,请使用 WshShell.CreateShortcut 方法。
    ProgID N/A
    文件名 WSHom.Ocx
    CLSID F935DC28-1CF0-11d0-ADB9-00C04FD58A0B
    IID F935DC27-1CF0-11d0-ADB9-00C04FD58A0B

    下表说明和 WshShortcut 对象有关的属性。
    属性 说明
    Arguments 快捷方式对象的参数。
    Description 快捷方式对象的说明。
    Hotkey 快捷方式对象的热键。
    IconLocation 快捷方式对象的图标位置。
    TargetPath 快捷方式对象的目标路径。
    WindowStyle. 快捷方式对象的窗口样式。
    WorkingDirectory 快捷方式对象的工作目录。

    下表说明与 WshShortcut 对象有关的方法。
    方法 说明
    Save 将快捷方式存储到指定的文件系统中。
    WshShortcut.Arguments
    Arguments 属性提供快捷方式对象的参数。
    语法
    WshShortcut.Arguments = strArguments
    WshShortcut.Description
    Description 属性提供快捷方式对象的说明。
    语法
    WshShortcut.Description = strDescription
    WshShortcut.Hotkey
    HotKey 属性提供快捷方式对象的热键。热键是启动或切换程序的键盘快捷方式。
    语法
    WshShortcut.HotKey = strHotKey
    注释
    strHotKey 的BNF语法如下:
    Hotkey ::= modifier* keyname
    modifier ::= "ALT+" | "CTRL+" | "SHIFT+" | "EXT+"
    keyname ::= "A" .. "Z" |
    "0".. "9" |
    "Back" | "Tab" | "Clear" | "Return" |
    "Escape" | "Space" | "Prior" | ...
    所有键的名称都可以在 WINUSER.H 中找到。热键不区分大小写。
    热键只能激活位于 Windows 桌面或 Windows“开始”菜单的快捷方式。
    Windows 资源管理器不接受 ESC、ENTER、TAB、SPACE、PRINT SCREEN 或 BACKSPACE,即使 WshShortcut.Hotkey 遵循 Win32 API 支持它们。因此,建议在快捷方式中不要用这些键。
    示例
    Set WshShell = Wscript.CreateObject("Wscript.WshShell")
    strDesktop = WshShell.SpecialFolders("Desktop")
    Set MyShortcut = WshShell.CreateShortcut(strDesktop & "a_key.lnk")
    OMyShortcut.TargetPath = "%windir%notepad.exe"
    oMyShortCut.Hotkey = "ALT+CTRL+F"
    oMyShortCut.Save
    Wscript.Echo oMyShortCut.HotKey = "Alt+Ctrl+F"
    请参阅
    WshSpecialFolders 对象
    WshShortcut.IconLocation
    IconLocation 属性提供快捷方式对象的图标位置。图标位置的格式应为 "Path,index"。
    语法
    WshShortcut.IconLocation = strIconLocation
    WshShortcut.TargetPath
    TargetPath 属性提供快捷方式对象的目标路径。
    语法
    WshShortcut.TargetPath = strTargetPath
    WshShortcut.WindowStyle
    WindowStyle. 属性提供快捷方式对象的窗口样式。
    语法
    WshShortcut.WindowStyle. = natWindowStyle
    WshShortcut.WorkingDirectory
    WorkingDirectory 为一个快捷方式对象提供工作目录。
    语法
    WshShortcut.WorkingDirectory = strWorkingDirectory
    WshShortcut.Save
    Save 方法把快捷方式对象保存到由 FullName 属性指定的位置。
    语法
    WshShortcut.Save
    WshUrlShortcut 对象
    该对象未直接给出。要获取 WshUrlShortcut 对象,可使用 WshShell.CreateShortcut 方法。
    ProgID N/A
    文件名 WSHom.Ocx
    CLSID
    IID

    下表说明了和 WshUrlShortcut 对象有关的属性。
    属性 说明
    FullName URL 快捷方式对象的完整路径。
    TargetPath URL 快捷方式对象的目标路径。

    下表说明了和 WshUrlShortcut 对象有关的方法。
    方法 说明
    Save 将快捷方式保存到指定的文件系统中。
    WshUrlShortcut.FullName
    FullName 属性提供快捷方式对象的完整路径。
    语法
    WshUrlShortcut.FullName = strFullName
    WshUrlShortcut.TargetPath
    TargetPath 属性提供快捷方式对象的目标路径。
    语法
    WshUrlShortcut.TargetPath = strTargetPath
    WshUrlShortcut.Save
    Save 方法保存一个快捷方式,该快捷方式指向 FullName 属性指定的位置。
    语法
    WshUrlShortcut.Save
    WshShell.ExpandEnvironmentStrings
    ExpandEnvironmentStrings 方法在 strString 中扩展 PROCESS 环境变量并返回结果字符串。变量被 ''%'' 字符括起。
    环境变量不区分大小写。
    语法
    WshShell.ExpandEnvironmentStrings(strString) = strExpandedString
    示例
    MsgBox "Prompt is " & WshShell.ExpandEnviromentStrings("%PROMPT%")

    WshShell.Popup
    Popup 方法显示一个弹出式消息框窗口,消息框中包含的消息由 strText 指定。该消息框的窗口标题由 strTitle 指定。若 strTitle 省略,则窗口标题为 Windows Scripting Host。
    语法
    WshShell.Popup(strText, [natSecondsToWait], [strTitle], [natType]) = intButton
    注释
    若提供 natSecondsToWait 且其值大于零,则消息框在 natSecondsToWait 秒后关闭。
    natType 的含义与其在 Win32? MessageBox 函数中相同。下表显示 natType 中的值及含义。下表中的值可以组合。
    按钮类型
    值 说明
    0 显示“确定”按钮
    1 显示“确定”和“取消”按钮
    2 显示“终止”、“重试”和“忽略”按钮
    3 显示“是”、“否”和“取消”按钮
    4 显示“是”和“否”按钮
    5 显示“重试”和“取消”按钮

    图标类型
    值 说明
    16 显示停止标记图标
    32 显示问号图标
    48 显示感叹号图标
    64 显示信息标记图标

    以上两个表并不涵盖 natType 的所有值。完整的列表请参阅 Win32 文档。
    返回值 intButton 指示用户所单击的按扭编号。若用户在 natSecondsToWait 秒之前不单击按扭,则 intButton 设置为 -1 。
    值 说明
    1 “确定”按扭
    2 “取消”按扭
    3 “终止”按扭
    4 “重试”按扭
    5 “忽略”按扭
    6 “是”按扭
    7 “否”按扭

    示例
    Set WshShell = Wscript.CreateObject("Wscript.Shell")
    WshShell.Popup "Where do you want to go today?"
    请参阅
    Wscript.Echo 方法
    Wscript.Echo
    Echo 方法在窗口(Wscript.exe 中)或“命令提示符”窗口(Cscript.exe 中)显示参数。
    参数用空格分隔。在 Cscript.exe 中,该方法在显示最后一个参数之后输出一对回车/换行(CR LF)。
    语法
    Wscript.Echo [anyArg...]
    示例
    Wscript.Echo
    Wscript.Echo 1, 2, 3
    Wscript.Echo "Windows Scripting Host is cool."
    WshShell.RegDelete
    RegDelete 从注册表中删除名为 strName 的键或值。
    语法
    WshShell.RegDelete strName
    参数
    strName
    如果 strName 以反斜杠 () 结束,则该方法删除键而不是值。
    strName 参数必须以下列之一的根键名开始:
    短根键名 长根键名
    HKCU HKEY_CURRENT_USER
    HKLM HKEY_LOCAL_MACHINE
    HKCR HKEY_CLASSES_ROOT
    HKEY_USERS
    HKEY_CURRENT_CONFIG

    示例
    Set WshShell = Wscript.CreateObject("Wscript.Shell")
    WshShell.RegDelete "HKCUScriptEngineValue" '' Delete value "Value"
    WshShell.RegDelete "HKCUScriptEngineKey" '' Delete key "Key"
    请参阅
    WshShell.RegRead 方法、WshShell.RegWrite 方法

    WshShell.RegRead
    RegRead 方法返回名为 strName 的注册表键或值。
    语法
    WshShell.RegRead(strName) = strValue
    参数
    strName
    如果 strName 以反斜杠 () 结束,则该方法返回键,而不是值。
    strName 参数必须以下列根键名开始。
    Short Long
    HKCU HKEY_CURRENT_USER
    HKLM HKEY_LOCAL_MACHINE
    HKCR HKEY_CLASSES_ROOT
    HKEY_USERS
    HKEY_CURRENT_CONFIG

    注释
    RegRead 方法仅支持 REG_SZ、REG_EXPAND_SZ、REG_DWORD、REG_BINARY 和 REG_MULTI_SZ 数据类型。若注册表有其他数据类型,RegRead 返回 DISP_E_TYPEMISMATCH。
    示例
    Set WshShell = Wscript.CreateObject("Wscript.Shell")
    WshShell.RegRead("HKCUScriptEngineVal") '' Read from value "Val"
    WshShell.RegRead("HKCUScriptEngineKey") '' Read from key "Key"
    请参阅
    WshShell.RegDelete 方法、WshShell.RegWrite 方法

    WshShell.RegWrite
    RegWrite 方法设置名为 strName 的注册表键或值。
    语法
    WshShell.RegWrite strName, anyValue, [strType]
    参数
    strName
    若 strName 以一个反斜杠 () 结束,则该方法设置键,而不是值。
    strName 参数必须以下列根键名开头。
    Short Long
    HKCU HKEY_CURRENT_USER
    HKLM HKEY_LOCAL_MACHINE
    HKCR HKEY_CLASSES_ROOT
    HKEY_USERS
    HKEY_CURRENT_CONFIG

    anyValue
    当 strType 为 REG_SZ 或 REG_EXPAND_SZ 时,RegWrite 方法自动将 anyValue 转换为字符串。若 strType 为 REG_DWORD,则 anyValue 被转换为整数。若 strType 为 REG_BINARY,则 anyValue 必须是一个整数。
    strType
    RegWrite 方法支持 strType 为 REG_SZ、REG_EXPAND_SZ、REG_DWORD 和 REG_BINARY。若其他的数据类型被作为 strType 传递,RegWrite 返回 E_INVALIDARG。
    示例
    Set WshShell = Wscript.CreateObject("Wscript.Shell")
    WshShell.RegWrite "HKCUScriptEngineValue", "Some string value"
    WshShell.RegWrite "HKCUScriptEngineKey", 1 "REG_DWORD"
    请参阅
    WshShell.RegDelete 方法、WshShell.RegWrite方法

    WshShell.Run
    Run 方法创建一个新的进程,该进程以 intWindowStyle. 窗口样式执行 strCommand。
    语法
    WshShell.Run (strCommand, [intWindowStyle], [blnWaitOnReturn])
    参数
    strCommand
    在 strCommand 参数内部的环境变量被自动扩展。
    intWindowStyle.
    这是为新进程在 STARTUPINFO 结构内设置的 wShowWindow 元素的值。其意义与 ShowWindow 中的 nCmdShow 参数相同,可取以下值之一。名称 值 含义
    SW_HIDE
    0 隐藏窗口并激活另一窗口。
    SW_MINIMIZE
    6 最小化指定窗口并激活按 Z 序排序的下一个顶层窗口。
    SW_RESTORE
    9 激活并显示窗口。若窗口是最小化或最大化,则恢复到原来的大小和位置。在还原应用程序的最小化窗口时,应指定该标志。
    SW_SHOW
    5 以当前大小和位置激活并显示窗口。
    SW_SHOWMAXIMIZED
    3 激活窗口并以最大化显示该窗口。
    SW_SHOWMINIMIZED
    2 激活窗口并以最小化显示该窗口。
    SW_SHOWMINNOACTIVE
    7 最小化显示窗口。活动窗口保持活动。
    SW_SHOWNA
    8 以当前状态显示窗口。活动窗口保持活动。
    SW_SHOWNOACTIVATE
    4 按窗口最近的大小和位置显示。活动窗口保持活动。
    SW_SHOWNORMAL
    1 激活并显示一个窗口。若窗口是最小化或最大化,则恢复到其原来的大小和位置。

    blnWaitOnReturn
    如果未指定 blnWaitOnReturn 或其值为 FALSE,则该方法立即返回到脚本继续执行而不等待进程结束。
    若 blnWaitOnReturn 设为 TRUE,则 Run 方法返回由应用程序返回的任何错误代码。如果未指定 blnWaitOnReturn 或其值为 FALSE,则 Run 返回错误代码 0(zero)。
    示例
    '' This fragment launches Notepad with the current executed script
    Set WshShell = Wscript.CreateObject("Wscript.Shell")
    WshShell.Run ("notepad " & Wscript.ScriptFullName)
    WshShell.Run ("%windir%notepad" & Wscript.ScriptFullName)
    '' This fragment returns the error code from the executed application
    Return = WshShell.Run("notepad " & Wscript.ScriptFullName, 1, TRUE)

  • 揭秘QTP的DeviceReplay对象(转)

    2009-07-28 23:31:11

    不知道为什么HP的帮助文档中没有提供关于DeviceReplay的强大功能的信息描述。你可以在Java插件中却可以找到DeviceReplay的属性,但是对于那些不使用Java插件的人可能会觉得这个对象仅在Java程序的测试中可用。

    为什么要用DeviceReplay?
    有些时候我们需要针对界面做一些指定的动作,例如右键单击一个对象,使用功能键(Fx)来激活某些热键的功能,这时候就可以使用DeviceReplay对象,或者在Object.Set和Object.Type方法不生效时使用DeviceReplay。

     

    并且DeviceReplay在输入特殊符号以及不同语言的文字时会很有用,因为不需要安装指定的字体或改变键盘布局,这对于测试多语言环境的应用程序会非常有用。

     

    在鼠标操作方面,我发现DragDrop方法非常有用,可以使用它来执行拖拽的操作,把一个Item从一个Frame拖动到另外一个Frame,或者在应用程序之间拖动。

    Mercury.DeviceReplay对象
    Mercury.DeviceReplay对象用于模拟鼠标单击和移动,还有键盘输入等操作。要使用DeviceReplay,你必须确保被测试的应用程序(AUT)是处于激活状态的窗口。如果你想对某个对象执行一项操作,则该对象必须拥有焦点(focus)。对于
    Windows应用程序,可以使用Activate方法:

    Window( "W" ).Activate micLeftBtn

     

    如果想把焦点设置到某个指定的对象上,通常使用Click方法可以完成。

     

    对于Web环境的应用程序,Activate方法不被支持,因此可以使用下面的技巧来完成:

    hwnd = Browser( "B" ).GetROProperty( "hwnd" )

    Window( "hwnd:=" & hwnd ).Activate micLeftBtn

     

    通常可以使用FireEvent “onfocusin”或object.focus,例如WebEdit(“WE”).Object.focus或WebEdit(“WE”)。FireEvent “onfocusin”。

     

    在调用DeviceReplay对象的方法之前,你需要首先创建DeviceReplay对象:

    Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )

    Microsoft.VisualBasic.Devices.Keyboard类
    为什么我要在介绍DeviceReplay对象之前介绍这个.NET的类呢?DeviceReplay是一个强大的未被文档化的对象,但是有一定的局限性。其中一个局限就是不能判断一个Control键是否已经被按下。在输入一个大写字母之前,我们需要知道CAPS-LOCK键是否已经按下。在使用数字键盘之前我们需要检查NUM-LOCK键是否已经被按下。否则我们在切换键盘输入状态时可能得到的并不是我们想要的状态。

     

    Devices.Keyboard类提供了属性,可用于获取当前的键盘状态,例如当前什么键被按下了,并且提供一个方法用于向激活的窗口发送键盘敲击事件。

     

    几个有用的属性包括:

    AltKeyDown - 判断ALT键是否处于按下状态。

    CapsLock -  判断CAPS LOCK键是否处于打开状态。

    CtrlKeyDown - 判断CTRL 键是否处于按下状态。

    NumLock - 判断NUM LOCK键是否处于打开状态。

    ScrollLock - 判断SCROLL LOCK键是否处于打开状态。

    ShiftKeyDown - 判断SHIFT键是否处于按下状态。

     

    Set Keyboard = DotNetFactory.CreateInstance(

    "Microsoft.VisualBasic.Devices.Keyboard", "Microsoft.VisualBasic" )

    Print CBool( Keyboard.AltKeyDown )

    Print CBool( Keyboard.CapsLock )

    Print CBool( Keyboard.CtrlKeyDown )

    Print CBool( Keyboard.NumLock )

    Print CBool( Keyboard.ScrollLock )

    Print CBool( Keyboard.ShiftKeyDown )

     

    注意:在使用DotNetFactory时数据类型必须被转换

    System.Windows.Forms.Control 类
    DeviceReplay的另外一个局限是不能获取当前鼠标(光标)在屏幕的位置。而System.Windows.Forms.Control这个类定义了那些拥有视觉表现的控件的基类。

     

    通过MousePosition属性可以获取当前鼠标光标在屏幕坐标的位置。访问MousePosition属性时,可以返回代表鼠标光标位置的Point数据。

    我的鼠标在哪?
    Set ctlr = DotNetFactory.CreateInstance("System.Windows.Forms.Control")

    For i = 1 To 10

    Wait 2

    Print "1. X=" & ctlr.MousePosition.X & "; Y=" & ctlr.MousePosition.Y

    Next

    Mercury.DeviceReplay的方法
    SendString方法
    描述

    向激活的窗口发送一个或多个键盘按键,就像敲击键盘一样。

    语法

    object.SendString( str )

    参数

    object : Mercury.DeviceReplay对象。

    str : 敲击的字符串。

    返回值

    无。

    例子

    下面的例子会激活记事本(notepad)并输入一段字符:

    Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )

    SystemUtil.Run "notepad.exe", "", "", "open"

    ' ** this line always identifies the notepad window.

    Window( "nativeclass:=Notepad", "index:=0" ).Activate micLeftBtn

    deviceReplay.SendString( "DeviceReplay" )

    Set deviceReplay = Nothing

    KeyDown方法
    描述

    模拟一个按键的按下并保持(相当于Win32的KEY_DOWN事件)。

    语法

    object.KeyDown( key )

    参数

    object : Mercury.DeviceReplay对象。

    key : 按键的数值码。可查阅后面的“Key Codes 参考”。

    返回值

    无。

    例子

    下面的例子会激活记事本(notepad)程序并使用大写和小写的方式输入字符串。注意在发送第一个字符串时,SHIFT键保持被按下的状态:

    Const VK_SHIFT = 42

    Const VK_RETURN = 28

    Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )

    SystemUtil.Run "notepad.exe", "", "", "open"

    Window( "nativeclass:=Notepad", "index:=0" ).Activate micLeftBtn

    ' ** Typing uppercase

    deviceReplay.KeyDown VK_SHIFT

    deviceReplay.SendString( "devicereplay" )

    deviceReplay.PressKey VK_RETURN

    deviceReplay.KeyUp VK_SHIFT

    ' ** Typing in lower case

    deviceReplay.SendString( "devicereplay" )

    Set deviceReplay = Nothing

    提示

    在KeyDown后应该有相应的KeyUp方法的调用。

    KeyDown方法就像人工按下一个按键并保持按下的状态。

    KeyUp方法
    描述

    模拟通过键盘释放某个按下的按键。

    语法

    object.KeyUp( key )

    参数

    object : Mercury.DeviceReplay对象。

    key : 按键的数值码。可查阅后面的“Key Codes 参考”。

    返回值

    无。

    例子

    下面的例子会激活并并使用热键CTRL+O来打开记事本(notepad)的菜单,然后用ESC键关闭对话框。

    Const VK_O = 24

    Const VK_CONTROL = 29

    Const VK_ESCAPE = 1

    Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )

    SystemUtil.Run "notepad.exe", "", "", "open"

    Window( "nativeclass:=Notepad", "index:=0" ).Activate micLeftBtn

    ' ** Typing uppercase

    Wait 1

    ' ** Opening the menu Ctrl + O

    deviceReplay.KeyDown VK_CONTROL

    deviceReplay.PressKey VK_O

    deviceReplay.KeyUp VK_CONTROL

    Wait 2

    ' ** Closing the menu

    deviceReplay.PressKey VK_ESCAPE

    deviceReplay.SendString "Menu Open, was closed."

    Set deviceReplay = Nothing

    提示

    KeyUp方法应该与KeyDown方法配对使用。

    多个KeyUp不会对应用程序造成影响。

    如果需要组合热键,仅需要像人工执行的方式一样即可。

    PressKey方法
    描述

    模拟通过键盘按下一个按键并立即释放。

    语法

    object.PressKey( key )

    参数

    object : Mercury.DeviceReplay对象。

    key : 按键的数值码。可查阅后面的“Key Codes 参考”。

    返回值

    无。

    例子

    下面的例子会激活记事本并使用热键CTRL+O来模拟选择文件打开菜单,然后用ESCAPE按键关闭对话框。

    Const VK_O = 24 : Const VK_F = 33

    Const VK_CONTROL = 29 : Const VK_ESCAPE = 1 : Const VK_MENU = 56

    Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )

    SystemUtil.Run "notepad.exe", "", "", "open"

    Window( "nativeclass:=Notepad", "index:=0" ).Activate micLeftBtn

    Wait 1

    ' ** Opening the menu Alt + F + O

    deviceReplay.PressKey VK_MENU

    deviceReplay.PressKey VK_F

    deviceReplay.PressKey VK_O

    Wait 2

    ' ** Closing the menu

    deviceReplay.PressKey VK_ESCAPE

    deviceReplay.SendString "Open menu was closed."

    Set deviceReplay = Nothing

    PressNKeys方法
    描述

    模拟通过键盘多次按下一个按键并立即释放。

    语法

    object.PressNKey( key, N )

    参数

    object : Mercury.DeviceReplay对象。

    key : 按键的数值码。可查阅后面的“Key Codes 参考”。

    N:重复的次数。

    返回值

    无。

    例子

    例1 – 美国的州

    Option Explicit

    Const VK_RETURN = 28 : Const VK_F = 33 : Const VK_O = 24

    Const VK_TAB = 15 : Const VK_F5 = 63

    Const VK_CAPITAL = 58 : Const VK_NUMLOCK = 69

    Const VK_SUBTRACT = 74 : Const VK_MULTIPLY = 55

    Const VK_MENU = 56

    Dim deviceReplay

    Private Sub SetupKeyboard()

    Const CLASS_NAME = "Microsoft.VisualBasic.Devices.Keyboard"

    Const ASSEMBLY = "Microsoft.VisualBasic"

    Dim Keyboard

    Set Keyboard = DotNetFactory.CreateInstance( CLASS_NAME, ASSEMBLY )

    If CBool( Keyboard.CapsLock ) Then

    deviceReplay.PressKey VK_CAPITAL

    End If

    If CBool( Keyboard.NumLock ) = False Then

    deviceReplay.PressKey VK_NUMLOCK

    End If

    Set Keyboard = Nothing

    End Sub

    Private Sub SetupNotepad()

    deviceReplay.PressKey VK_MENU

    deviceReplay.PressKey VK_O

    deviceReplay.PressKey VK_F

    deviceReplay.SendString "Courier New"

    deviceReplay.PressKey VK_TAB

    deviceReplay.PressKey VK_TAB

    deviceReplay.SendString "14"

    deviceReplay.PressKey VK_RETURN

    Wait 1

    End Sub

    Private Sub PrintRow( ByVal state, ByVal usps, byVal capital )

    deviceReplay.SendString state

  • QTP小知识(转)

    2009-07-28 23:29:43

    1 检查页面是否存在
    对象exist可以检查某一个页面是否存在。
    代码:
    if Browser("…").Page(“…").Exist then
    ‘在运行结果中显示的报告, “micPass”的状态是通过, micFail是不通过
       reporter.ReportEvent micPass ,“页面存在“,”通过“  
       else
       reporter.ReportEvent micFail ,"页面不存在“,"不通过"
    end if

    7.2 防止程序中断的方法
    在回放脚本的时候,有时因为错误导致运行的脚本中断,不能自动运行。为了能达到真正无人职守的状态可以在脚本的最前面加上如下的代码: 
    On error resume next  ‘遇到错误返回到脚本的下一行继续执行。
    On error goto 0 ‘错误处理的控制权,平时是由QTP控制的(这个叫默认的),当有on error resume next 时,是交给on error处理,当on error goto 0时,就换给QTP

    7.3 同步点的设定
    等待某一对象出现后继续执行,为了防止qtp找不到对象而设定同步点。有2种方法:1种是用wait加等待的时间,如wait 5(qtp等待5秒钟后继续执行)。另一种方法是等待要执行对象的出现,如果出现就继续执行,否则一直等待,代码如下:
    y=......waitproperty("visible",true,10000)
    If y=true then
       ‘执行下一条语句
       else
        ’对象不出现就一直等待,直到过了10000秒后程序找不到对象报错
    End if

    7.4 截屏
    在优化脚本时,如果想查看某一页面在执行后的页面效果,可以采取截屏的办法截取当前的操作页面并保存到本地。代码:
        desktop. capturebitmap “c:\***.bmp“,ture     ’在脚本中想要查看的一行插入,运行后图片保存到设置的路径下
    7.5 导入execl文件并参数化数据方法
    Qtp自带了datatable表,可以把要参数化的数据写在里面,但这样写脚本和数据不能分离,后期不好维护脚本。现在采用从外部导入execl文件的方法导入数据。代码如下:
       datatable.ImportSheet “D:\...\data.xls”,“sheet1”,“global“ 
       ‘第一个参数是要导入文件的路径,第二个是execl的第一个表格,第三个参数是在execl的全局范围内查找

       另外datatable对象还有很多操作,比如:获取表中字段的行数,插入表数据,删除数据等,下面是获取表中数据的代码:datatable("A","dtglobalsheet)
    7.6 为描述性编程自动创建注释
       当希望在每一个新建action时都增加一些头部说明,比如作者、创建日期、说明等信息,那么用action template 来实现最简单快捷。 方法:用记事本等文本编辑器,输入如下类似的内容:           'Company:东方般若            'Date: Date          然后将文件保存为ActionTemplate.mst,并存放到QTP安装目录下的dat目录。

    7.7 导入vbs文件
    想要实现脚本的函数化,并更好的维护它,可以把一些公用的函数写到vbs里面,用qtp来调用它。
    实现调用vbs的方法有2种:
    1.函数executefile加vbs文件的路径
      executefile “c:\...\funcation.vbs”

    2.设置QTP test/settings/resources/+函数目录

    7.8 时间差函数

    统计两个日期时间段之间的间隔,还有多少小时
    Dim timediff
    timediff=datediff(“H”,now,“2008-8-8” )
    Print timediff
    7.9 获取web下拉框中数据的行数和数据值
    1.获取行数:首先将webtable添加到对象库中,查看对象库里有该webtable的属性后
    count=Browser("…").Page("Page").Frame("…").WebTable("...").RowCount
       Msgbox count ‘查看行数
    2.获取数据值,
       for i=1 to  count    
    value=Browser("…").Page("Page").Frame("…").WebTable("...").getcelldata(i,1)
       msgbox value
       next
    获取到列表中的数值后,qtp的对象库中没有这个WebElement的对象,一般采用描述性编程的方法获取对象,比如:用getcelldata获取的表中数据的innertext属性是“普通岗”,那么就可以用如下代码:
    for i=1 to  count    
       value=Browser("…").Page("Page").Frame("…").WebTable("...").getcelldata(i,1)
     
       Browser(“…”).Page(“Page”).Frame(“…”). WebElement(“innertext:=“&value,”index:=1”).click
    next

    7.10 对象获得焦点
    判断某个webedit输入框是否获取了焦点,如果没有获取就给它焦点,然后输入数值。代码如下:

    if not browser("**").page(“**").webedit(“
    **").object.isdisabled  then
             .object.focus
             .object.set "输入数值“

    7.11 获取对象当前属性值
    用GetROProperty可以获取对象的当前属性值,比如一些对象的属性经常发生变化,用getroproterty就能定位对象当前的属性状态来执行相应的操作。
    Dim pro
    pro= browser("**").page(“**").webedit(“
      **“). GetROProperty(“property”,value)
    Msgbox pro ‘弹出窗口,查看获取的属性。

    7.12 Systemutil对象的应用
    利用systemutil可以实现的功能:回放qtp脚本时禁止鼠标和键盘的输入;打开应用程序或web;通过句柄关闭进程;通过进程名关闭进程等。下面的代码是打开百度网页:
      systemutil.run “iexplore.exe”,“http://www.baidu.com”,“”,“”,“”,3        ‘打开百度的首页,最后面的参数“3” 代表打开ie后最大化

       SystemUtil.CloseProcessByName(“iexplore.exe”)      ‘关闭ie

       
    7.13 Action的使用
    action分为内部调用和外部调用2种方法:内部调用使用split划分;外部调用时被调用的action设置成share,并共享对象库。
       split action:RunAction "action", oneIteration
    7.14.  随即数

    在测试中有时会用到随即数,有多种方法:
       
    第一种 :n=randomnumber.value(1,255)  ’n的值从1到255之间随即产生

    第二种 :randomize      ‘更新反回的数据          dim n
                 n=int (10*rnd())
                 msgbox n        ‘n为10以内的整数


    7.15 “is+*”类型功能
       isarray'是否是数组 isconnected'判断QTP是否连接到TD isdate'是否是合法的日期类型 isempty'判断是否初始化 isNull'判断是否为空值 isNumeric'判断是否是数字型 isobject'判断是否一个功能对象 isready'判断设备是否准备就绪 isRootFolder'是否是根目录
    7.16 对象库

    打开对象库resources->object repository,或者用快捷方式:ctrl+r来打开。

    1.Qtp中的对象库和脚本是一一对应的,如果脚本中某个对象在对象库中不存在,则无法回放成功,会提示找不到对象。

    2.对无法识别的对象用spy工具获得后添加到对象库中。

    3.有时候脚本回放失败就是找不到对象的原因,可以通过用spy工具查看找不到对象的属性,然后打开对象库,比较二者的属性信息,如果属性有不相同的说明就是属性的原因,可以通过更改属性的方式统一对象属性。

    7.17 调试脚本

    1.脚本编写完毕,可以用按ctrl+f7来查看脚本是否有语法错误。

    2. Msgbox和print:在回放脚本时可以方便的查看自己想看到的信息。


    3.设置断点:为了测试某一小段脚本的功能,而当整个action很长的时
    候,可以设置断点单步debug。
    7.18 强制退出
    遇到问题退出可以用exittest或 exit for,例如下面代码:

    Public function text_exit()
         for i=0 to 10
                if i=3 then
                    exittest
                    ‘exit for
                end if
         next
    End function

    Text_exit()
          
    7.19 连接数据库_增删改
    Dim conn,strSql    '定义变量
    set conn = CreateObject("ADODB.Connection")   '创建连接
    conn.ConnectionString="Provider=SQLOLEDB.1;Password=isaac121379;Persist Security Info=True;User ID=sa;Initial Catalog=WisdomCRM;Data source=192.168.12.29"   '设置连接字符串
    conn.open  '开启连接
    'strSql="insert into UM_User  values(1,'UserID')"  '设置插入语句
    strSql="drop  table TM_Task_14_Target"
    'strSql="select *  from UM_User"

    If conn.state=0 Then   '如果连接状态为0,表示连接失败,写入reporter对象中,否则表示连接成功
        Reporter.ReportEvent micFail,"testing","数据库连接失败"
        conn.close
        Set conn = nothing
    else
       Reporter.ReportEvent micPass,"testing","数据库连接成功"
       conn.execute strSql    '执行更新语句
       conn.close
       Set conn = nothing
    End If
    7.20 连接数据库_查
    Dim conn,res,strSql    '定义变量
    set conn = CreateObject("ADODB.Connection")   '创建连接
    conn.ConnectionString="Provider=SQLOLEDB.1;Password=isaac121379;Persist Security Info=True;User ID=sa;Initial Catalog=WisdomCRM;Data source=192.168.12.29"  '设置连接字符串
    conn.open  '开启连接
    Set res = CreateObject("ADODB.RecordSet")   '创建一个记录集对象
    strSql="select * from UM_User"  '设置查询雨具
    If conn.state=0 Then   '如果连接状态为0,表示连接失败,写入reporter对象中,否则表示连接成功
        Reporter.ReportEvent micFail,"testing","数据库连接失败"
        res.close                               '关闭结果集和连接,并且置为空
        Set res = nothing
        conn.close
        Set conn = nothing
    else
       Reporter.ReportEvent micPass,"testing","数据库连接成功"
       res.open strSql,conn    '执行查询语句
       res.MoveFirst        '将记录集游标指到记录集的最开始
       Do
          Reporter.ReportEvent micPass,"file",cstr(res(0))+" : "+cstr(res(1))  '循环遍历查询结果,并且保持到reproter对象中,直到记录集到达末尾,循环结束
          res.MoveNext
       Loop until res.eof = true
       res.close
       Set res = nothing
       conn.close
       Set conn = nothing
    End If
    低级录制
    在无法识别对象时使用
    利用Vbs运行外部程序
    WSH也就是用来解析Vbs的宿主,本身包含了几个个常用对象:
    1、scrīpting.FileSystemObject  —>  提供一整套文件系统操作函数
    2、scrīpting.Dictionary  —>  用来返回存放键值对的字典对象
    3、Wscrīpt.Shell  —>  提供一套读取系统信息的函数,如读写注册表、查找指定文件的路径、读取DOS环境变量,读取链接中的设置
    4、Wscrīpt.NetWork  —>
    提供网络连接和远程打印机管理的函数。(其中,所有scrīpting对象都存放在SCRRUN.DLL文件中,所有的Wscrīpt对象都存放在WSHOM.ocx文件中。)
    现在我们需要的是第三个对象,好了,让我们先连接一下对象看看,在记事本的编辑窗口中输入:
    Set ōbjShell = CreateObject(“Wscrīpt.Shell”)
    objShell.Run “notepad”
    Objshell.run “calc”
    自建日志
    Public Sub logfile(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 ="f:\log.txt"
    If Not (fileSystemObj.FileExists(filespec)) Then
    Set logFile = fileSystemObj.CreateTextFile(fileSpec, ForWriting, True)
    logFile.WriteLine("###############################################")
    logFile.WriteLine (currentDate & currentTime & " Test: " & environment.Value("TestName") )
    logFile.WriteLin("######################################")
    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
    logfile(“ok")
    Vb6生成dll
    Environment对象
    检查页面文字显示颜色
    Set Elements = Browser(“WisdomCRM客户关系管理系统”).Object.Document.all.tags(“div”)’tags(“td”)为在td中检查
    For each Element in Elements
      If Element.InnerText="执行团队" Then
        strhtml=Element.Innerhtml
        n=instr(strhtml,"color=red")
        If n=0 Then
          msgbox "Text color is red!"
       exit for
        End If
      End If
    Next
    关闭重复的页面
    Dim loginwin
    Set loginwin = descrīption.Create()                                                  '创建对象名为loginwin的对象
    loginwin( "name").value="WisdomCRM客户关系管理系统"   ',对象属性及值


    Set child=desktop.ChildObjects (loginwin)
    cout=child.count
    msgbox cout
    For i=1 to cout
       child(i-1).close  '循环寻找这个对象
    Next
    获取当前测试的路径
    Path = environment("TestDir")'获取当前测试的路径
    msgbox path
    获取本机ip
    set IPConfigSet = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _
    ("select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")

    for each IPConfig in IPConfigSet
    if Not IsNull(IPConfig.IPAddress) then
    for i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
    Msgbox IPConfig.IPAddress(i)
    next
    end if
    next
    点亮对象
    highlight
    fireEvent用法
    针对Link对象,onmouseover时间, 还有onchange, onclick, ondblclick, onblur, onfocus, onmousedown, onmouseup, onmouseout, onsubmit, onreset, onpropertychange事件可以使用
    sendkeys实例
    Set wshshell=createobject(“wscrīpt.shell”)
    其使用格式为:object.SendKeys string “object”:表示WshShell对象 “string”:表示要发送的按键指令字符串,需要放在英文双引号中。 1.基本键   一般来说,要发送的按键指令都可以直接用该按键字符本身来表示,例如要发送字母“x”,使用“WshShell.SendKeys "x"”即可。当然,也可直接发送多个按键指令,只需要将按键字符按顺序排列在一起即可,例如,要发送按键“happy”,可以使用“WshShell.SendKeys "happy"”。
    sendkeys实例
    2.特殊功能键 对于需要与Shift、Ctrl、Alt三个控制键组合的按键,SendKeys使用特殊字符来表示: Shift---------WshShell.SendKeys "+" Ctrl---------WshShell.SendKeys "^" Alt---------WshShell.SendKeys "%" 由于“+”、“^”这些字符用来表示特殊的控制按键了,如何表示这些按键呢? 只要用大括号括住这些字符即可。例如: 要发送加号“+”,可使用“WshShell.SendKeys "{+}"” 另外对于一些不会生成字符的控制功能按键,也同样需要使用大括号括起来按键的名称,例如要发送回车键,需要用“WshShell.SendKeys "{ENTER}"”表示,发送向下的方向键用“WshShell.SendKeys "{DOWN}"”表示。 Space---------WshShell.SendKeys " " Enter---------WshShell.SendKeys "{ENTER}" ←---------WshShell.SendKeys "{RIGHT}" ↑---------WshShell.SendKeys "{UP}" F1---------WshShell.SendKeys "{F1}" Tips:如果需要发送多个重复的单字母按键,不必重复输入该字母,SendKeys允许使用简化格式进行描述,使用格式为“{按键 数字}”。例如要发送10个字母“x”,则输入“WshShell.SendKeys "{x 10}"”即可。

    先录制取得初始脚本,再做简单的修改和参数化,再进行封装形成可重用的函数,最后回放调试,形成了最终的脚本。
  • ORA-01950: 对表空间 'USERS' 无权限

    2009-07-27 18:05:00

    创建新的用户时,要指定default   tablespace,否则它会把system表空间当成自己的缺省表空间。这样做是不提倡的。估计原来创建某个用户的时候没有指定缺省表空间,而现在它使用系统表空间的权限被DBA给收回了。  
      先用的简单的办法试试,一般缺省的ORACLE安装都是有USERS表空间的。  
      比如你要在用户(或SCHEMA)usera中建表,那么你用SYSTEM登录ORACLE后,执行如下SQL  
       
      ALTER   USER   usera   QUOTA   UNLIMITED   ON   USERS;  
      如果没有USERS表空间,则会报错,你可以找一个其他的表空间,从v$tablespace可以看到所有的表空间。

     

    下面情况sany用户开始创建的时候没有制定default tablespace   ********


    SQL> connect sany/as646333
    已连接。
    SQL> select * from user_sys_privs
      2  ;

    USERNAME                       PRIVILEGE                                ADM
    ------------------------------ ---------------------------------------- ---
    SANY                           CREATE SESSION                           NO
    SANY                           EXECUTE ANY PROCEDURE                    NO
    SANY                           CREATE USER                              NO
    SANY                           CREATE TABLE                             NO

    SQL> create table bjwh(user_id number(5),user_name varchar2(20),phone varchar2(12),email varchar2(20
    ));
    create table bjwh(user_id number(5),user_name varchar2(20),phone varchar2(12),email varchar2(20))
    *
    第 1 行出现错误:
    ORA-01950: 对表空间 'USERS' 无权限


    SQL> connect system/oracle
    已连接。
    SQL> alter user sany quota unlimited on users;

    用户已更改。

    SQL> connect sany/as646333
    已连接。
    SQL>  create table bjwh(user_id number(5),user_name varchar2(20),phone varchar2(12),email varchar2(2
    0));

    表已创建。

    SQL> disconnect
    从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining options 断开
    SQL> desc bjwh
    SP2-0640: 未连接
    SP2-0641: "DESCRIBE" 需要连接至服务器
    SQL> connect sany/as646333
    已连接。
    SQL> desc bjwh
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     USER_ID                                            NUMBER(5)
     USER_NAME                                          VARCHAR2(20)
     PHONE                                              VARCHAR2(12)
     EMAIL                                              VARCHAR2(20)

     

    问题解决。

  • QTP使用EXCEL对象(转)

    2009-07-24 16:19:19

    一、Excel对象模型

      为了在VB应用程序中调用Excel,必须要了解Excel对象模型。Excel对象模型描述了Excel的理论结构,所提供的对象很多,其中最重要的对象,即涉及VB调用Excel最可能用到的对象有:



      二、调用Excel

      在VB应用程序中调用Excel,实质是将Excel作为一个外部对象来引用,由Excel对象模型提供能从VB应用程序内部来程序化操纵的对象以及相关的属性、方法和事件。

      1、在VB工程中添加对Excel类型库的引用

      为了能从VB应用程序中访问Excel丰富的内部资源,使Excel应用程序运行得更快,需要在VB工程中添加对Excel类型库的引用。具体步骤如下:

      a)从VB5“工程”菜单中选择“引用”;

      b) 在“引用”对话框中选择Excel类型库:"Microsoft Excel9.0 Object Library";

      c)单击左边小方框,使之出现“√”符号;

      d)按“确定”退出。

      注:要想在VB应用程序中调用Excel,你的计算机系统中必须安装Excel。

      2、引用Application对象

      Application对象是Excel对象模型的顶层,表示整个Excel应用程序。在VB应用程序中调用Excel,就是使用Application对象的属性、方法和事件。为此,首先要声明对象变量:

    Dim VBExcel As Object

      或直接声明为Excel对象:

    Dim VBExcel As Excel.Application

      在声明对象变量之后,可用CreateObject函数或GetObject函数给变量赋值新的或已存在的Application对象引用。

      a)用CreateObject函数生成新的对象引用:

    Set VBExcel=CreateObject ("Excel.Application")

      字符串“Excel.Application”是提供Excel应用程序的编程ID,这个变量引用Excel应用程序本身。

      b)用Getobject函数打开已存在的对象引用:

    Set AppExcel=GetObject("SAMP.XLS")

      上面语句打开文件SAMP.XLS。

      3、Application对象常用的属性、方法

    属性、方法 方法
    Visible属性 取True或False,表明Excel应用程序是否可见。
    Left,Top属性 Excel窗口的位置;
    Height, Width属性 Excel窗口的大小;
    WindowState属性 指定窗口的状态,取:XIMaximized(最大化)X1 Minimized(最小化)x1 Normal(缺省)。
    Quit方法 退出Microsoft Excel;
    Calculate方法 重新计算所有打开的工作簿、工作表或单元格。
    Evaluate方法 求值数学表达式并返回结果。

      示例1:求值数学表达式:

    Dim VBExcel As Object
    Set VBExcel=CreateObject ("Excel.Application")
    X=VBExcel. Evaluate ("3+5*(cos (1/log (99. 9)))")

    三、使用Excel应用程序

      如前所述,在VB应用程序中调用Excel应用程序,就是使用Application对象的属性、方法和事件。下面分类给出其中常用的属性和方法。

      1、使用工作薄

      Workbook对象代表Excel应用程序中当前打开的一个工作簿,包含在Workbooks集合中。可以通过Workbooks集合或表示当前活动工作簿的Active Workbook对象访问Workbook对象。

      常用的方法有:

    属性、方法 意义
    Add方法 创建新的空白工作簿,并将其添加到集合中。
    Open方法 打开工作簿。
    Activate方法 激活工作簿,使指定工作簿变为活动工作簿,以便作为Active Workbook对象使用。
    Save方法 按当前路径和名称保存现有工作簿(如是首次保存,则将其保存到缺省名称中,如BOOK1.XLS)。
    SaveAs方法 首次保存工作簿或用另一名称保存工作簿。
    Close方法 关闭工作簿。
    PrintOut方法 打印工作簿,语法为:

    PrintOut (from, To, Copies, Preview, Printer, ToFile, Collate)

      可选参数:

     From:打印的起始页号。如省略将从起始位置开始打印。
     To:打印的终止页号。如省略将打印至最后一页。
     Copies:要打印的份数。如省略将只打印一份。
     Preview:如果为True则Excel打印指定对象之前进行打印预览。如果为False,或省略则立即打印该对象。
     Printer:设置活动打印机的名称。
     ToFile:如果为True则打印输出到文件。
     Collate:如果为True则逐份打印每份副本。

      下面语句将活动工作簿的2到5页打印3份:

    ActiveWorkbook.PrintOut From:=2 To 5 Copies:=3

      示例2:生成、保存、关闭工作簿

    Dim VBExcel As Excel.Application
    Set VBExcel== CreateObject("Excel.Application")
    With VBExcel
    .Workbooks.Add
    With ActiveWorkbook
    .Save As"C: \Temp \OUTPUT.XLS"
    .Close
    End With
    .Quit
    End With

      2、使用工作表

      Sheets集合表示工作簿中所有的工作表。可以通过Sheets集合来访问、激活、增加、更名和删除工作表。一个Worksheet对象代表一个工作表。

      常用的属性、方法有:

    属性、方法 意义
    Worksheets属性 返回Sheets集合。
    Name属性 工作表更名。
    Add方法 创建新工作表并将其添加到工作簿中。
    Select方法 选择工作表。
    Copy方法 复制工作表。
    Move方法 将指定工作表移到工作簿的另一位置。
    Delete方法 删除指定工作表。
    PrintOut方法 打印工作表。

      示例3:将C盘工作簿中的工作表复制到A盘工作簿中:

    Dim VBExcel As Excel.Application
    Set VBExcel=CreateObject("Excel.Application")
    With VBExcel
     .Workbooks.Open "C:\Temp\OUTPUT.XLS"
     .Workbooks.Open"A:\OUTPUT1.XLS"
     .Workbooks("OUTPUT.XLS").Sheets ("Sales").Copy
     .Workbooks("OUTPUT1.XLS)
     .Workbooks("OUTPUT1.XLS").Save
     .Workbooks("OUTPUT.XLS").Close
     .Workbooks("OUTPUTI.XLS").Close
     .Quit
    End With

      3、使用单元范围

      Range对象代表工作表的某一单元格、某一行、某一列、某一选定区域或者某一三维区域。

      常用的属性、方法有:

    属性、方法 意义
    Range属性 Range (arg)其中arg为A1--样式符号,表示单个单元格或单元格区域。
    Cells属性 Cells (row, col )(其中row为行号,col为列号)表示单个单元格。
    ColumnWidth属性 指定区域中所有列的列宽。
    Rowl3eight属性 指定区域中所有行的行宽。
    Value属性 指定区域中所有单元格的值(缺省属性)。
    Formula属性 指定单元格的公式,由A1--样式引用。
    Select方法 选择范围。
    Copy方法 将范围的内容复制到剪贴板。
    C1earContents方法 清除范围的内容。
    Delete方法 删除指定单元范围。

      4、使用图表

      Chart对象代表工作簿中的图表。该图表既可为嵌人式图表(包含于ChartObject对象中)也可为分立的图表工作表。

      常用方法有:

    方法

    意义

    Add方法 新建图表工作表。返回Chart对象。
    PrineOut方法 打印图表。
    ChartWizard方法 修改给定图表的属性,其语法为:
     
    ChartWizard(Source, Gallery, Format, P1otBy, CategoryLabels,
    SeriesLabels, HasLegend, Title, CategoryTitle, ValueTitle, ExtraTitle)

      其中:

      Source:包含新图表的源数据的区域。如省略,将修改活动图表工作表或活动工作表中处于选定状态的嵌人式图表。

      Gallery:图表类型。其值可为下列常量之一:xlArea, x1Bar, xlColumn, xlLine, x1Pie, xlRadar,x1XYScatter, xlCombination, x13DArea, x13DBar、x13DColumn, x13DLine, x13DPie、x13 DSurface、xlDoughnut或xlDefaultAutoFormat。

      Format:内置自动套用格式的编号。如省略,将选择默认值。

      P1otBy:指定系列中的数据是来自行(xlRows)还是列(xlColumns)。

      CategoryLabels:表示包含分类标志的源区域内行数或列数的整数。

      SeriesLabels:表示包含系列标志的源区域内行数或列数的整数。

      HasLegend:若指定True,则图表将具有图例。

      Title:图表标题文字。

      CategoryTitle:分类轴标题文字。

      ValueTitle:数值轴标题文字。

      ExtraTitle:三维图表的系列轴标题,或二维图表的第二数值轴标题。

      可组合使用Add方法和ChartWizard方法,以创建包含工作表中数据的图表工作表。下例基于工作表“Sheetl”中单元格区域“A1:A20”中的数据生成新的折线图并打印。

    With Charts.Add
     .ChartWizard source:=Worksheets ("sheet1").Range ("a1:a20"),gallery:=xlLine, title:=“折线图表”
     .Printout
    End With


      5、使用Excel工作表函数

      在VB语句中可使用大部分的Excel工作表函数,可通过WorksheetFunction对象调用Excel工作表函数。下面的Sub过程用Min工作表函数求出指定区域中单元格的最小值,并通过消息框显示结果值。

    Sub UseFunction()
    Dim myRange As Range
    Set myRange=Worksheets ("Sheet1").Range("B2:F10")
    answer=Application.WorksheetFunction.Min(myRange)
    MsgBox answer
    End Sub

      如果使用以区域引用为参数的工作表函数,必须指定一个Range对象。如可用Match工作表函数对A1:A10区域的所有单元格进行搜索。

    Sub FindFirst()
    my Var=Application.WorksheetFunction.Match (9, Worksheets( 1).Range("A1:A10"),0)
    MsgBox myVar
    End Sub

      要在单元格中插人工作表函数,可将该函数指定为对应于Range对象的Formula属性值。在以下示例中,将当前工作簿Sheetl内A1:B3区域的Formula属性指定为RAND工作表函数(此函数产生二个随机数)。

    Sub InsertFormula()
    Worksheets ("Sheet1" ).Range("A1:B3").Formula="RAND()"
    End Sub

  • QTP日常详细函数库(转)

    2009-06-26 17:50:19

    '''以下为QuickTest和Robot都适用函数''''''''''''''''''''''''''''''''''
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    '获取当前日期
    Public Function Get_Data()
     Dim currentDate
     currentDate = Date
     Get_Data = currentDate
    End Function

    '获取当前时间
    Public Function Get_Time()
     Dim currentTime
     currentTime = Time
     Get_Time = currentTime
    End Function

    '随机函数生成
    '输入值:生成值范围 i~j
    '返回值:随机数
    Public Function Get_RandNum(fromNum,toNum)
     If (fromNum<0) Or (toNum<0) Then
      MsgBox "只接受大于零的输入"
     ElseIf fromNum>toNum then
      MsgBox "起始值必须小于结束值"
     Else
      Dim RunTime
      Randomize  
      RunTime = Int((10 * Rnd) + 1)
      Dim MyValue,i
      For i = 1 To RunTime
       Randomize 
       MyValue = Int(((toNum - fromNum + 1) * Rnd) + (fromNum))
      Next
        Get_randNum=MyValue
       End If
    End Function

    '值交换函数
    Public Sub swap(byref a,byref b)
     Dim c
     c = a
     a = b
     b = c
    End Sub

    '是否是质数函数
    '是质数返回true,否则返回false
    Function IsPrimeNumber(num)
     Dim i,flag
     flag = true
     If num = 1 Then
      flag = False
     ElseIf num < 1 Then
      MsgBox "只能接受大于0的数"
      flag = False
     Else
      For i = 2 To (num - 1)
       If ((num Mod i) = 0) Then
        flag = False
        Exit For
       End If
      Next
     End If
     IsPrimeNumber = flag
    End Function

    '读指定文本文件指定行内容
    Function ReadLine(pathway, rowcount)
     Dim fso,myfile,i,flag
     flag = 1
     Set fso=CreateObject("scripting.FileSystemObject")
     If fso.FileExists(pathway) then
      Set myfile = fso.openTextFile(pathway,1,false)
     Else
      flag = 0
     End If
     
     For i=1 to rowcount-1
      If Not myfile.AtEndOfLine Then
       myfile.SkipLine
      End If
     Next
     
     If flag = 1 then
      If Not myfile.AtEndOfLine Then
       ReadLine = myfile.ReadLine
      Else
       ReadLine = "文本越界"
      End If
      myfile.close
     Else
      ReadLine = "文件不存在"
     End If
    End Function

    '随机生成字符串
    Function MakeString(inputlength)
     Dim I,x,B,A
     If IsNumeric(inputlength) Then
     For I = 1 To inputlength
      A = Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
      Randomize
      x=Get_RandNum(0,35)
      B = A(x)
      makestring =makestring +B
     Next
      MakeString = makestring
     else
      msgbox ("只接受数字输入")
     End If
    End Function

    '启动资源管理器
    Sub ZYGLQ()
     Dim WshShell
     set WshShell = CreateObject("Wscript.Shell")
     WshShell.SendKeys "^+{ESC}"
     Set WshShell = nothing
    End Sub

    '启动运行
    Sub Run()
     Dim WshShell
     set WshShell = CreateObject("Wscript.Shell")
     WshShell.SendKeys "^{ESC}R"
     Set WshShell = nothing
    End Sub

    '发送电子邮件
    Function SendMail(SendTo, Subject, Body, Attachment)
     Dim ol,mail
        Set l=CreateObject("Outlook.Application")
        Set Mail=ol.CreateItem(0)
        Mail.to=SendTo
        Mail.Subject=Subject
        Mail.Body=Body
        If (Attachment <> "") Then
            Mail.Attachments.Add(Attachment)
        End If
        Mail.Send
        ol.Quit
        Set Mail = Nothing
        Set l = Nothing
    End Function

    '去掉字符串中的重复项
    Function NoRepeat(Inp,Sp)
    Dim aa,flag,words,length,i,j,k,sp1,sp2,cc
     aa = Inp
     Do
      flag = False
      words = Split(aa,Sp)
      length = UBound(words)
      For i = 0 To (length -1)
       sp1 = words(i)
       For j = (i+1) To length
        sp2 = words(j)
        If sp1 = sp2 Then
         flag = True
         aa = ""
         For k = 0 To (j-1)
          aa = aa & words(k) & sp
         Next
         For k = (j + 1) To length
          aa = aa & words(k) & sp
         Next
        
         cc = Len(aa)
         aa = Left(aa,(cc - 1))
        End If
       Next
       If flag = True Then
        Exit For
       End if
      Next
     Loop Until flag = false
     NoRepeat = aa
    End Function

    '求字符串长度(中文算2个西文字符)
    Function GetLen(Str)
            Dim singleStr, i, iCount
            iCount = 0
            For i = 1 to len(Str)
                    singleStr = mid(Str,i,1)
                    If asc(singleStr) < 0 Then
                            iCount = iCount + 2
                    Else
                            iCount = iCount + 1
                    End If  
            Next
            GetLen = iCount
    End Function

    '运行指定程序
    Sub RunApp(command)
     Dim WshShell
     set WshShell = CreateObject("Wscript.Shell")
     WshShell.Exec command
    End Sub

    '求下一天是几号的函数
    Function Nextday(ByVal inputday)
        Dim temp, num, OPYear, OPMonth, OPDay, ret, flag
        temp = Split(CStr(inputday), "-")
        num = UBound(temp) + 1
        PYear = temp(0)
        PMonth = temp(1)
        PDay = temp(2)
        flag = 0

        If PMonth = 1 Or PMonth = 3 Or PMonth = 5 Or PMonth = 7 Or PMonth = 8 Or PMonth = 10 Or PMonth = 12 Then
            If OPDay > 31 Or OPDay < 1 Then
                flag = 1
            End If
        ElseIf PMonth = 4 Or PMonth = 6 Or PMonth = 9 Or PMonth = 11 Then
            If OPDay > 30 Or OPDay < 1 Then
                flag = 1
            End If
        Else
            If ISLeapYear(OPYear) Then
                If OPDay > 29 Or OPDay < 1 Then
                    flag = 1
                End If
            Else
                If OPDay > 28 Or OPDay < 1 Then
                    flag = 1
                End If
            End If
        End If

        If flag = 1 Or num <> 3 Then
            MsgBox "输入参数不对劲", , "Nextday函数提示"
        Else
            If PMonth = 1 Or PMonth = 3 Or PMonth = 5 Or PMonth = 7 Or PMonth = 8 Or PMonth = 10 Or PMonth = 12 Then 'big month
                If PDay = 31 Then
                    PDay = 1
                    If PMonth = 12 Then
                        PMonth = 1
                        PYear = OPYear + 1
                    Else
                        PMonth = OPMonth + 1
                        PYear = OPYear
                    End If
                Else
                    PDay = OPDay + 1
                End If
            ElseIf PMonth = 4 Or PMonth = 6 Or PMonth = 9 Or PMonth = 11 Then                                          'small month
                If PDay = 30 Then
                    PDay = 1
                    If PMonth = 12 Then
                        PMonth = 1
                        PYear = OPYear + 1
                    Else
                        PMonth = OPMonth + 1
                        PYear = OPYear
                    End If
                Else
                    PDay = OPDay + 1
                End If
            Else                                                                                                           'February
                If ISLeapYear(OPYear) Then
                    If PDay = 29 Then
                        PDay = 1
                        If PMonth = 12 Then
                            PMonth = 1
                            PYear = OPYear + 1
                        Else
                            PMonth = OPMonth + 1
                            PYear = OPYear
                        End If
                    Else
                        PDay = OPDay + 1
                    End If
                Else
                    If PDay = 28 Then
                        PDay = 1
                        If PMonth = 12 Then
                            PMonth = 1
                            PYear = OPYear + 1
                        Else
                            PMonth = OPMonth + 1
                            PYear = OPYear
                        End If
                    Else
                        PDay = OPDay + 1
                    End If
                End If
            End If
            ret = OPYear & "-" & OPMonth & "-" & OPDay
            Nextday = ret
        End If
    End Function

    '是否闰年
    Function ISLeapYear(ByVal inYear)
        If ((inYear Mod 4 = 0 And inYear Mod 100 <> 0) Or inYear Mod 400 = 0) Then
            ISLeapYear = True
        Else
            ISLeapYear = False
        End If
    End Function

    '计算两个日期之间相隔几天
    Function Days(ByVal SourceData, ByVal DesData)
        Dim flag, temp1, temp2, OPYear1, OPYear2, OPMonth1, OPMonth2, OPDay1, OPDay2, i, tempDay
        temp1 = Split(SourceData, "-")
        temp2 = Split(DesData, "-")
        If ((UBound(temp1) + 1) <> 3) Or ((UBound(temp2) + 1) <> 3) Then
            MsgBox "输入参数不对劲", , "Days函数提示"
        End If
        OPYear1 = temp1(0)
        OPMonth1 = temp1(1)
        OPDay1 = temp1(2)
        OPYear2 = temp2(0)
        OPMonth2 = temp2(1)
        OPDay2 = temp2(2)
        If CInt(OPYear1) <> CInt(OPYear2) Then
            If CInt(OPYear1) > CInt(OPYear2) Then
                flag = "big"
            ElseIf CInt(OPYear1) < CInt(OPYear2) Then
                flag = "small"
            End If
        Else
            If CInt(OPMonth1) <> CInt(OPMonth2) Then
                If CInt(OPMonth1) > CInt(OPMonth2) Then
                    flag = "big"
                ElseIf CInt(OPMonth1) < CInt(OPMonth2) Then
                    flag = "small"
                End If
            Else
                If CInt(OPDay1) <> CInt(OPDay2) Then
                    If CInt(OPDay1) > CInt(OPDay2) Then
                        flag = "big"
                    ElseIf CInt(OPDay1) < CInt(OPDay2) Then
                        flag = "small"
                    End If
                Else
                    flag = "="
                End If
            End If
        End If

        If (flag = "big") Then
            i = 1
            tempDay = DesData
            Do
                tempDay = Nextday(tempDay)
                i = i + 1
            Loop Until tempDay = SourceData
            i = i - 1
        ElseIf (flag = "small") Then
            i = 1
            tempDay = SourceData
            Do
                tempDay = Nextday(tempDay)
                i = i + 1
            Loop Until tempDay = DesData
            i = i - 1
        Else
            i = 0
        End If

        Days = i
    End Function

    '检查身份证号是否正确
    Function Identification(Text1)
    xian = Text1
    If (Not IsNumeric(Left(Text1, 15)) And Not IsNumeric(Left(Text1, 18))) Or Text1 = "" Then
      Identification = False
      Exit Function
    End If
    lenx = Len(Trim(Text1))
    If lenx = 15 Or lenx = 18 Then
        If lenx = 15 Then
            yy = "19" & Mid(xian, 7, 2)
            mm = Mid(xian, 9, 2)
            dd = Mid(xian, 11, 2)
            aa = Right(xian, 1)
        End If
        If lenx = 18 Then
            yy = Mid(xian, 7, 4)
            mm = Mid(xian, 11, 2)
            dd = Mid(xian, 13, 2)
            aa = Right(xian, 1)
        End If
        If CInt(mm) > 12 Or CInt(dd) > 31 Then
           Identification = False
           Exit Function
        Else
         Identification = True
         Exit Function
        End If
    Else
      Identification = False
      Exit Function
    End If
    End Function

    '检查是否存在数字
    Function checkString (myString)
     checkString = False
     Dim myChr
     For myChr = 48 to 57
      If InStr(myString,Chr(myChr)) > 0 Then
       checkString = True
       Exit Function
      End If
     Next
    End Function

    '查询Access数据库字符出现次数
    Function Access_GetCount(DBlocation,TableName,Value)
     set con=createobject("adodb.connection")
     con.open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & DBlocation
     set record = createobject("adodb.recordset")
     sql="select * from " & TableName
     
     record.open sql,con
     DO
      if(record("name")=Value)then
       num=num+1
      end If
      record.MoveNext
     loop until record.eof=True
     
     record.close
     set record=Nothing
     con.close
     set con=Nothing
     
     If num = 0 Then
      Access_GetCount = 0
     Else
      Access_GetCount = num
     End If
    End Function

    '按ASCII码值冒泡排序
    Function BubbleSort(VString,Spl,Func)
     Dim Str,StrLength,i,j
     Str = Split(VString,Spl)
     StrLength = UBound(Str) + 1
     For i = 1 To (StrLength-1)
      For j = (i+1) To StrLength
       If Func = 1 then
        If Asc(Str(i-1)) < Asc(Str(j-1)) Then
         Call Swap(Str(i-1),Str(j-1))
        End If
       Else
        If Asc(Str(i-1)) > Asc(Str(j-1)) Then
         Call Swap(Str(i-1),Str(j-1))
        End If
       End If
      Next
     Next
     j = ""
     For i = 1 To StrLength
      j = j & Str(i-1) & Spl
     Next
     j = Left(j,(StrLength * 2 -1))
     BubbleSort = j
    End Function


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '''以下为仅QuickTest适用函数'''''''''''''''''''''''''''''''''''''''''
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    '让QTP运行时保持最小化
    Public Sub QTP_Small()
     Dim objQTPWin
     Set bjQTPWin = GetObject("" , "QuickTest.Application")
     objQTPWin.WindowState = "Minimized"
     Set bjQTPWin = Nothing
    End Sub

    '恢复QTP窗口
    Public Sub QTP_Big()
     Dim objQTPWin
     Set bjQTPWin = GetObject("" , "QuickTest.Application")
     objQTPWin.WindowState = "Restored"
     Set bjQTPWin = Nothing
    End Sub

    '写文件函数(追加)
    '输入值:写入内容
    Public Function QTP_WriteFile(pathway,words)
        Dim fileSystemObj,fileSpec,logFile,way
        Set fileSystemObj = CreateObject("Scripting.FileSystemObject")
        fileSpec = pathway
        Set logFile = fileSystemObj.OpenTextFile(fileSpec, 8, true)
        logFile.WriteLine (CStr(words))
        logFile.Close
        Set logFile = Nothing
    End Function

    '写文件函数(改写)
    '输入值:写入内容
    Public Function QTP_WriteFile_Change(pathway,words)
        Dim fileSystemObj,fileSpec,logFile,way
        Set fileSystemObj = CreateObject("Scripting.FileSystemObject")
        fileSpec = pathway
        Set logFile = fileSystemObj.OpenTextFile(fileSpec, 2, true)
        logFile.WriteLine (CStr(words))
        logFile.Close
        Set logFile = Nothing
    End Function

    '读Excel文件元素
    Public Function QTP_Read_Excel(pathway,sheetname,x,y)
     Dim srcData,srcDoc,ret
     set srcData = CreateObject("Excel.Application")
     srcData.Visible = True
     set srcDoc = srcData.Workbooks.Open(pathway)
     srcDoc.Worksheets(sheetname).Activate
     ret = srcDoc.Worksheets(sheetname).Cells(x,y).value
     srcData.Workbooks.Close
     Window("text:=Microsoft Excel").Close
     QTP_Read_Excel = ret
    End Function

    '写Excel文件元素并保存退出
    Public Function QTP_Write_Excel(pathway,sheetname,x,y,content)
     Dim srcData,srcDoc,sp1,sp2,num,use,a1,a2,a3
     set srcData = CreateObject("Excel.Application")
     srcData.Visible = True
     set srcDoc = srcData.Workbooks.Open(pathway)
     srcDoc.Worksheets(sheetname).Activate
     srcDoc.Worksheets(sheetname).Cells(x,y).value = content
     
    ' sp1 = Split(pathway,".")
    ' sp2 = Split(sp1(0),"\")
    ' num = UBound(sp2)
    ' use = sp2(num)

    ' Set a1 = Description.Create()
    ' a1("text").value="Microsoft Excel - " + use + ".xls"
    ' a1("window id").value="0"

    ' Set a3 = Description.Create()
    ' a3("Class Name").value="WinObject"
    ' a3("text").value= use + ".xls"

    ' Window(a1).WinObject(a3).Type micCtrlDwn + "s" + micCtrlUp

     Dim WshShell
     Set WshShell=CreateObject("Wscript.Shell")
     WshShell.SendKeys "^s"
     wait(1)
     
     srcData.Workbooks.Close
     Set srcDoc = nothing
     
     Window("text:=Microsoft Excel").Close
    End Function

    '定时停留弹出框函数
    Sub QTP_Msgbox(Value,waitTime,Title)
     Dim WshShell
        Set WshShell = CreateObject("WScript.Shell")
        WshShell.Popup Value, waitTime, Title
        Set WshShell = nothing
    End Sub

    '改变Excel的单元格颜色
    Public Function QTP_Change_Color(pathway,sheetname,x,y,color)
     Dim srcData,srcDoc,sp1,sp2,num,use,a1,a2,a3
     set srcData = CreateObject("Excel.Application")
     srcData.Visible = True
     set srcDoc = srcData.Workbooks.Open(pathway)
     srcDoc.Worksheets(sheetname).Activate
     If color = "red" Then
      srcDoc.Worksheets(sheetname).Cells(x,y).Interior.color=vbred
     ElseIf color = "green" Then
      srcDoc.Worksheets(sheetname).Cells(x,y).Interior.color=vbgreen
     Else
      MsgBox "输入的颜色参数不正确,只接收""red""和""green"""
     End If

     Dim WshShell
     Set WshShell=CreateObject("Wscript.Shell")
     WshShell.SendKeys "^s"
     wait(1)
     
     srcData.Workbooks.Close
     Set srcDoc = nothing
     Window("text:=Microsoft Excel").Close
    End Function

    '捕获当前屏幕(截图)
    Public Function QTP_Capture(pathway)
      Dim datestamp
      Dim filename
      datestamp = Now()
      filename = Environment("TestName")&"_"&datestamp&".png"
      filename = Replace(filename,"/","")
      filename = Replace(filename,":","")
      filename = pathway + "\" + ""&filename
      Desktop.CaptureBitmap filename
      'Reporter.ReportEvent micFail,"image","<img src='" & filename & "'>"
    End Function

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '''''QuickTestPlus 帮助文件对于Excel库函数  仅QTP适用''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim ExcelApp 'As Excel.Application
    Dim excelSheet 'As Excel.worksheet
    Dim excelBook 'As Excel.workbook
    Dim fso 'As Scripting.FileSystemObject

    Function CreateExcel() 'As Excel.Application
        Dim excelSheet 'As Excel.worksheet
        Set ExcelApp = CreateObject("Excel.Application") 'Create a new excel Object
        ExcelApp.Workbooks.Add
        ExcelApp.Visible = True
        Set CreateExcel = ExcelApp
    End Function

    Sub CloseExcel(ExcelApp)
        Set excelSheet = ExcelApp.ActiveSheet
        Set excelBook = ExcelApp.ActiveWorkbook
        Set fso = CreateObject("Scripting.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

    Function SaveWorkbook(ExcelApp, workbookIdentifier, path) 'As String
        Dim workbook 'As Excel.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("Scripting.FileSystemObject")
                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 = 1
        Else
            SaveWorkbook = 0
        End If
    End Function

    Sub SetCellValue(excelSheet, row, column, value)
        On Error Resume Next
        excelSheet.Cells(row, column) = value
        On Error GoTo 0
    End Sub

    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

    Function GetSheet(ExcelApp, sheetIdentifier) 'As Excel.worksheet
        On Error Resume Next
        Set GetSheet = ExcelApp.Worksheets.Item(sheetIdentifier)
        On Error GoTo 0
    End Function

    Function InsertNewWorksheet(ExcelApp, workbookIdentifier, sheetName) 'As Excel.worksheet
        Dim workbook 'As Excel.workbook
        Dim worksheet 'As Excel.worksheet
        'In case that the workbookIdentifier is empty we will work on the active workbook
        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)
        If sheetName <> "" Then
            worksheet.Name = sheetName
        End If
        Set InsertNewWorksheet = worksheet
    End Function

    Function CreateNewWorkbook(ExcelApp)
        Set NewWorkbook = ExcelApp.Workbooks.Add()
        Set CreateNewWorkbook = NewWorkbook
    End Function

    Function OpenWorkbook(ExcelApp, path)
        On Error Resume Next
        Set NewWorkbook = ExcelApp.Workbooks.Open(path)
        Set penWorkbook = NewWorkbook
        On Error GoTo 0
    End Function


    Sub ActivateWorkbook(ExcelApp, workbookIdentifier)
        On Error Resume Next
        ExcelApp.Workbooks(workbookIdentifier).Activate
        On Error GoTo 0
    End Sub

    Sub CloseWorkbook(ExcelApp, workbookIdentifier)
        On Error Resume Next
        ExcelApp.Workbooks(workbookIdentifier).Close
        On Error GoTo 0
    End Sub

    Function CompareSheets(sheet1, sheet2, startColumn, numberOfColumns, startRow, numberOfRows, trimed) 'As Boolean
        Dim returnVal 'As Boolean
        returnVal = True
        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)
                If trimed Then
                    Value1 = Trim(Value1)
                    Value2 = Trim(Value2)
                End If
                If Value1 <> Value2 Then
                    Dim cell 'As Excel.Range
                    sheet2.Cells(r, c) = "Compare conflict - Value was '" & Value2 & "', Expected value is '" & Value1 & "'."
                    Set cell = sheet2.Cells(r, c)
                    cell.Font.Color = vbRed
                    returnVal = False
                End If
            Next
        Next
        CompareSheets = returnVal
    End Function

    '写入word文件
    Sub QTP_WriteWord(pathway,content)
     Dim oWord,oRange,oDoc
     Set Word = CreateObject("Word.Application")
     oWord.documents.open pathway,forwriting, True
     Set Doc = oWord.ActiveDocument
     Set Range = oDoc.content
     oRange.insertafter content
     oWord.ActiveDocument.Save
    ' Dim WshShell
    ' Set WshShell=CreateObject("Wscript.Shell")
    ' WshShell.SendKeys "^s"
    ' wait(1)
        oWord.Application.Quit True
     Set Range = Nothing
     Set Doc = Nothing
     Set Word = Nothing
    End Sub

     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/daisyysiad/archive/2009/05/05/4152699.aspx

  • QTP Excel函数(转)

    2009-06-26 17:45:11

    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参考代码框架(转)

    2009-06-26 17:39:56

    Dim logdata,sou,ExpectedResult1,ExpectedResult2,ExpectedResult3,ExpectedResult4,ExpectedResult5,ExpectedResult6
    sou="F:\work\protocol\bintext\bin\_Debug.log"                                                                                                                              'log文件地址自己填加
    '--------------------
    Function readlog(sou)
    Dim fso,f1,f2
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f1 = fso.OpenTextFile(sou)
    f2 = f1.ReadAll
    f1.close
    readlog=f2
    End Function
    '-----------------------------------------------------------
    Function getdata(x,y)
    getdata = CStr(ExcelSheet1.Cells(x, y))
    End Function
    '---------------------------------------------------------------------------
    Function savedata(x,y,z)
    ExcelSheet.ActiveSheet.Cells(x,y).Value =z
    End Function
    '-------------------------------------------------------------
    Sub over()
     Set shell = Nothing
    Set Shell = Nothing
    Set ExcelSheet = Nothing
    Set ExcelSheet1 = Nothing
    ''Excel.Application.Quit
    'ExcelSheet.Application.Quit
    End Sub
    '-----------------------------------------------------------
    Dim Excel,ExcelSheet,ExcelSheet1,ExcelSheet2
    Set Excel=CreateObject("Excel.Application")
    Set ExcelSheet = Excel.Workbooks.Open("F:\work\protocol\qtp\协议测试数据驱动表.xls")        '驱动表格地址自己添加
    Set ExcelSheet1= ExcelSheet.Worksheets("测试数据")
    ExcelSheet.Application.Visible = True
    '------------------------------
    Dim oShell,shell,black
    SystemUtil.Run "F:\work\protocol\bintext\bin\test.bat","","F:\work\protocol\bintext\bin\" ,"open"  
    '测试程序路径和QTP工作路径自己填加修改
    Set shell=createobject("Wscript.shell")
    '----------------------------------------------------------
    '登陆过程
    Sub login(userx,usery,pwdx,pwdy,resultx,resulty,savex,savey)  
    shell.sendkeys "login:" & getdata(userx,usery) & "," & getdata(pwdx,pwdy) & ",5222 {enter}"
    ExpectedResult1 = getdata(resultx,resulty)
    logdata = readlog(sou)
    If InStr(logdata, ExpectedResult1) Then
    call savedata(savex,savey,"PASS")
    Else
    call savedata(savex,savey,"FAIL")
    End If
    End Sub
    '-------------------------------------------------------------
    '   shell.sendkeys 作用是在cmd中输入字符串  如下
    '预期结果--可以有任意多的预期结果,变量在顶部填加。
    '   getdata(x,y)      用来从表格取数据  x为横向列数  y为纵向列数
    '   savedata(x,y)   用来把数据记录到表格中  x为横向列数  y为纵向列数
    '检查 --  每次检查预期结果的时候需要从log中取得数据   logdata = readlog(sou)   的作用就是从输入的路径取log数据
    '--------------------------------------------------------------------------------------
    '函数表
    '           login(userx,usery,pwdx,pwdy,resultx,resulty,savex,savey)          userx 表示用户名在excel上的横坐标,usery表示用户名在excel上的纵坐标,依次类推
    '  其他函数过程自己写

     


    '-------------------------------------------------------------------------------------

    Call login(5,6,5,7,5,12,5,16)    '举例

     


    Call over()

  • Database Query

    2009-06-19 15:53:41

        几乎没怎么用QTP自带的数据库检查点方法,一般是conn = createobject("ADODB.Connection")这样的方式,取出的数值与界面的数据进行比对。今天看了一个帖子,是关于使用Database Query 方式进行数据库检查的。因为从未使用过这种方式,于是想把自己的操作记录下来。 
       方法一. 首先,点击控制面板,在数据源中设置数据源,在选择数据库类型后,显示
      

      在Data Source Name中写入数据源名字,可任意取,最好取名有意思,有益于识别, TNS Service Name 中选择在oracle中设置的网络服务名,测试连接成功后,建立数据源成功,然后在Database Query Wizard选择该数据源。


      方法二. 在QTP中插入数据库检查点,打开Database Query Wizard对话框

    点击next,进入选择数据源页面(注意:中间有跳步)

    建立新数据源,在数据源名称中输入数据源名称,选择数据库的驱动程序,如下图:

    在Service Name 中输入要连接的网络服务名,输入账号和密码,连接成功。

    下面的步骤在学习后,继续写。

    晕倒,用这种方法选择表的时候有点麻烦,比较起来还是用SQL快,不过对于大批量数据比对还是有帮助的。

  • 修炼成QTP高手的十个步骤(转)

    2009-06-13 16:19:46

    1. VBscrīptQTP实用VBscrīpt作为测试脚本语言,因此需要掌握很多VBscrīpt的知识:
    2. 软件测试自动化框架
    3. QTPTutorial帮助文档Sources:'\help\QTTutorial.pdf' or '\help\Tutorial.chm' in QTP Install folder.
    4. QTP的用户指南Sources:'\help\QTUsersGuide.pdf' or '\help\MainUsersGuide.chm' in QTP Install folder.
    5. COM/DCOM技术主要是Excel, Word, Outlook等相关的COM技术:
    6. SQL
    7. XML
    8. HTML, DOM测试WEB应用程序时必须了解:
    9. HPQTP Knowledge Base包含很多实用的QTP技术文章:
    10. 一些有用的网站
  • QTP相关的25个小技巧(转)

    2009-06-12 21:13:25

    1.Q:runaction后面能不能接变量(动态调用action,所以从数据库取数据做action名字了,但是调用总是找不到)? 
       A:脚本中原有RunAction "testbase [case1]", oneIteration
    把引号中的内容放到Global表中的第22行,然后将代码修改为:
    datatable.getsheet("Global")
    datatable.setcurrentrow(22)

    strLogin=DataTable("ActionName","Global")
    RunAction strLogin, oneIteration

    help中也有相关帮助
    如:
    Syntax
    RunAction ActionName, [IterationMode , IterationRange , Parameters]
    ActionName : String : The name of the action


    2.Q:QTP8.2中调用VB函数的问题(用VBscrīpt写了一些测试脚本需要的几个通用函数,有没有办法可以用类似include的方式进行调用,而不需要每次都把这些函数Copy到新的脚本中)?
       A:程序开头加上ExecuteFile "..\..\..\project\DeVariable.vbs"


    3.Q:QTP如何做回归测试(300多个TestCase,TD是否可以管理) ?
       A:TD可以实现,可以生成测试集,一个测试集可以包含若干个测试脚本
    QTP8.2本身提供一个工具Test Batch Runner但是运行完没有报告。
    MI有另一个工具叫MTM(multitestmanager)


    4.Q:qtp自动截图功能

    A:具体可参考此帖:http://www.51testing.com/cgi-bin ... d=17663&fpage=1


    5.Q:在QTP中如何设置使用别的浏览器(XP系统,用IE访问程序时,每次总提示屏蔽安装ActiveX插件,需要手动安装.但把这个过程录制到QTP后,回放一次是成功的。当我给某个输入框参数化了好多数据后,回放过程中,某些就会失败.
    可能有两个方面可以解决这问题1、每个动作设置延迟时间 2、设置为用别的浏览器。)
    (失败的提示信息是   object not visible)
       A:1.延迟可用WAIT X(X单位是秒)
    2.可以安装插件添加新的浏览器
       SystemUtil.Run "file” "params" "dir" "op'' "mode"
       QTP运行可执行文件的方法及其参数
        ps: 建议是用IE浏览器,或者IE内核浏览器做测试


    6.Q:checkpoint 检查网页,是否能实现只要网页出现乱码就返回错误报告?
       A:Text not displayed能解决问题
    关于 Text Checkpoint 的总结。
    1)Text Checkpoint 的检查部分分为三个部分。Checked Text 、Text Before 、Text After。在默认的情况下,Checked Text执行的是精确检查,其余两个部分执行的是模糊检查。Text Before(After)检查的内容可以比实际的内容少。但是不能有和是实际内容不相符的地方,否则就失败。
    2) Exact match选项。如果选择了这个选项,三部分完全都进行精确检查。个人觉得和只检查checked Text部分没有区别。
    3) Text not displayed。这个选项本质上就是一个结果取反的过程。就是把检查的结果给反过来,把pass变成Fail,Fail变成pass。我觉得这样就很容易理解。


    7.Q:WSH的应用方法
       A:WSH 实际上是一个脚本语言的运行环境,它之所以具备强大的功能,是在于其充分挖掘了脚本语言的潜力。因此,如果抛开脚本语言而空谈 WSH ,那实际上就没有了意义。而如果再展开来讲述脚本语言,显然就离开了今天的主题。

    在这种情况下,只好采取一种折衷的方法:给大家推荐几个脚本文件利用 WSH 执行任务的实例,希望大家能通过这些例子对 WSH 的使用有一个初步的认识。

      脚本文件的编写十分方便,你可以选用任意一个文字编辑软件进行编写,编写完成后,只需将它保存为 WSH 所支持的文件名就可以了(如.js 文件和.vbs 文件)。最常用的就是记事本编辑器,下面的实例都是以它作为工具编写的。

    打开记事本编辑器,在上面编写如下内容:
      Wscrīpt.Echo("走近 WSH")
      将它保存为以 .vbs 或 .js 为后缀名(千万不要写成了 .txt)的文件并退出记事本。双击执行这个文件。
      这一次,我们要利用 WSH 完成一次创建十个文件夹的工作。代码如下:
      dim objdir
      set ōbjdir=wscrīpt.createobject("scrīpting.filesystemobject")
      for k=1 to 10
      anewfolder="c:\chapter" & k
      objdir.createfolder(anewfolder)
      next

    同样,将它存为 .vbs 文件并退出。运行后,我们会发现,C 盘根目录下一次性多出了十个新文件夹。

    最后,再举一个在服务器上的运用。下面的代码将帮助你重新启动指定的 IIS 服务:  ' define a constant for stopped services
      Const ADS_SERVICE_STOPPED = 1

    ' get an ADSI object for a computer
      Set ōbjComputer = GetObject("WinNT://MYCOMPUTER,computer")

    ' get an object for a service
      Set ōbjService = objComputer.GetObject("Service","MYSERVICE")

    ' check to see if the service is stopped
      If (objService.Status = ADS_SERVICE_STOPPED) Then

    ' if the service is stopped, then start it
      objService.Start

      End If

    将它以 startsvc.vbs 为名保存在 C: 盘根目录。并通过如下命令执行:Cscrīpt C:\STARTSVC.VBS。运行后,经你指定的 IIS 服务项将被重新开启。

    其实,在 Windows 的 samples 目录下,有个 WSH 文件夹,那里面有不少很具代表性的 .vbs 和. js 脚本文件。

    此外,利用 WSH 还可以自己编写脚本文件来提高网络管理方面的效率。


    8.Q;从EXCEL中导出数据进行测试

    datatable.AddSheet("51sheet")
    datatable.ImportSheet "f:\test.xls","testsheet","51sheet"

    Dim i,RowCount '定义两个变量
    i=0
    RowCount=datatable.GetSheet("51sheet").GetRowCount '设置RowCount等于51sheet中的行数。
    msgbox RowCount
    Do while i<rowcount
    i=i+1 '第一次进入循环,执行这句后,i=1
    'datatable.getsheet("51sheet").setcurrentrow(i)   这句话被我注释掉了,正确的写法应该是下面这样,分开写。

    datatable.getsheet("51sheet")
    datatable.setcurrentrow(i)

    '执行过上面两句后,CurrentRow是第一行。

    tempData=DataTable.GetSheet("51sheet").GetParameter("Name").Value
                  
    '现在,我们调用msgbox看看下面这种调用方法得到的是什么值?没错,是第一行的值,下一次循环呢?
    '得到的是第二行的值么?
    msgbox "GetParameter-Name:"&tempData '这里弹出我们要看的值。
    '下面我们用另外一种方法来得到。
    msgbox "GetParameter-i:"&DataTable.GetSheet("51sheet").GetParameter(1).Value '这里我用GetParameter(1)去得到sheet中第一列的值。
    loop


    9.Q:关于dtGlobalsheet与dtGlobalsheet

    1) dtGlobalsheet只有一个,它的index值比较特殊,它有两个index值,一个是1还有一个是内置的默认的1000。
    你可以用1或者1000去引用它都是正确的。当然了,如果你用dtGlobalsheet来引用它也是正确的。这个sheet的Name叫做"Global"。注意:SheetName是区分大小写的。
    2) dtLocalsheet可以用index:1001来引用,当然,也可以用2来引用。至于其它自定义的sheet嘛,你就只能用index:3来引用了。
    它没有内置的默认的类似前两个那样的index值。
    3) datatable这个对象只有一个。就是所有sheet的集合。或许你把它理解为excel文件比较好。
    dtsheet呢?就是其中的每个sheet。所不同的就是MI为他们做了一些默认值。在我们的应用中,可能会有多个action,如:actiion1,actiion2,actiion3
    这些action也分别对应有各自默认的LoaclSheet.即:actiion1,actiion2,actiion3。

    如果每个action中,我们都只用到一个sheet,那就好办了,在每个action中都可以用localsheet来引用,但是如果我们有两个及两个以上的sheet.那么就比较容易乱套了。


    10.Q:移动当前位置的行

    For i=1   to 3
    datatable.getsheet("Global")
    datatable.setcurrentrow(i)
    DataTable("C","Global") = DataTable("nodename","Global") ‘把表Global中的nodename字段中的内容取出来。
    Next


    11.Q:如何能记录到页面的校验码?(Output value能不能得到web页面的校验码,一般的校验码是由图片随即生成的 ,用QTP怎么录脚本在登陆前得到校验码并输入到校验码一栏)
    A:1)一个很简单的方法:测试时叫开发屏蔽掉检验码的功能后,再录制脚本。检验码的功能可以手工很简单测试出来。
        2)想得到图片的校验码,唯一的方法就是跟程序员拿程序,然后自己在脚本里面写FUCNTION!
           其它就要手动输入了!


    12.Q:QTP正则表达式的帮助
    A: QTP regular expression usage.doc (到Google里勾吧)


    13.自动测试实施计划
    1)分析实施自动化测试可能存在的风险:就是决定是否实施, 用成本 时间 效果 。。
    2)制定实施的时机:也就是在什么阶段
    3)研究所要测试的功能 性能
    4)分析在测试中可能遇到的问题 和困难
    5)预估所需要的人时和相应的硬件
    7)确定负责人员和相关测试人员
    6)制定详细的测试计划 方案
    7)最后是执行计划


    14.Q:一个Action里如何调用在另一个Action中定义的函数、过程(或变量、常量)
    例如:
    -----------------------------------
    'Action_A
       Public strURL
           ...

    ... ......
    Function QueryList()
           ...... ......
           ...... ...... 
    End Function
    ------------------------------------
    'Action_B
    '如何调用 QueryList函数和strURL
    A:1)可以把这些变量和Function放在vbs文件作为resource文件共享,在每个Action中添加该文件.     

    如果function中出现控件调用,那么必须确保该控件在相应的Action的object repository中是存在的.
      2)定义一个可被调用的ACTION里面唯一的放一个FUNCTION


    15.Q:如何管理QTP的源代码?(QTP生成的源代码比较多,而且和环境控件都有关,假如需要多人同时开发, 请问如何管理源代码?)
    A: 一个是代码你可以通过vss,cvs等来进行管理
        一个是通过td或者qc的基于用例的代码管理   

    其实第一种方法是基于版本控制来进行的,第二种方法是基于用例管理进行的
        角度不同,管理方法也不同,不过团队协作需要的大家分工明确,进度控制。代码管理可以借鉴开发的方法。


    16:Q:脚本不能回放,IE中的AtiveX设置有问题??
    A: TOOL---OPTIONS----Ative screen
        然后点开advanced..,把LOAD   ACTIVEX CONTROLS打勾
        TOOL---OPTIONS----Ative screen
        然后点开advanced..,run scrīpts-->disabled!


    17.Q: 如何参数化link

    Browser("Browser").Page("Page").Sync
    Browser("Browser").Navigate "http://www.51testing.com/cgi-bin/index.php"
    Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Sync

    Set tags=Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Object.links
    Dim i,j, arr()
    i=0
    For Each element in tags
    If Ucase(element.tagname)="A" and left(element.InnerText,1)="[" Then
    ReDim Preserve arr(i+1)
           arr(i)=element.InnerText
    i=i+1
    end if
    Next

     

    For j=0 to i
    Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Link("[ 版主讨论区 ]").SetTOProperty "Text",arr(j)
             Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Link("[ 版主讨论区 ]").Click
    Browser("Browser").Back
    Next

    这段代码先是打开一个空的页面,然后输入url.
    到达论坛首页。

    然后得到所有版面的名称,也就是link的名称。
    存到数组里面。
    然后使用SetTOProperty更换录制时候录下的link的属性。
    这时候再click

     

    18. Q:QTP 在Debug狀態,在Export View 區域不能寫入任何東西

    A: 如果你的目的是在debug过程中修改已执行过的命令,可以在Debug view的Command中执行命令,如重新执行已经执行过的命令,修改变量的值等等。

    如:Window("Flight Reservation").WinEdit("Name:").Set "51testing"
    已经执行,如果现在想修改“51testing”为“testing”,可以在command中执行
    Window("Flight Reservation").WinEdit("Name:").Set "testing"


    19.Q:动态变化值如何获取

    A:VAL=Browser("欢迎使用我的工作台").Page("欢迎使用我的工作台").Frame("managePlace_7").WebRadioGroup("userAccountId_0").GetROProperty("Value")
    Browser("欢迎使用我的工作台").Page("欢迎使用我的工作台").Frame("managePlace_7").WebRadioGroup("userAccountId_0").select val


    20.Q:如何一一获得Table中 某栏 link 的 text?

    A:通过上面link 的学习. 我终于融会贯通,完成了我的问题: 与大家共享:


    //////////////////////////////////////////////////////////////////////////////////////
    Browser("Login").Page("Page").Frame("contents").ViewLink("treeview").Image("Tplus").Click
    Browser("Login").Page("Page").Frame("contents").ViewLink("treeview").Image("Tplus_2").Click
    Browser("Login").Page("Page").Frame("contents").ViewLink("treeview").Link("开课设置").Click
    Browser("Login").Page("Page").Frame("main").WebList("drpStatus").Select "任意"
    Browser("Login").Page("Page").Frame("main").WebButton("查找").Click
    Browser("Login").Page("Page").Sync

    Dim finded,findCode,Nowout
    'define a constrat for find
    findCode = 110901
    finded = false

    Function MaxPage(pageString)
    'msgbox pageString
    Dim ilen,i,j
    ilen = len(pageString)
    i=ilen
    While i>0
           j = mid(pageString,i,1)
       'msgbox j
       If instr("123456789",j)>0 Then
              MaxPage = j
       'msgbox MaxPage
       Exit function
       End If
       i=i-1
    Wend
    End Function

     
    Dim trowcount,maxp
    trowcount = Browser("Login").Page("Page").Frame("main_8").WebTable("开课代码").RowCount
    msgbox "Rowcount: "&trowcount
    Nowout = Browser("Login").Page("Page").Frame("main_8").WebTable("开课代码").GetCellData(trowcount,1)
    Nowout = trim(Nowout)
    maxp = MaxPage(Nowout)
    msgbox "max page: "& maxp

    Dim nowPage,checkid
    For nowPage = 1 to maxp
    If   finded Then
       Exit for
    End If
       ' link to the 当前所需page
       If nowpage>1 Then
    Browser("Login").Page("Page").Frame("main_8").Link("[2]").SetTOProperty "Text","["&nowpage&"]"
    Browser("Login").Page("Page").Frame("main_8").Link("[2]").Click
    Browser("Login").Page("Page").Sync
    end if

       ' Get the rowcount of table in now page
    trowcount = Browser("Login").Page("Page").Frame("main_8").WebTable("开课代码").RowCount
    msgbox "Rowcount: "&trowcount

       'link every record in the table of the page
    for i = 2 to trowcount   - 2
    Nowout = Browser("Login").Page("Page").Frame("main_8").WebTable("开课代码").GetCellData(i,2)
    'msgbox i&": "&Nowout

    checkid = "dgCourse:_ctl" &(i+1)& ":_ctl0"
    Browser("Login").Page("Page").Frame("main_8").WebCheckBox("dgCourse:_ctl3:_ctl0").SetTOProperty "name",checkid
    Browser("Login").Page("Page").Frame("main_8").WebCheckBox("dgCourse:_ctl3:_ctl0").Set "ON"

    Browser("Login").Page("Page").Frame("main_8").Link("0901").SetTOProperty "Text",Nowout
    Browser("Login").Page("Page").Frame("main_8").Link("0901").Click
    Browser("开课设置详细信息").Page("开课设置详细信息").Sync
    'wait(1)
    msgbox "begun"
    msgbox findCode
    msgbox Nowout
    msgbox "finished"
    If   trim(findCode) = trim(Nowout) Then
           finded = true
    msgbox "find is ok!"
    wait(2)
    Exit for
    End If
    Browser("开课设置详细信息").Close
    Browser("Login").Page("Page").Sync
       next

    Next


    21.Q:网页下拉框的选择

    A:For i =1 to 10
    Randomize
    IndexNum=Int((10 - 5 + 1) * Rnd + 5)
    Browser("Mercury Tours").Page("Find Flights_2").WebList("arrive").Select "#"&IndexNum
    wait(3)
    Next


    Sub ChildObjects_Example()
    'The following example uses the ChildObjects method to find all the
    'list objects on a Web page, and then to select an item in each list.

    Set ōDesc = Descrīption.Create()
    oDesc("micclass").Value = "WebList"
    Set Lists = Browser("Mercury Interactive").Page("Mercury Interactive").ChildObjects(oDesc)
    NumberOfLists = Lists.Count()
    For i = 0 To NumberOfLists - 1
    Lists(i).Select i + 1
    Next


    End Sub


    22.Q:将测试数据单独拿出来

    A:取得一个
    Browser("Browser").Page("").WebList("fid").GetItem (1)
    取得全部
    Browser("Browser").Page("").WebList("fid").GetROProperty("all items")


    以下可以在自带的例子中实现
    Window("Flight Reservation").WinComboBox("Fly From:").Select "Frankfurt"
    a=window("Flight Reservation").wincombobox("Fly From:").GetItem(1)
    reporter.ReportEvent 2,"下拉列表的值",a


    23.Q:和TD连接

    A:在QTP中不是有个Quality Center Connection,选择服务器连接,服务器处输入类似http://computer_name/tdbin,其中computer_name为服务器的名字,连接后在测试结果中添加defect就可以与TD相连了。


    24:Q:处理Windows弹出窗口

    A:IF Not Window("Flight Reservation").Exist(1) Then
    'Calling   open flight
                If not Dialog("Login").Exist(1)   Then
           Browser("管理系统").Dialog("Microsoft Internet Explorer").WinButton("确定").Click

        End If


    25.Q:查询结果的比较

    这是查询一个字段的,对查询结果多页的情况也涉及了,其实应该把所有查询字段联合起来的,也就是改改sql语句和判断条件。

    [i]Set Conn = CreateObject("ADODB.Connection")
    Set Rs = CreateObject("ADODB.Recordset")
    Conn.Open "Descrīption=kml-it;DRIVER=SQL Server;SERVER=KML-IT;UID=sa;PWD=password;APP=QuickTest Professional;WSID=KML-MICHELLE;DATABASE

     


     

  • 翻页功能测用例设计(转)

    2009-06-12 21:12:22

    1、首页、上一页、下一页、尾页。

      2、总页数,当前页数

      3、指定跳转页

      4、指定每页显示条数

      当然,有一些是少于多少页,全部以数字的形式显示,多于多少页后,才出现下一页的控件。本文暂且用以上四点来做为通用的用例来设计吧。

      对于1翻页链接或按钮的测试,主要要检查的测试点有:

      1、有无数据时控件的显示情况

      2、在首页时,首页和上一页是否能点击

      3、在尾页时,下一页和尾页是否能点击

      4、在非首页和非尾页时,四个按钮功能是否正确

      5、翻页后,列表中的记录是否仍按照指定的排序列进行了排序

      对于2总页数,当前页数,主要要检查的测试点有:

      1、总页数是否等于总的记录数/指定每页条数

      2、当前页数是否正确

      对于3指定跳转页,主要要检查的测试点有:

      1、是否能正常跳转到指定的页数

      2、输入的跳转页数非法时的处理

      对于4指定每页显示条数,主要要检查的测试点有:

      1、是否有默认的指定每页显示条数

      2、指定每页的条数后,列表显示的记录数,页数是否正确

      3、输入的每页条数非法时的处理

     

      分析完上面的测试点,应该可以进行用例的设计了。

  • 利用GetObject("WinMgmts:")获取系统信息(转)

    2009-06-07 16:52:07

    用WMI对象列出系统所有进程:

    ----Instance.vbs----


     程序代码
    Dim WMI,objs
    Set WMI = GetObject("WinMgmts:")
    Set bjs = WMI.InstancesOf("Win32_Process")
    For Each obj In objs
    Enum1 = Enum1 + obj.Description + Chr(13) + Chr(10)
    Next
    msgbox Enum1

     

    获得物理内存的容量:

    -----physicalMemory.vbs-----
     

     程序代码
    strComputer = "."

    Set wbemServices = GetObject("winmgmts:\\" & strComputer)
    Set wbemObjectSet = wbemServices.InstancesOf("Win32_LogicalMemoryConfiguration")

    For Each wbemObject In wbemObjectSet
    WScript.Echo "物理内存 (MB): " & CInt(wbemObject.TotalPhysicalMemory/1024)
    Next

     

    取得系统所有服务及运行状态

    ----service.vbs----

     程序代码
    Set ServiceSet = GetObject("winmgmts:").InstancesOf("Win32_Service")
    Dim s,infor
    infor=""
    for each s in ServiceSet
    infor=infor+s.Description+" ==> "+s.State+chr(13)+chr(10)
    next
    msgbox infor


    CPU的序列号:

    ---CPUID.vbs---


     程序代码
    Dim cpuInfo
    cpuInfo = ""
    set moc = GetObject("Winmgmts:").InstancesOf("Win32_Processor")
    for each mo in moc
    cpuInfo = CStr(mo.ProcessorId)
    msgbox "CPU SerialNumber is : " & cpuInfo
    next

     

    硬盘型号:
    ---HDID.vbs---

     程序代码
    Dim HDid,moc
    set moc =GetObject("Winmgmts:").InstancesOf("Win32_DiskDrive")
    for each mo in moc
    HDid = mo.Model
    msgbox "硬盘型号为:" & HDid
    next

     

    网卡MAC物理地址:

    ---MACAddress.vbs---

     程序代码
    Dim mc
    set mc=GetObject("Winmgmts:").InstancesOf("Win32_NetworkAdapterConfiguration")
    for each mo in mc
    if mo.IPEnabled=true then
    msgbox "网卡MAC地址是: " & mo.MacAddress
    exit for
    end if
    next

     

    测试你的显卡:

     程序代码

    On Error Resume Next
    Dim ye
    Dim yexj00
    set yexj00=GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_VideoController")
    for each ye in yexj00
    msgbox "型 号: " & ye.VideoProcessor & vbCrLf & "厂 商: " & ye.AdapterCompatibility & vbCrLf & "名 称: " & ye.Name & vbCrLf & "状 态: " & ye.Status & vbCrLf & "显 存: " & (ye.AdapterRAM\1024000) & "MB" & vbCrLf & "驱 动(dll): " & ye.InstalledDisplayDrivers & vbCrLf & "驱 动(inf): " & ye.infFilename & vbCrLf & "版 本: " & ye.DriverVersion
    next

     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/SImonJ07/archive/2007/10/10/1817967.aspx

  • QTP-使用技巧(转)

    2009-06-07 10:45:29

    1.runaction 后面能不能接变量(动态调用action,所以从数据库取数据做action名字了,但是调用总是找不到)? 

      A:脚本中原有RunAction "testbase [case1]", oneIteration

        把引号中的内容放到Global表中的第22行,然后将代码修改为:

        datatable.getsheet("Global")

        datatable.setcurrentrow(22) 

        strLogin=DataTable("ActionName","Global")

        RunAction strLogin, oneIteration   

        help中也有相关帮助

        如:

        Syntax

        RunAction ActionName, [IterationMode , IterationRange , Parameters]

        ActionName : String : The name of the action  

    2.QTP8.2 中调用VB函数的问题(用VBscrīpt写了一些测试脚本需要的几个通用函数,有没有办法可以用类似include的方式进行调用,而不需要每次都把这些函数Copy到新的脚本中)?

      A:程序开头加上ExecuteFile "..\..\..\project\DeVariable.vbs"  

    3.QTP 如何做回归测试(300多个TestCase,TD是否可以管理) ?

      A:TD可以实现,可以生成测试集,一个测试集可以包含若干个测试脚本

        QTP8.2本身提供一个工具Test Batch Runner但是运行完没有报告。

        MI有另一个工具叫MTM(multitestmanager)  

    5.在QTP中如何设置使用别的浏览器(XP系统,用IE访问程序时,每次总提示屏蔽安装ActiveX插件,需要手动安装.但把这个过程录制到QTP后,回放一次是成功的。当我给某个输入框参数化了好多数据后,回放过程中,某些就会失败.

        可能有两个方面可以解决这问题1、每个动作设置延迟时间 2、设置为用别的浏览器。)

        (失败的提示信息是  object not visible)

      A:1.延迟可用WAIT X(X单位是秒)

        2.可以安装插件添加新的浏览器

           SystemUtil.Run "file” "params" "dir" "op'' "mode"

           QTP运行可执行文件的方法及其参数

         ps: 建议是用IE浏览器,或者IE内核浏览器做测试  

    6.checkpoint 检查网页,是否能实现只要网页出现乱码就返回错误报告?

      A:Text not displayed能解决问题

        关于 Text Checkpoint 的总结。

        1)Text Checkpoint 的检查部分分为三个部分。Checked Text 、Text Before 、Text After。在默认的情况下,Checked Text执行的是精确检查,其余两个部分执行的是模糊检查。Text Before(After)检查的内容可以比实际的内容少。但是不能有和是实际内容不相符的地方,否则就失败。

        2) Exact match选项。如果选择了这个选项,三部分完全都进行精确检查。个人觉得和只检查checked Text部分没有区别。

        3) Text not displayed。这个选项本质上就是一个结果取反的过程。就是把检查的结果给反过来,把pass变成Fail,Fail变成pass。我觉得这样就很容易理解。  

    7.WSH 的应用方法

      A:WSH 实际上是一个脚本语言的运行环境,它之所以具备强大的功能,是在于其充分挖掘了脚本语言的潜力。因此,如果抛开脚本语言而空谈 WSH ,那实际上就没有了意义。而如果再展开来讲述脚本语言,显然就离开了今天的主题。  

    在这种情况下,只好采取一种折衷的方法:给大家推荐几个脚本文件利用 WSH 执行任务的实例,希望大家能通过这些例子对 WSH 的使用有一个初步的认识。 

      脚本文件的编写十分方便,你可以选用任意一个文字编辑软件进行编写,编写完成后,只需将它保存为 WSH 所支持的文件名就可以了(如.js 文件和.vbs 文件)。最常用的就是记事本编辑器,下面的实例都是以它作为工具编写的。  

    打开记事本编辑器,在上面编写如下内容:

      Wscrīpt.Echo("走近 WSH")

      将它保存为以 .vbs 或 .js 为后缀名(千万不要写成了 .txt)的文件并退出记事本。双击执行这个文件。

      这一次,我们要利用 WSH 完成一次创建十个文件夹的工作。代码如下:

      dim objdir

      set ōbjdir=wscrīpt.createobject("scrīpting.filesystemobject")

      for k=1 to 10

      anewfolder="c:\chapter" & k

      objdir.createfolder(anewfolder)

      next  

    同样,将它存为 .vbs 文件并退出。运行后,我们会发现,C 盘根目录下一次性多出了十个新文件夹。 

        最后,再举一个在服务器上的运用。下面的代码将帮助你重新启动指定的 IIS 服务:  

    ' define a constant for stopped services

      Const ADS_SERVICE_STOPPED = 1  

    ' get an ADSI object for a computer

      Set ōbjComputer = GetObject("WinNT://MYCOMPUTER,computer")  

    ' get an object for a service

      Set ōbjService = objComputer.GetObject("Service","MYSERVICE")  

    ' check to see if the service is stopped

      If (objService.Status = ADS_SERVICE_STOPPED) Then  

    ' if the service is stopped, then start it

      objService.Start  

      End If  

    将它以 startsvc.vbs 为名保存在 C: 盘根目录。并通过如下命令执行:Cscrīpt C:\STARTSVC.VBS。运行后,经你指定的 IIS 服务项将被重新开启。  

    其实,在 Windows的 samples 目录下,有个 WSH 文件夹,那里面有不少很具代表性的 .vbs 和. js 脚本文件。 

    此外,利用 WSH 还可以自己编写脚本文件来提高网络管理方面的效率。 

    8.从 EXCEL 中导出数据进行测试 

    datatable.AddSheet("51sheet")

    datatable.ImportSheet "f:\test.xls","testsheet","51sheet" 

    Dim i,RowCount ' 定义两个变量

    i=0

    RowCount=datatable.GetSheet("51sheet").GetRowCount ' 设置 RowCount 等于 51sheet 中的行数。

    msgbox RowCount

    Do while i<rowcount

    i=i+1 ' 第一次进入循环,执行这句后, i=1

    'datatable.getsheet("51sheet").setcurrentrow(i)   这句话被我注释掉了,正确的写法应该是下面这样,分开写。

    datatable.getsheet("51sheet")

    datatable.setcurrentrow(i) 

    ' 执行过上面两句后, CurrentRow 是第一行。  

    tempData=DataTable.GetSheet("51sheet").GetParameter("Name").Value                 

    ' 现在,我们调用 msgbox 看看下面这种调用方法得到的是什么值?没错,是第一行的值,下一次循环呢?

    ' 得到的是第二行的值么?

    msgbox "GetParameter-Name:"&tempData ' 这里弹出我们要看的值。

    ' 下面我们用另外一种方法来得到。

    msgbox "GetParameter-i:"&DataTable.GetSheet("51sheet").GetParameter(1).Value ' 这里我用 GetParameter(1) 去得到 sheet 中第一列的值。

    loop  

    9.关于 dtGlobalsheet 与 dtLocalsheet 

    1) dtGlobalsheet 只有一个,它的 index 值比较特殊,它有两个 index 值,一个是 1 还有一个是内置的默认的 1000 。

    你可以用 1 或者 1000 去引用它都是正确的。当然了,如果你用 dtGlobalsheet 来引用它也是正确的。这个 sheet 的 Name 叫做 "Global" 。注意: SheetName 是区分大小写的。

    2) dtLocalsheet 可以用 index:1001 来引用,当然,也可以用 2 来引用。至于其它自定义的 sheet 嘛,你就只能用 index:3 来引用了。

    它没有内置的默认的类似前两个那样的 index 值。

    3) datatable 这个对象只有一个。就是所有 sheet 的集合。或许你把它理解为 excel 文件比较好。

    dtsheet 呢?就是其中的每个 sheet 。所不同的就是 MI 为他们做了一些默认值。在我们的应用中,可能会有多个 action, 如: actiion1,actiion2,actiion3

    这些 action 也分别对应有各自默认的 LoaclSheet. 即: actiion1 , actiion2 , actiion3 。  

    如果每个 action 中,我们都只用到一个 sheet ,那就好办了,在每个 action 中都可以用 localsheet 来引用,但是如果我们有两个及两个以上的 sheet. 那么就比较容易乱套了。  

    10.移动当前位置的行 

    For i=1  to 3

    datatable.getsheet("Global")

    datatable.setcurrentrow(i)

    DataTable("C","Global") = DataTable("nodename","Global") ‘把表Global中的nodename字段中的内容取出来。

    Next  

    11.如何能记录到页面的校验码?(Output value能不能得到web页面的校验码,一般的校验码是由图片随即生成的 ,用QTP怎么录脚本在登陆前得到校验码并输入到校验码一栏)

       A:1)一个很简单的方法:测试时叫开发屏蔽掉检验码的功能后,再录制脚本。检验码的功能可以手工很简单测试出来。

         2)想得到图片的校验码,唯一的方法就是跟程序员拿程序,然后自己在脚本里面写FUCNTION!

            其它就要手动输入了!  

    13. 自动测试实施计划

       1)分析实施自动化测试可能存在的风险:就是决定是否实施, 用成本 时间 效果 。。

       2)制定实施的时机:也就是在什么阶段

       3)研究所要测试的功能 性能

       4)分析在测试中可能遇到的问题 和困难

       5)预估所需要的人时和相应的硬件

       7)确定负责人员和相关测试人员

       6)制定详细的测试计划 方案

       7)最后是执行计划 

    14. 一个Action里如何调用在另一个Action中定义的函数、过程(或变量、常量)

       例如:

       -----------------------------------

       'Action_A

         Public strURL   

            ...... ......

        Function QueryList()

            ...... ......

            ...... ...... 

        End Function

       ------------------------------------

       'Action_B

       '如何调用 QueryList函数和strURL

       A:1)可以把这些变量和Function放在vbs文件作为resource文件共享,在每个Action中添加该文件. 

    如果function中出现控件调用,那么必须确保该控件在相应的Action的object repository中是存在的.

       2)定义一个可被调用的ACTION里面唯一的放一个FUNCTION  

    15.如何管理QTP的源代码?(QTP生成的源代码比较多,而且和环境控件都有关,假如需要多人同时开发, 请问如何管理源代码?)

       A: 一个是代码你可以通过vss,cvs等来进行管理

         一个是通过td或者qc的基于用例的代码管理

    其实第一种方法是基于版本控制来进行的,第二种方法是基于用例管理进行的

         角度不同,管理方法也不同,不过团队协作需要的大家分工明确,进度控制。代码管理可以借鉴开发的方法。 

    16: 脚本不能回放,IE中的AtiveX设置有问题??

       A: TOOL---OPTIONS----Ative screen

         然后点开advanced..,把LOAD  ACTIVEX CONTROLS打勾

         TOOL---OPTIONS----Ative screen

         然后点开advanced..,run scrīpts-->disabled!  

    17 .如何参数化link  

    Browser("Browser").Page("Page").Sync

    Browser("Browser").Navigate "http://www.51testing.com/cgi-bin/index.php"

    Browser("Browser").Page("51Testing 软件测试论坛---软件测试,软件质量工程师").Sync 

    Set tags=Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Object.links

    Dim i,j, arr()

    i=0

    For Each element in tags

        If Ucase(element.tagname)="A" and left(element.InnerText,1)="[" Then

                            ReDim Preserve arr(i+1)

                        arr(i)=element.InnerText

        i=i+1

            end if

    Next

    For j=0 to i

                            Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Link("[ 版主讨论区 ]").SetTOProperty "Text",arr(j)

                Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Link("[ 版主讨论区 ]").Click

                            Browser("Browser").Back

    Next

     

    这段代码先是打开一个空的页面,然后输入url.

    到达论坛首页。 

    然后得到所有版面的名称,也就是link的名称。

    存到数组里面。

    然后使用SetTOProperty更换录制时候录下的link的属性。

    这时候再click  

    18. QTP 在Debug状态,在Export View 区域不能写入任何东西  

    A: 如果你的目的是在debug过程中修改已执行过的命令,可以在Debug view的Command中执行命令,如重新执行已经执行过的命令,修改变量的值等等。 

    如:Window("Flight Reservation").WinEdit("Name:").Set "51testing"

    已经执行,如果现在想修改“51testing”为“testing”,可以在command中执行

    Window("Flight Reservation").WinEdit("Name:").Set "testing"  

    19 . 动态变化值如何获取  

    A:VAL=Browser("欢迎使用我的工作台").Page("欢迎使用我的工作台").Frame("managePlace_7").WebRadioGroup("userAccountId_0").GetROProperty("Value")

    Browser("欢迎使用我的工作台").Page("欢迎使用我的工作台").Frame("managePlace_7").WebRadioGroup("userAccountId_0").select val

1392/7<1234567>
Open Toolbar