发布新日志

  • VBS里Err对象的使用

    2008-12-04 23:58:57

    Err对象作为VBS里的一个固有内置全局对象,在使用时无需先创建一个对象实例。它有其属性和方法:

     

    1. 属性

    a) Number 默认属性

    b) Source

    c) HelpFile

           用法:object.HelpFile [= contextID]

    d) Descrīption:当没有用户自定义Descrīption值时,该值为Number属性值

           用法:object.Descrīption [= stringexpression]

    e) HelpContext

           用法:object.HelpContext [= contextID]

           If both HelpFile and HelpContext are empty, the value of the Number property is checked.

     

    2. 方法

    Clear:重置Err对象

    Raise:产生运行错误

     

    当遇到On Error Resume Nex后,Err对象的属性被重置为0或者是长度为0的字符串。

     

    典型的Err对象用法:

     

    On Error Resume Next

    Dim Msg

    Err.Clear

    Err.Raise 6   ' Generate "Overflow" error.

    Err.Helpfile = "yourHelp.hlp"

    Err.HelpContext = yourContextID

    If Err.Number <> 0 Then

       Msg = "Press F1 or Help to see " & Err.Helpfile & " topic for" & _

       " the following HelpContext: " & Err.HelpContext

       MsgBox Msg, , "error: " & Err.Descrīption, Err.Helpfile, Err.HelpContext

    End If

  • 第一次使用描述性编程

    2008-12-04 23:56:49

    过去一直认为描述性编程对于QTP的意义不是很大,所以一直都使用对象库进行脚本编写和维护。最近却遇到一个难题,使用对象库无法解决:一个WebEdit在一个表格里被一个WebElement覆盖,点击该WebElementWebEdit才可见,Focus移走,它立马就不可见了,可以通过Spy来查看该WebEdit的属性,但是当加入到对象库时,由于对象已经不可见,可以最初抓到它,但是加入到对象库却没办法成功。

     

    这样已经无法通过对象库加入到脚本语句里了,于是再粗略的翻看了一下用户手册,才想起来描述性编程可能可以解决这个问题,于是试验了一下,果然能行。因为先Click这个单元格里的WebElement,然后WebEdit可见,直接用描述性编程就可对其进行操作:

    Browser(“browser”).Page(“page”).WebTable(“tablename”).ChildItem(2, 2, “WebElement”, 0).Click

    Browser(“browser”).Page(“page”).WebTable(“tablename”).WebEdit(“name:=textbox”).Set “test”

     

    不知道有没有人清楚还有其他哪些情况必须使用“描述性编程”才能解决问题的例子,希望可以一起交流一下。

  • vbs调用QTP

    2008-11-13 14:19:40

    Dim qtApp 'As QuickTest.Application ' Declare the Application object variable
    Dim qtTest 'As QuickTest.Test ' Declare a Test object variable
    Dim qtResultsOpt 'As QuickTest.RunResultsOptions
    ' Declare a Run Results Options object variable
    Set qtApp = CreateObject("QuickTest.Application") ' Create the Application object
    qtApp.Launch ' Start QuickTest
    qtApp.Visible = True ' Make the QuickTest application visible

    ' Set QuickTest run options
    qtApp.Options.Run.ImageCaptureForTestResults = "OnError"
    qtApp.Options.Run.RunMode = "Fast"
    qtApp.Open "C:\ Your Test Path Here", True ' Open the test in read-only mode

    ' set run settings for the test
    Set qtTest = qtApp.Test
    qtTest.Settings.Run.OnError = "NextStep" ' Instruct QuickTest to perform next step when error occurs
    Set qtResultsOpt = CreateObject("QuickTest.RunResultsOptions") ' Create the Run Results Options object
    qtResultsOpt.ResultsLocation = "C:\Your Results Path Here" ' Set the results location

    qtTest.Run ' Run the test

    'qtTest.Close ' Close the test
    Set qtResultsOpt = Nothing ' Release the Run Results Options object
    Set qtTest = Nothing ' Release the Test object
    Set qtApp = Nothing ' Release the Application object

  • Close redundant browser

    2008-11-13 12:06:40

    1. Through descrīption object

    Dim WinIe,Ie,k,m
    Set WinIe=descrīption.Create()
    WinIe("micclass").value="Browser"  'The property regexpwndtitle of all pages is " Microsoft Internet Explorer"
    Set Ie=desktop.ChildObjects(WinIe)
    m=Ie.count
    If  m>1 Then
            For k=0 to m-1
            Ie(k).close        

            Next
    End If
    Set ie = nothing

    2. Through close process

    SystemUtil.CloseProcessByName "iexplore.exe"

  • (转)使用 XML 文件记录操作日志

    2008-11-07 18:20:12

    记录应用程序的操作日志可以使用数据库、文本文件、XML文件等。我这里介绍的是使用 XML 文件记录操作日志。
    我觉得使用 XML 记录操作日志有如下几点好处:
    1. 不占用数据库的空间,可以任意的删除历史操作日志。
    2. DataTable 可以方面的读入 XML 文件,DataTable 也可以方便的保存为 XML 文件。
    3. 查看日志方便,可以直接打开 XML 文件查看,也可以读入 DataTable,然后通过程序查看。

    在 VS2005 中使用 XML 文件记录操作日志方法如下:
    1. 建立数据集:JobLogDataSet.xsd
        这里包括:TraceLevel(日志类型)、User(用户)、DateTime(操作时间)、Module(模块)、Function(功能)、Message(消息) 6 个字段。
        不够自己再加吧, 其中 TraceLevel(日志类型) 是指 Info,Warning,Error,Trance,Off。

       

    2. 建立日志类型     /// <summary>
        /// 日志类型
        /// </summary>
        public enum LogType
        {
            /// <summary>
            /// 信息
            /// </summary>
            Info,
            /// <summary>
            /// 警告
            /// </summary>
            Warning,
            /// <summary>
            /// 错误
            /// </summary>
            Error,
            /// <summary>
            /// 跟踪
            /// </summary>
            Trace,
            /// <summary>
            /// 不记录日志
            /// </summary>
            Off
        }
    2. 写日志的方法
        /// <summary>
        /// 写日志
        /// </summary>
        /// <param name="traceLevel">日志类型(Info,Warning,Error,Trance,Off)</param>
        /// <param name="user">用户</param>
        /// <param name="module">模块</param>
        /// <param name="function">功能</param>
        /// <param name="message">消息</param>
        public static void WriteLog(LogType logType,string user, string module, string function, string message)
        {
            try
            {
                // 类型为 LogType.Off 的 不记录日志
                if (logType == LogType.Off)
                    return;

                JobLogDataSet.JobLogDataTable t = new JobLogDataSet.JobLogDataTable();

                // 每天一个日志文件(.XML 文件),日志的文件名称为:JobLog yyyy-MM-dd.xml
                string jobLogFile = AppDomain.CurrentDomain.BaseDirectory + "JobLog " +
                    DateTime.Today.ToString("yyyy-MM-dd") + ".xml";
                if (!File.Exists(jobLogFile))
                    t.WriteXml(jobLogFile);

                // 从 .XML 文件中读取日志
                t.ReadXml(jobLogFile);

                // 添加一条日志
                JobLogDataSet.JobLogRow r = t.NewJobLogRow();
                r.TraceLevel = logType.ToString();
                r.User = user;
                r.Datetime = DateTime.Now;
                r.Module = module;
                r.Function = function;
                r.Message = message;
                t.AddJobLogRow(r);

                // 保存到日志到 XML 文件
                t.WriteXml(jobLogFile);
            }
            catch (Exception)
            {}
        }
    3. 读日志的方法
        /// <summary>
        /// 读日志
        /// </summary>
        /// <returns>返回读取日志的 DataTable</returns>
        public static JobLogDataSet.JobLogDataTable ReadLog()
        {
            JobLogDataSet.JobLogDataTable jobLogDataTable = new JobLogDataSet.JobLogDataTable();
            try
            {
                // 从应用程序文件夹中,获得所有日志文件 JobLog*.xml
                string[] jobLogFiles = Directory.GetFiles(
                    AppDomain.CurrentDomain.BaseDirectory, "JobLog*.xml", SearchOption.TopDirectoryOnly);

                // 把每个日志记录读取到日志 DataTable 中
                foreach (string jobLogFile in jobLogFiles)
                {
                    if (File.Exists(jobLogFile))
                    {
                        // 读取所有日志文件到临时 DataTable
                        JobLogDataSet.JobLogDataTable t = new JobLogDataSet.JobLogDataTable();
                        t.ReadXml(jobLogFile);
                        // 导入日志记录到主日志 DataTable
                        foreach (JobLogDataSet.JobLogRow r in t)
                            jobLogDataTable.ImportRow(r);
                    }
                }
                // 返回读取的日志 DataTable
                return jobLogDataTable;
            }
            catch (Exception)
            {
                return jobLogDataTable;
            }
        }
    4. 在需要写日志的地方,直接调用 WriteLog 方法即可。

  • (转)如何用QTP解决图片验证码(解析QuickTest文本识别机制)?

    2008-10-15 10:06:30

    本文出自songfun的51Testing软件测试博客,转载请保留出处及链接:http://www.51testing.com/?songfun51Testing软件测试网 lb(sdG/C-j*_
    51Testing软件测试网U+OAT%VHj8j
    大家在使用QTP进行自动化测试的过程中经常会遇到图片验证码的问题——大家所关心的就是如何解决此类问题。51Testing软件测试网S s)O @+m QJ E
    这里我们首先要去了解为什么会有图片验证码。其实验证码的本质作用就是防止有人利用工具(灌水机、注册机,当然也不小心包括了我们的自动化测试工具)恶意猜解登陆或者不停的注册和灌水的。因此如果我们完全寄希望于通过GUI识别来获取内容是不切实际的——先打好预防针,免得读者希望太大,失望更大,呵呵!
    Z3GZF4X0 下面说说验证码的解决思路:
    Gy'`1Jd{ OeT0 其实解决图片验证码的思路有很多,我这里主要结合QTP9.5的新特性给大家介绍其中一种解决方案,就是利用它的OCR机制抓取文本内容。51Testing软件测试网%a4Q S1\y'n#QP,hP X
    在QTP9.5中,对象识别能力有了进一步改善,其中针对文本识别方面进行了优化,引入了ABBYY公司的OCR解决方案——这个相关的功能体现在QTP菜单的“Tools-->Options-->General--Use text recognition mechanisms in this order”里,详细内容后面会有具体介绍。51Testing软件测试网7} O0imK?
    先来看看ABBYY是何许公司,登录他们的官方网站可以看到一段相关介绍:“ABBYY是世界OCR(光学字符识别)、ICR(手写体识别)和语言软件的领航者。ABBYY 致力于人工智能(AI)和语言软件开发。提供全套文档识别,转换和数据捕获技术的产品解决方案。”如果你使用过图像文档转换的软件,一定会听说过FineReader OCR Professional ,其实它就是ABBYY公司的产品,用官方的说法就是“将通过扫描仪、MFP 或数码相机生成的图像快速转换为可编辑和可搜索的电子格式,而且识别率很高”,说白了就是可以借助它先进的OCR机制“读”出图片里的文本内容,并转换为PDF之类的文档。
    S,h h} {)n(v i0 有了ABBYY这么强大的背后支持,QTP自然底气十足,那么QTP到底如何以OCR机制识别文本呢?我们首先先了解一下什么是OCR。
    C;p;C#{.j2ZE5T0 打开“百度百科_OCR”,它的说明:“OCR(Optical Character Recognition,光学字符识别),是属于图型识别(Pattern Recognition,PR)的一门学问。其目的就是要让计算机知道它到底看到了什么,尤其是文字资料。 由于OCR是一门与识别率拔河的技术,因此如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(Intelligent Character Recognition)的名词也因此而产生。而根据文字资料存在的媒体介质不同,及取得这些资料的方式不同,就衍生出各式各样、各种不同的应用。”这里有个关键词:“正确率”,也就是“识别率”——既然不能够总是100%,我们自然不可能完全寄希望于通过QTP能够每次100%正确的去识别图片里的文本。尤其是“道高一尺魔高一丈”的今天,验证码加入了大量的干扰素,如扭曲、变形、错位、随机背景花纹,给OCR识别增加了很多难度——本来就不希望被软件识别到嘛。
    .GIG)q"MQt:}C x0
    )s+j h*z$}(O0 本文出自songfun的51Testing软件测试博客,转载请保留出处及链接:http://www.51testing.com/?songfun51Testing软件测试网 i.WC| {1W2ut2Q
    51Testing软件测试网WN#`n'M1m
    MhAXF,A/J0 了解了OCR之后,我们再来看看QTP对应的这个设置。如前面所说,通过QTP菜单的“Tools-->Options”选中到“General--Use text recognition mechanisms in this order”,这里的四个选项就是对应的不同设置。我们看看帮助的描述(我做了翻译):51Testing软件测试网 Uz"\;Oa g/kh
    =================================51Testing软件测试网WZ4i"a9j,A|P&P
    使用文本识别机制
    sTP/dq0
    7blEu"v!\R0R0 指定QTP在采用 “文本”或者“文本区域” 的 检查点或输出值 的步骤时,捕获文本内容所使用的文本识别机制。
    !],H OBw[0 以下有三种识别方式:51Testing软件测试网'J W/RgZ1F*J
    1、先使用Windows API,再使用OCR(默认)。
    }2xU(l+?4^.n d._0     指示QTP首先尝试以基于Windows API的机制从对象上直接获取文本内容。如果未获取到文本(比如,文本属于图片的一部分),QTP就会使用OCR的机制尝试获取这段文本。51Testing软件测试网;D(Kc%_]*Y/C&R#e }|
        强烈建议在使用中日韩(象形文字)、英的语言环境下采用这个设置。51Testing软件测试网 EL+r(h omoF

    $Te;|V&teH$a0 2、先使用OCR,再使用Windows API。51Testing软件测试网X4E7}4lk4Z$w
        指示QTP首先尝试使用OCR机制从对象上去获取文本。如果未获取到文本,QTP就会以Windows API的机制去获取文本内容。51Testing软件测试网7V/F2q ['Vv0}Fc-w4a
    51Testing软件测试网(g M5zZ9T9a&K8Kh
    3、仅使用Windows API方式。51Testing软件测试网hoBS;Rab\ r$Q
        指示QTP仅采用基于Windows API的机制从对象上获取文本内容。51Testing软件测试网l)n Kf1Z%z

    PO!H[:X6H:k9Q X0 4、仅使用OCR的方式。51Testing软件测试网3a[e[GSy Cp
        指示QTP仅采用基于OCR的机制从对象上获取文本内容。51Testing软件测试网 QT6A M/w~ d:SZQ
        在使用Windows Vista要使用这种方式。
    0v?\+r&hj0
    gL1T5u,\kD0 =================================51Testing软件测试网)Ps%t;G%co(^:Lt}
    本文出自songfun的51Testing软件测试博客,转载请保留出处及链接:http://www.51testing.com/?songfun51Testing软件测试网k3t%f)d!GO Q]
    51Testing软件测试网WN#`n'M1m
    Bb4p,]pv FP0 上面的内容已经解释的很明确了,接下来我们通过TextArea Output Value看看效果。51Testing软件测试网D.sH.j Yt'd^#g

    HG6`O!_0 如下图所示,QTP针对几张图片的识别效果:51Testing软件测试网(@rB:F7kF
    (一)、内容是51Testing的,QTP获取正确;内容是51Testing的G风格彩字,QTP获取错误(显示为IC_CHECK_PATTERN)
    I6hY8m:P g-\K0 51Testing软件测试网 xt Ow'bd

    +bnq jEB+V`.g1D0
    q:Q D!eO4T^)q/e0 (二)、内容是songfun的普通文本,QTP获取正确;内容是songfun的G风格彩字,QTP获取错误(也显示为IC_CHECK_PATTERN)
    \+Q3F$q6G x:WV'U0
    'n$rb.zs"D8tTc%h0 51Testing软件测试网*C0NR"a"i#|R:hz
    51Testing软件测试网*g,EQ/gM'hx
    51Testing软件测试网&dfgDO/?Av;G
    有兴趣大家可以自己做一些图片,甚至可以用QQ的验证码图片来试验一下,看看OCR效果。
    ]~$d!X4D^ a G051Testing软件测试网a?#mt)u aH]-W
    本文出自songfun的51Testing软件测试博客,转载请保留出处及链接:http://www.51testing.com/?songfun
    e \.lI$r+L9B#l$Z051Testing软件测试网WN#`n'M1m51Testing软件测试网6W1R-V}go[p
  • QTP日志实践的几点总结(转)

    2008-03-25 22:49:01

    背景:在日常使用QTP中,因为有QC的存在,导致了QTP的察看结果的功能并不是用的很顺手,所以笔者在脱离开QC的情况下,在工作实践中总结了QTP的日志实现的一些方法。
    1、生成txt文件。这是从开发那边得到的启示。
    首先定义一个sub:
    Public Sub WriteLineToFile(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 ="C:\" &testName& ".txt" 'change this according to your directory
    If Not (fileSystemObj.FileExists(filespec)) Then  
    Set logFile = fileSystemObj.CreateTextFile(fileSpec, ForWriting, True)  
    logFile.WriteLine ("#######################################################################")  
    logFile.WriteLine (currentDate & currentTime & " Test: " & environment.Value("TestName") )  
    logFile.WriteLine ("#######################################################################")  
    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        
    这样就能在txt中直接明了的看到自己的日志了。(个人感觉比看QTP的results好多了了,当然QTP自身的results还有错误图片等等,下面会介绍我的解决方案)

    题外话:在实际应用中,我会在sub中增加一个flag,来标志不同的严重等级,在不同的情况下控制输出不一样类型的日志。
    2、使用QTP自身的抓图功能
    Public Function capture_desktop()
    Dim datestamp
    Dim filename
    datestamp = Now()
    filename = Environment("TestName")&"_"&datestamp&".png"
    filename = Replace(filename,"/","")
    filename = Replace(filename,":","")
    filename = "C:\QTP_ScreenShots"&""&filename
    Desktop.CaptureBitmap filename
    Reporter.ReportEvent micFail,"image","<img src='" & filename & "'>"
    End Function
    该函数主要就是用到Desktop.CaptureBitmap的这个方法,把桌面的图片抓下来,这样比较自由的抓下任意时候桌面的图片,方便我们检查结果。

    题外话:可以通过Function的返回值和上面提到的方法结合在一起的话,效果会更好的。
    3、使用outlook发送邮件
    Public Sub SendEmail(testname,strsubject,stremailcontent,attachment,strrecipient)
    Set ōut = CreateObject("Outlook.Application")
    Set mapi = out.GetNameSpace("MAPI")
    Set email = out.CreateItem(0)
    email.Recipients.Add(strrecipient)
    email.Subject = strsubject
    email.Body = stremailcontent
    Set ōAttachment = email.Attachments.Add(attachment)
    email.Send
    Set ōutlook = Nothing
    Set mapi = Nothing
    End Sub

    题外话:假如我们把日志和抓图都结合在一起作为附件发出去的话,在自动化测试中后期会很有用,当然前提是不使用QC的情况下。

    4、这是一个针对上面第3点如何把抓图放在一个doc中。
    Set ōWord = CreateObject("Word.Application")
    oWord.DisplayAlerts = False
    oWord.Visible = False
    oWord.documents.open "testWordDoc.doc"
    Set ōDoc = oWord.ActiveDocument
    Set ōRange = oDoc.content
    oRange.ParagraphFormat.Alignment = 0
    oRange.insertafter vbcrlf '& " " & vbcrlf
    oRange.collapse(0)
    oRange.InlineShapes.AddPicture "ImagePath.bmp", False, True
    oWord.ActiveDocument.Save
    oWord.Application.Quit True
    Set ōRange = Nothing
    Set ōDoc = Nothing
    Set ōWord = Nothing
    当然QTP和excel,word结合的不错的,所以在测试中灵活运动,效果会很好的
  • QTP Excel函数

    2008-03-25 22:45:07


    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 User-Defined Function 学习经验汇总[转]

    2008-01-30 15:31:15

    1. 可以通过Function Definition Generator方便的定制自定义函数(Function)
    2. Built-in Function优先级高于User-Defined Function。因此若存在同名的话,QTP会优先调用内置的Function
    3. 通过RegisterUserFunc可以将自定义的函数注册为特定对象的方法,甚至可以覆盖原有对象的方法(Method)。通过UnRegisterUserFunc取消注册
    注册方式:RegisterUserFunc TOClass, MethodName, FunctionName, True
    反注册方式:UnRegisterUserFunc TOClass, MethodName
    4. 定义在Action中的Function以及注册的Method只能在当前Action中使用,若需要供全局使用则定义到Function Library中
    5. 如果Method在Action中注册并且被其他Action调用时,该Method定义也适用于调用Action(Calling Action)。但如果Function定义在被调用Action中(Called Action),则Calling Action会因为找不到Function定义而失败。这种情况的话,需要将Function 定义在Function Library中
    6. QTP在测试执行前会清除所有的Method Register
    7. 默认情况下,User-Defined Function的运行结果不会出现在Test Result中,可以自己用Reporter.ReportEvent添加log
    8. QTP在打开Test时加载了关联的Function Library,因此,若其他人或者你用其他编辑器修改了对应的Function Library,只有在QTP重新打开该Test后才生效
    9. QTP搜索Function的顺序是先Test在Function Library。另外,同名的Function存在于多个Function Library时,后一个被使用
    10. 对于同一个Method先后注册了两个不同的Function,后面的Method注册会覆盖前面的。当用UnRegisterUserFunc反注册时,会将该Method返回到原始状态,而不会回到前一个注册
    11. 在某Action中使用ExecuteFile后,该Function只能在当前Action中使用
    12. 对于存储在QC中的外部资源,如Function Library,QTP打开时为其创建了一个本地副本。因此若其他人修改了QC上的外部资源,或你使用其他编辑器进行修改时,该修改只有在QTP重新打开该Test才生效。但对于存储在本地的外部资源,不存在该问题
    13. 在Test Settings中设置了Default Function Library列表后,新建Test时这些Library即被集成到新创建的Test中。以后对Default Function Library列表的修改对已有Test不产生任何影响。
  • QTP自动化测试流程

    2008-01-29 20:16:10

    黑色字体是原文,蓝色字体是我的注释,代表我个人的看法,仅供参考。

    1)准备TestCase
            - 在进行自动化之前,将
    测试内容进行文档化,不建议直接录制脚本
            - 在录制脚本之前设计好脚本,便于录制过程的流畅
            - 由于
    测试用例设计和脚本开发可能不是同一个人完成,便于团队合作
            - 便于后期的维护
            - 文档化的方式:TD或者文档

    Test Case的建立是所有脚本成立的先觉条件,所以在正式开始编写脚本前,必须确保:
            - Case覆盖率高(需求覆盖、代码覆盖等)
            - Case书写步骤清晰,便于脚本与之一一对应
            - Case期望结果明了,便于脚本对期望结果进行检查
            - Case经过开发、测试Review,保证产品所有主要人员对产品及测试达成同一认识
            - 针对不同测试阶段,挑选在回归测试中需要自动化实现的Case(实属脚本计划阶段)

     
    2)配置QTP
            QTP支持不同的开发环境,在正式录制之前,需要根据被测程序的开发环境,选择合适的Add-In,并进行加载。

    做到以下几点会对后期的脚本维护产生莫大的方便:
            - 建立统一的脚本架构
            -
    共享资源的建立(对象库、测试数据等等)
            - 共用Function Library的建立
            - 建立统一的代码规范(含命名规范、注释、代码缩进、位图检查等)
            - 统一所有的编码风格
            - 统一配置测试环境,确保所有测试环境均能运行所写脚本

    3)录制脚本
            启动QTP的录制功能,按照Test Case的操作步骤描述执行,QTP自动记录每一步操作,并自动生成VBscrīpt脚本。

    除必要的位图检查之外,严格要求脚本必须使用手写,防止脚本录制导致代码臃肿以及可读性差。
     
    4)修改增强脚本
            刚刚录制好的脚本可能包含错误,或者没有达到预期的目的,这就需要在录制脚本的基础上,进行修改增强
            - 删除录制过程中多余的以及错误的操作,以最少的脚本完成任务
            - 如果前面操作的输出是后面操作的输入,则需要使用变量或者输出值来进行替换
            - 不是所有的操作都可以通过录制产生的,有些需要通过手工编码实现这些功能
            - 录制产生的脚本是线性的,可以加入条件、循环控制语句,实现更复杂的流程
            - 对脚本进行结构化
            - 加入注释,便于阅读和维护
     
    5)调试脚本
            - 回放通过的脚本,不一定是正确的,也可能会包含错误
            - 在测试脚本正式使用之前,要保证其本身的正确性
            - 避免测试脚本故障和被测程序故障搅在一起,不容易定位

    脚本调试完成后,需要完成如下几步才能真正的用在实际项目当中:
            - 单个脚本调试成功后,需要其他人员Review(类似极限编程)后方可Checkin代码
            - 把所有单独运行成功的脚本集合在一起,进行脚本的集成测试和系统测试

    6)回放脚本
            - 对于回放的错误,不要急于马上提交Bug,首先要判断是脚本本身的错误还是程序的错误,确认后再提交。
     
    7)脚本维护
            - 随着工作的不断推进,脚本量会越来越多
            - 被测试程序的不断更新,也需要更新相应的测试脚本
            - 采用版本管理工具保存脚本,如CVS、VSS,可以随时获取历史版本
            - 采用统一的脚本架构
            - 采用统一的命名规范
            - 添加充分的注释,避免时间久了,自己都不能马上读懂脚本

    如果前期工作做的好,脚本维护的成本会低出很多,所以强烈建议在前期能够形成统一的制度。

  • 如何解决返回数据库查询纪录条数(转)

    2008-01-29 19:37:21

    方法一
    Set   oRs   =   Server.CreateObject("ADODB.RecordSet")   
      oRs.Open   sSql,   oConn,   1,   1   
      来读数据.
    仅检索数据:rs.open   SQL,conn,1   
      更新数据:rs.open   SQL,conn,2,2,1

    方法二   
    用Select   Count(*)   As   RecordCount   From   [table]   
      oRs("RecordCount")来获取   
    方法三
    用Do   While   Not   oRs.Eof   
      RecordCount   =   RecordCount   +   1   
      Loop


    方法一原理如下:
    通常人们使用以下两种方法来执行SQL语句:     
      Set   Rs=Conn.Execute(SqlStr)     
      和     
      Set   Rs=Server.CreateObject(“ADODB.RecordSet“)     
      Rs.Open   SqlStr,Conn,CursorType,LockType     
       
      (RecordSet对象方法请看这里)     
       
       
      由于默认的记录集游标是服务器游标,     
      Rs.CursorLocation   =   adUseServer     
      所以返回Rs.RecordCount=-1,     
      应该把服务器游标改为客户端游标,     
      Rs.CursorLocation   =   adUseClient     
      Rs.Open   SqlStr,Conn,CursorType,LockType     
       
      rs.cursortype     
       
      光标类型   recordcount   属性     
      ---------------------------------------------     
      ForwardOnly   0(默认)   返回-1     
      Keyset   1   正确的记录数     
      Dynamic   2   -1或不正确的记录数,依数据源而定     
      Static   3   正确的记录数
  • Scripting Techniques (转)

    2008-01-29 18:29:42

    Adding Elements to a Dictionary


    Demonstration scrīpt that adds three key-item pairs to a scrīpt Runtime Dictionary. scrīpt must be run on the local computer.
    Set ōbjDictionary = CreateObject("scrīpting.Dictionary")
    objDictionary.Add "Printer 1", "Printing"   
    objDictionary.Add "Printer 2", "Offline"
    objDictionary.Add "Printer 3", "Printing"

    Creating an Instance of Internet Explorer


    Demonstration scrīpt that creates an instance of Internet Explorer, opened to a blank page.
    Set ōbjExplorer = Wscrīpt.CreateObject("InternetExplorer.Application")
    objExplorer.Navigate "about:blank"   
    objExplorer.ToolBar = 0
    objExplorer.StatusBar = 0
    objExplorer.Width=300
    objExplorer.Height = 150 
    objExplorer.Left = 0
    objExplorer.Top = 0
    objExplorer.Visible = 1

    Creating scrīpt Documentation Using scrīpt Comments


    Demonstrates the use of the FileSystemObject as a way to copy comments from a scrīpt to a separate text file. Requires comments to have been marked using '*.
    Const ForReading = 1
    Const ForWriting = 2
    Set ōbjFSO = CreateObject("scrīpting.FileSystemObject")
    Set ōbjscrīptFile = objFSO.OpenTextFile("c:\scrīpts\Service_Monitor.vbs", _
        ForReading)
    Set ōbjCommentFile = objFSO.OpenTextFile("c:\scrīpts\Comments.txt", _ 
        ForWriting, TRUE)
    Do While objscrīptFile.AtEndOfStream <> TRUE
        strCurrentLine = objscrīptFile.ReadLine
        intIsComment = Instr(1,strCurrentLine,"'*")
        If intIsComment > 0 Then
            objCommentFile.Write strCurrentLine & VbCrLf
        End If
    Loop
    objscrīptFile.Close
    objCommentFile.Close

    Determining the Number of Items in a Dictionary


    Demonstration scrīpt that counts the number of key-item pairs in a scrīpt Runtime Dictionary. scrīpt must be run on the local computer.
    Set ōbjDictionary = CreateObject("scrīpting.Dictionary")
    objDictionary.Add "Printer 1", "Printing"   
    objDictionary.Add "Printer 2", "Offline"
    objDictionary.Add "Printer 3", "Printing"
    Wscrīpt.Echo objDictionary.Count

    Displaying Real Time Events in a Command Window


    Creates a temporary event consumer that monitors the event log for error events. When an error event occurs, the scrīpt displays the event information in the command window.
    strComputer = "."
    Set ōbjWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate,(Security)}!\\" & _
            strComputer & "\root\cimv2")
    Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
        ("Select * from __InstanceCreationEvent within 5 where TargetInstance isa " _
            & "'Win32_NTLogEvent' and TargetInstance.EventType = '1'")
    Do
        Set ōbjLatestEvent = colMonitoredEvents.NextEvent
            Wscrīpt.Echo "Record No.: " & _
                objLatestEvent.TargetInstance.RecordNumber
            Wscrīpt.Echo "Event ID: " & objLatestEvent.TargetInstance.EventCode
            Wscrīpt.Echo "Time: " & objLatestEvent.TargetInstance.TimeWritten
            Wscrīpt.Echo "Source: " & objLatestEvent.TargetInstance.SourceName
            Wscrīpt.Echo "Category: " & _
                objLatestEvent.TargetInstance.CategoryString
            Wscrīpt.Echo "Event Type: " & objLatestEvent.TargetInstance.Type
            Wscrīpt.Echo "Computer: " & _
                objLatestEvent.TargetInstance.ComputerName
            Wscrīpt.Echo "User: " & objLatestEvent.TargetInstance.User
            Wscrīpt.echo "Text: " & objLatestEvent.TargetInstance.Message
    Loop

    Displaying Tabular Output in a Command Window


    Retrieves service data from a computer, and then outputs that data in tabular format in a command window.
    Set colServices = GetObject("winmgmts:"). _
        ExecQuery("Select * from Win32_Service")
    For Each objService in colServices
        intPadding = 50 - Len(objService.DisplayName)
        intPadding2 = 17 - Len(objService.StartMode)
        strDisplayName = objService.DisplayName & Space(intPadding)
        strStartMode = objService.StartMode & Space(intPadding2)
        Wscrīpt.Echo strDisplayName & strStartMode & objService.State 
    Next

    Masking Command Line Passwords


    Demonstration scrīpt that uses scrīptPW.dll to mask passwords entered at the command line.
    Set ōbjPassword = CreateObject("scrīptPW.Password") 
    Wscrīpt.StdOut.Write "Please enter your password:" 
    strPassword = objPassword.GetPassword() 
    Wscrīpt.Echo
    Wscrīpt.Echo "Your password is: " & strPassword

    Masking Passwords Using Internet Explorer


    Demonstration scrīpt that creates an instance of Internet Explorer, and retrieves a password typed into a password-style text box. Requires a Web page named password.htm with the appropriate text box.
    Set ōbjExplorer = Wscrīpt.CreateObject _
        ("InternetExplorer.Application", "IE_")
    objExplorer.Navigate "file:///c:\scrīpts\password.htm"   
    objExplorer.Visible = 1             
    objExplorer.ToolBar = 0
    objExplorer.StatusBar = 0
    objExplorer.Width=400
    objExplorer.Height = 250 
    objExplorer.Left = 0
    objExplorer.Top = 0
    Do While (objExplorer.Document.Body.All.OKClicked.Value = "")
        Wscrīpt.Sleep 250                 
    Loop 
    strPassword = objExplorer.Document.Body.All.PasswordBox.Value
    objExplorer.Quit
    Wscrīpt.Sleep 250
    Wscrīpt.Echo strPassword

    Removing All Elements from a Dictionary


    Demonstration scrīpt that deletes all the key-item pairs from a scrīpt Runtime Dictionary. scrīpt must be run on the local computer.
    Set ōbjDictionary = CreateObject("scrīpting.Dictionary")
    objDictionary.Add "Printer 1", "Printing"   
    objDictionary.Add "Printer 2", "Offline"
    objDictionary.Add "Printer 3", "Printing"
    colKeys = objDictionary.Keys
    Wscrīpt.Echo "First run: "
    For Each strKey in colKeys
        Wscrīpt.Echo strKey
    Next
    objDictionary.RemoveAll
    colKeys = objDictionary.Keys
    Wscrīpt.Echo VbCrLf & "Second run: "
    For Each strKey in colKeys
        Wscrīpt.Echo strKey
    Next

    Removing Debugging Comments


    Demonstrates the use of the FileSystemObject as a way to remove debugging comments from a scrīpt. Requires comments to have been marked as '* BUG.
    Const ForReading = 1
    Const ForWriting = 2
    Set ōbjFSO = CreateObject("scrīpting.FileSystemObject")
    Set ōbjTextFile = objFSO.OpenTextFile("C:\scrīpts\CreateUser.vbs", ForReading)
     
    Do While objTextFile.AtEndOfStream <> true
        strNextLine = objTextFile.Readline
        intCheckForBugComment = Instr(strNextLine, "'* BUG")
        If intCheckForBugComment = 0 Then
            strSavedLines = strSavedLines & strNextLine & VbCrLf
        End If
    Loop
     
    Set ōbjTextFile = objFSO.OpenTextFile _
        ("c:\scrīpts\CreateUser.vbs ", ForWriting)
    objTextFile.Write strSavedLines 
    objTextFile.Close

    Removing One Element from a Dictionary


    Demonstration scrīpt that deletes a specific key-item pair from a scrīpt Runtime Dictionary. scrīpt must be run on the local computer.
    Set ōbjDictionary = CreateObject("scrīpting.Dictionary")
    objDictionary.Add "Printer 1", "Printing"   
    objDictionary.Add "Printer 2", "Offline"
    objDictionary.Add "Printer 3", "Printing"
    colKeys = objDictionary.Keys
    Wscrīpt.Echo "First run: "
     
    For Each strKey in colKeys
        Wscrīpt.Echo strKey
    Next
     
    objDictionary.Remove("Printer 2")
    colKeys = objDictionary.Keys
    Wscrīpt.Echo VbCrLf & "Second run: "
     
    For Each strKey in colKeys
        Wscrīpt.Echo strKey
    Next

    Retrieving Command Line Arguments from an Active Directory Container


    Demonstration scrīpt that retrieves the names of all the computers in an Active Directory container, and then returns service information from each of those computers.
    Set ōbjDictionary = CreateObject("scrīpting.Dictionary")
    i = 0
    Set ōbjOU = GetObject("LDAP://CN=Computers, DC=fabrikam, DC=com")
    objOU.Filter = Array("Computer")
    For Each objComputer in objOU 
        objDictionary.Add i, objComputer.CN
        i = i + 1
    Next
    For Each objItem in objDictionary
        Set colServices = GetObject("winmgmts://" & _
            objDictionary.Item(objItem) _
                & "").ExecQuery("Select * from Win32_Service")
        Wscrīpt.Echo colServices.Count
    Next

    Retrieving Command Line Arguments from a Text File


    Demonstration scrīpt that opens a hypothetical text file consisting of server names, then retrieves service information from each on the servers in the file.
    Const ForReading = 1
    Set ōbjDictionary = CreateObject("scrīpting.Dictionary")
    Set ōbjFSO = CreateObject("scrīpting.FileSystemObject")
    Set ōbjTextFile = objFSO.OpenTextFile("c:\scrīpts\servers.txt", ForReading)
    i = 0
    Do Until objTextFile.AtEndOfStream 
        strNextLine = objTextFile.Readline
        objDictionary.Add i, strNextLine
        i = i + 1
    Loop
    For Each objItem in objDictionary
        Set colServices = GetObject("winmgmts://" & _
            objDictionary.Item(objItem) _
                & "").ExecQuery("Select * from Win32_Service")
        Wscrīpt.Echo colServices.Count
    Next

    Retrieving a Web Page


    Retrieves the HTML source for the Web page http://www.microsoft.com. This scrīpt contributed by Maxim Stepin of Microsoft.
    url="http://www.microsoft.com"
    Set ōbjHTTP = CreateObject("MSXML2.XMLHTTP")
    Call objHTTP.Open("GET", url, FALSE)
    objHTTP.Send
    Wscrīpt.Echo(objHTTP.ResponseText)

    Saving Data in XML Format


    Demonstration scrīpt that retrieves service information for a computer, and then saves that data as an XML file.
    Const ForAppending = 2
    Set ōbjFSO = CreateObject("scrīpting.FileSystemObject")
    Set ōbjTextFile = objFSO.OpenTextFile _
        ("c:\scrīpts\service_status.xml", ForAppending, True)
    objTextFile.WriteLine ""
    objTextFile.Write ""
    objTextFile.WriteLine ""
    strComputer = "."
    Set colServices = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2"). _
            ExecQuery("Select * from Win32_Service")
    For Each objService in colServices    
        objTextFile.WriteLine ""
        objTextFile.WriteLine ""
        objTextFile.WriteLine objService.DisplayName
        objTextFile.WriteLine ""
        objTextFile.WriteLine ""
        objTextFile.WriteLine objService.State
        objTextFile.WriteLine ""
        objTextFile.WriteLine ""
    Next
    objTextFile.WriteLine ""
    objTextFile.Close

    Sorting WMI Data


    Demonstration scrīpt showing how WMI data can be sorted using a disconnected recordset (by itself, WMI does not allow you to specify a sort order for returned data). In this scrīpt, service information is retrieved using WMI and is stored in a disconnected recordset, a recordset that is not tied to a physical data source. The Sort method is then used to sort the service data by service state rather than by service name.
    Const adVarChar = 200
    Const MaxCharacters = 255
     
    Set DataList = CreateObject("ADOR.Recordset")
    DataList.Fields.Append "ServiceName", adVarChar, MaxCharacters
    DataList.Fields.Append "ServiceState", adVarChar, MaxCharacters
    DataList.Open
     
    strComputer = "."
    Set ōbjWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set ServiceList = objWMIService.ExecQuery _
        ("Select * from Win32_Service")
     
    For Each Service in ServiceList
        DataList.AddNew
        DataList("ServiceName") = Service.Name
        DataList("ServiceState") = Service.State
        DataList.Update
    Next
     
    DataList.Sort = "ServiceState"
    DataList.MoveFirst
     
    Do Until DataList.EOF
        Wscrīpt.Echo DataList.Fields.Item("ServiceName") _
            & vbTab & DataList.Fields.Item("ServiceState")
        DataList.MoveNext
    Loop

    Suppressing Multiple Event Notifications


    Issues an alert if available space on a disk drive falls below 100 megabytes. Will wait one hour before issuing the next alert.
    dtmStartTime = Now
    strComputer = "."
    Set ōbjWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set ōbjDiskDrives = objWMIService.ExecQuery _
        ("Select * from Win32_LogicalDisk")
    For Each objDrive in objDiskDrives
        If objDrive.FreeSpace < 10000000 Then
            Wscrīpt.Echo "Drive is low on disk space."
        End If
    Next
    Do
    Set ōbjDiskDrives = objWMIService.ExecQuery _
        ("Select * from Win32_LogicalDisk")
    For Each objDrive in objDiskDrives
        If objDrive.FreeSpace < 10000000 Then
            intElapsedHours = DateDiff("h", dtmStartTime, Now)
                If intElapsedHours >= 1 Then
                    Wscrīpt.Echo "Drive is low on disk space." 
                dtmStartTime = Now
            End If  
        End If
    Next
    Wscrīpt.Sleep 1000
    Loop

    Tracking scrīpt Progress in a Command Window


    Demonstrates the use of StdOut as a method for indicating the progress being made by a scrīpt.
    Wscrīpt.Echo "Processing information. This might take several minutes."
    strComputer = "."
    Set colServices = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2"). _
        ExecQuery("Select * from Win32_Service")
    For Each objService in colServices
        Wscrīpt.StdOut.Write(".")
    Next
    Wscrīpt.StdOut.WriteLine
    Wscrīpt.Echo "Service information processed."

    Tracking scrīpt Progress Using Internet Explorer


    Demonstrates how to use Internet Explorer as a method for indicating the progress being made by a scrīpt.
    Set ōbjExplorer = Wscrīpt.CreateObject("InternetExplorer.Application")
    objExplorer.Navigate "about:blank"   
    objExplorer.ToolBar = 0
    objExplorer.StatusBar = 0
    objExplorer.Width=400
    objExplorer.Height = 200 
    objExplorer.Left = 0
    objExplorer.Top = 0
    Do While (objExplorer.Busy)
        Wscrīpt.Sleep 200
    Loop    
    objExplorer.Visible = 1             
    objExplorer.Document.Body.InnerHTML = "Retrieving service information. " _
        & "This might take several minutes to complete."
    strComputer = "."
    Set colServices = GetObject("winmgmts: \\" & strComputer & "\root\cimv2"). _
        ExecQuery("Select * from Win32_Service")
    For Each objService in colServices
        Wscrīpt.Sleep 200
    Next
    objExplorer.Document.Body.InnerHTML = "Service information retrieved."
    Wscrīpt.Sleep 3000
    Wscrīpt.Quit

    Using a Text File as a Command Line Argument


    Demonstration scrīpt that allows you to drag a text file (consisting of server names) onto the scrīpt icon in Windows Explorer. The scrīpt then opens the text file, then retrieves service information from each on the servers in the file.
    Set ōbjArgs = Wscrīpt.Arguments
    Const ForReading = 1
    Set ōbjDictionary = CreateObject("scrīpting.Dictionary")
    Set ōbjFSO = CreateObject("scrīpting.FileSystemObject")
    Set ōbjTextFile = objFSO.OpenTextFile(objArgs(0), ForReading)
    i = 0
     
    Do While objTextFile.AtEndOfStream <> True
      strNextLine = objTextFile.Readline
      objDictionary.Add i, strNextLine
      i = i + 1
    Loop
     
    For Each objItem in objDictionary
      Set colServices = GetObject("winmgmts://" & objDictionary.Item(objItem) _
          & "").ExecQuery("Select * from Win32_Service")
      Wscrīpt.Echo colServices.Count
    Next

    Verifying the Existence of a Dictionary Key


    Demonstration scrīpt that verifies the existence of a particular key within a scrīpt Runtime Dictionary. scrīpt must be run on the local computer.
    Set ōbjDictionary = CreateObject("scrīpting.Dictionary")
    objDictionary.Add "Printer 1", "Printing"   
    objDictionary.Add "Printer 2", "Offline"
    objDictionary.Add "Printer 3", "Printing"
    If objDictionary.Exists("Printer 4") Then
        Wscrīpt.Echo "Printer 4 is in the Dictionary."
    Else
        Wscrīpt.Echo "Printer 4 is not in the Dictionary."
    End If
  • QTP调用.NET类库(转)

    2008-01-29 17:14:25

      QTP9.2这个版本提供了调用.net框架的功能,使用DotNetFactory对象就可以实现。QTP的帮助文档里面提供了一个例子:
     
    Set var_CreateInstance = DotNetFactory.CreateInstance("System.Windows.Forms.Form", "System.Windows.Forms")

    var_CreateInstance.Show
     
      下面说一下如何用DotNetFactory调用自己开发的.net类库。
     
      首先用Visual Studio 2003或者2005创建一个新项目:类库,用的是C#。新建一个类,假设命名空间是Test.myTest,类名是QTPTest。我们再新建一个公共方法: public string DoAction()
     
      假设编译后产生的文件是d:\mtTest.dll。下面在QTP里面写脚本:
     
    Set ōbj = DotNetFactory.CreateInstance("Test.myTest.QTPTest", "d:\mtTest.dll")
     
    obj.DoAction
     
      这样就可以在QTP中使用.net类库了,我们可以借助于.net框架的强大功能,把很多测试脚本需要使用的公用功能(比如测试数据准备),用C#实现,然后在QTP中调用,让QTP脚本更强大。

     

  • Send Email through VBS

    2008-01-29 15:20:54

    脚本资源来自微软脚本库:

    Set ōbjEmail = CreateObject("CDO.Message")

    objEmail.From = "monitor1@fabrikam.com"
    objEmail.To = "admin1@fabrikam.com"
    objEmail.Subject = "Atl-dc-01 down"
    objEmail.Textbody = "Atl-dc-01 is no longer accessible over the network."
    objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    objEmail.Configuration.Fields.Item    ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "STMP'Server
    objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25  ' Port
    objEmail.Configuration.Fields.Update

    objEmail.Send

  • QTP基础代码(转)

    2008-01-12 23:10:05

    1 生产随机数列
    第一种方法
    randomize'更新反回的数据
    funcation rand(k)
    n=int((k-1)*rnd+1)
    rand=n
    end funcation

    第二种方法
    n=randomnumber.value(1,255)

    2  当运行到表中的某一行,自动导出表中的所有数据
    row=datatable.getcurrentrow
    if row="5" then
      datatable.export("d:\data.xml")
    end if

    3
    webedit("txtpass").setsecure"sdsdf...."
    如果参数化密码,可以直接在数据表中写入未加密的密码,它会自动识别,即不用把setsecure改为set

    4 如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证
    if browser("web_name").dialog("dialog_name").exist(1) then'如果不出现=false
         error_message=browser("web_name").dialog("diaglog_name").static("用户密码错误!".getRoproperty("text")
       if error_message<>(datatable.value("error_info"))then
             msgbox(error_message)
          end if
         browser("web_name").dialog("diaglog_name").close
      end if
    这里我总结了两点技巧:
      一是:对于dialog中,虽然提示信息对象名称是"用户密码错误",但如果信息对象名称是“该用户不存在”,不用更改会自动识别,我想主要是录制第一遍时,“用户密码错误”只是让运行时能找到这个控制,而不管它是什么内容,因为在对象仓库中,text不是决定该对象的属性
        二是:如果对于提示信息比较长的,可以用mid(error_message,n,m)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理

    5  datatable.value("num")只在global形式下的一种省略形式;完整形式是:
    datatable.value("num",dtlocalsheet)

    -----向某一列的单元格赋值:
    datatable.value("column_name",dtlocalsheet)="nanjing"

    -----取得某一行具体值:
    datatable.setcurrentrow(n)
    msgbox(datatable.getsheet("global").getparameter("column_name").Rawvalue)
    或者kk=datatable.Rawvalue("column_name","action1")

    ----在run-time时,动态添加表格与数据
    kk=datatable.addsheet("sheet_name").addparameter("column_name","value").name;

    7   wintreeview一些操作
    选择一个条目:wintreeview.select(item)'根是0
    根的名称:wintreeview.getitem(0)

    8   数据库检查点模块:
    sub database_check
    set con=createobject("adodb.connection")
    con.open "Descrīption=IBM_ODBC;DRIVER=SQL Server;SERVER=IBM;UID=sa;"&_
                     "PWD=123456;APP=Quick Test Pro;WSID=IBM;DATABASE=IBM_table"
    'access方式:con.open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=d:\test.mdb"
    'Orocle方式:con.open "DRIVER={Oracle in OraHome92};SERVER=CESHI;UID=CND_TEST;PWD=CND;DBQ=CESHI;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;"
    set record=createobject("adodb.recordset")
    sql="select*from ibm_one_table"
    record.open sql,con
    DO
    if(record("ibm_table_column")="kai")then'//查找表格中有多少kai
    num=num+1;
    end if
    record.movenext
    loop until record.eof=true
    record.close
    set record=nothing
    con.close
    set con=nothing
    end sub

    9   换行符
        vbcr----chr(13)回车符// vblf----chr(10)换行符
        vbcrlf----chr(13)+chr(10)结合//type(chr(13)就相当于按了一上键盘上的enter

    10  Run from step有两种方式:
    在Keyword View模式会从本步骤运行到所有action结束
    在expert view模式仅会将本action运行结束

    11  由于对象属性原因,无法识别对象
    -----对于对象属性是变化的,可以参数化/或者用正则表达式
    -----报匹配多个对象错误,可以spy查看对象,添加一个该对象另一个唯一标识属性
    -----有时可以删除对象的变化的属性来解决识别问题
    ------对于多个完全相同的对象,可以采用添加index,location,createtime等特殊属性来识别
      (index:按照程序源码,绘制对象的先后标识对象,所以与其它相同对象是相互依赖,当其它对象发生
      变化后,原先的所有对象index属性要发生变化,开始是0;如index:=0;
            location:根据对象的位置进行确定,从上到下,从左到右;
      CreateTime:按照对象被浏览器打开的先后标识对象)
    ------另外换一种思维方式,采取等效的方法;比如用键盘代替鼠标或用操作系统本身特性去解决问题

    12  对系统文件的操作
    -------从系统的文件中获取信息及删除文件
      get_file_infor("c:\she.mpg")
       function get_file_infor(url)
        dim fso,f
        set fso=createobject("scrīpting.filesystemobject")
        set f=fso.getfile(url)
        f.name:f.size:f.type:f.datacreated'///获取文件信息
        fso.deletefile(url)'/////删除文件
       end function
    --------获取文件夹里所有文件信息
    get_folder_infor("c:\kai")
    function get_folder_infor(folder)
    dim fso,f,f1,n
    set fso=createobject("scrīpting,filesystemobject")
    set f=fso.getfolder(folder)
    set fc=f.files
    for each f1 in fc
    select case f1.name
    case"kai.mpg","she.mpg","dd.mp3"'//检查文件夹里是否含有这些文件
    end select
    next
    end function

    13   等待某个对象出现方法
    y=......waitproperty("visible",true,10000)

    14   防程序中断方法
    On error resume next
    On error goto handle

    15  数组的应用:
    name=array(1,2,"aa","bb")
    name(2)="aa"
    16  正则表达式应用模板
    进行日期YYYY-MM-DD的格式检查 :
    Function RegExpTest(patrn, strng)
      Dim regEx, Match, Matches      ' Create variable.
      Set regEx = New RegExp         ' Create a regular expression.
      regEx.Pattern = patrn         ' Set pattern.
      regEx.IgnoreCase = True         ' Set case insensitivity.
      regEx.Global = True         ' Set global applicability.
      Set Matches = regEx.Execute(strng)   ' Execute search.
      For Each Match in Matches      ' Iterate Matches collection.
        RetStr = RetStr & "Match found at position "
        RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
        RetStr = RetStr & Match.Value & "'." & vbCRLF
      Next
      RegExpTest = RetStr
    End Function
    date_pattern="^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((01,3-9])|(1[0-2]))-(29|30)))))$"
    result_message=RegExpTest(date_pattern, inputbox("请你输入要检查的时间:"))'用其它正则表达式更改此处
    Select case result_message
    Case ""
             msgbox("你输入的日期格式与标准不匹配")
    case else  MsgBox(result_message)
    end select

    17   返回一个字符串在另一字符串中的位置
    instr(string1,string2)

    18   有时回放出现找不到对象时,可能不是由于你的代码问题,而是由于你的操作系统等设置问题;
    举例说明1:
    比如:你录制一个选择磁盘中的文件动作
    会录制为:
    .winlistview("  ").drap 46,99
    .winlistview("  ").draponitem "she.mp3"
    下次录制的时候,如果你的系统文件改为不显示扩展名,下次执行的时候,QTP就找不到she.mp3,只能找到she;
    举例说明2:
    有时由于不同操作系统以及不同的ie,导致有些窗口不能识别,比如在2000下弹出的网页对话框的标题是:
    “web对话框",而在2003上是”网页对话框"

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

    20 Action之间的参数传递
    例如:在Action1中,有如下代码:
    out_str="This is out_string"
    RunAction "Action2",oneIteration,out_str
    在Acton2中,在其step->Action Properties中的,input参数栏,加入out_str后,
    msgbox(parameter("out_str")),就能正确显示参数了 

    21 Wscrīpt.Shell的一些应用
    set WshShell =CreateObject("Wscrīpt.Shell")
    WshShell.SendKeys "{ENTER}"     '模拟键盘进行操作
    WshShell.AppActivate "Calculator"             '启动应用程序

    22 获取对象属性名称用法:
    GetRoProperty----从应用程序界面上获取对象属性(即,是脚本运行时,获取的对象动态属性值)
               例如:获取对象库中index属性值,似乎只能用GetToProperty,因为应用程序界面上对象没有该属性,只是QTP为识别该对象创立的描述属性;
    GetToproperty----从对象库中描述对象的属性,静态值
    GetToProperties----获取用于标识对象的属性集;对于这个集合,有count等属性方法

    23 FireEvent的使用-
    可以对一个对象进行更复杂的操作
    如:FireEvent("onfocus")   '使一个控件获取焦点
         FireEvent("ondblclick")  '实现双击/也可以在事件设定中针对该对象事件响应  

    24 模板的应用
    -----新建一个文本,输入一些新建Action时常包含的信息,然后保存为ActionTemplate.MST文件,
     并复制到QTP/dat目录下;这样每次新建action都会包含固定的信息了;
    例如:
    '-------------------脚本说明---------------
    '产品版本:      __Build(  )
    '测试员:
    '编写日期:
    '测试功能:
    '脚本类型:
    '被测试对象初始状态:
    '进展程度:
    '基本思路:
    '主要功能函数:
    '历史修改:
    '没解决的问题:
    '--------------------脚本内容-------------

    25 在对象库中,两个对象有时不能通过更改属性或命名来达到两个对象完全一致的替换;
    在web-mod项目中,我在对象库里添加了一个自动含有index标识属性的对象,然后每次通过SetToproperty来改变
    index值,对对象进行数据驱动,使其操作另一个对象,但脚本始终操作原先index属性值的对象;后来,把该对象
    删除掉,重新添加一个不自动含有index标识属性的该类对象,然后,手工添加,index标识属性,后来脚本能正常 工作了,可见两次的对象属性完全一致,但形成方式不一样,导致的结果往往也不一样;

    26 childobject的应用
    childobject可以返回界面上满足条件的对象集合,而且与对象库里是否有这些对象无关,这就可以简化对象库;
    返回的对象集合的count方法可以返回对象个数,这就可以通过下标对单个对象进行操作;在出现index标识对象时
    可以进行运用
    如:Set m_WinCheck=Descrīption.Create()
          m_WinCheck("nativeclass").Value="Button"
          set All_WinCheck=Window("").Dialog("").Childobject(m_WinCheck)
          n=All_WinCheck.Count()
         for i=0 to n-1
          All_WinCheck(i).Set "ON"
         next
    再加三个

    27 Create Log File:

    Dim LOGFile, fso, MyFile

    LOGFile="C:\Log.txt"
    Set fso = CreateObject("scrīpting.FileSystemObject")
        If fso.FileExists(LOGFile) = False Then
               Set MyFile = fso.CreateTextFile(LOGFile, True)
               MyFile.Close
        end if
    Set MyFile = fso.OpenTextFile(LOGFile, 8, True)
    MyFile.WriteLine("")
    MyFile.WriteLine(" " & Cstr(Now) & " ---------------------------------------------------------")
    MyFile.WriteLine("LOG Information!")
    MyFile.Close
    28 数据输入输出方法
    数据输入输出的方法:
    1  ExecuteFile"e:\kk.vbs"
    2  Environment.LoadFromFile("e:\k.xml")
    3  Datatable.ImportSheet/Import
    4  GetData from DataBase
    5  Datatable autofill
    6  Action input/output
    7  Use GetxxProperty to get data from Object
    8  Use Some Function to Product data

  • QTP获取本机打印机(含本地与网络)与网络打印机属性

    2008-01-11 15:02:42

    1. 获取本机所有本地与网络打印机属性:

    strComputer = "."
    Set ōbjWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colInstalledPrinters =  objWMIService.ExecQuery ("Select * from Win32_PrinterDriver")

    PrtNameArray = Array ()
    ReDim PrtNameArray (colInstalledPrinters.Count-1)
    i = 0
    For each objPrinter in colInstalledPrinters
     PrtNameArray(i) = objPrinter.Name
     i = i + 1
    Next

    Reference from Microsoft.com (scrīpt Center)

    strComputer = "."
    Set ōbjWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colInstalledPrinters =  objWMIService.ExecQuery _
        ("Select * from Win32_PrinterDriver")

    For each objPrinter in colInstalledPrinters
        Wscrīpt.Echo "Configuration File: " & objPrinter.ConfigFile
        Wscrīpt.Echo "Data File: " & objPrinter.DataFile
        Wscrīpt.Echo "Descrīption: " & objPrinter.Descrīption
        Wscrīpt.Echo "Driver Path: " & objPrinter.DriverPath
        Wscrīpt.Echo "File Path: " & objPrinter.FilePath
        Wscrīpt.Echo "Help File: " & objPrinter.HelpFile
        Wscrīpt.Echo "INF Name: " & objPrinter.InfName
        Wscrīpt.Echo "Monitor Name: " & objPrinter.MonitorName
        Wscrīpt.Echo "Name: " & objPrinter.Name
        Wscrīpt.Echo "OEM Url: " & objPrinter.OEMUrl
        Wscrīpt.Echo "Supported Platform: " & objPrinter.SupportedPlatform
        Wscrīpt.Echo "Version: " & objPrinter.Version
    Next

    2. 获取网络打印机属性

    Reference from QTP Help (Windows scrīpt Host)

    Set WshNetwork = Wscrīpt.CreateObject("Wscrīpt.Network")
    Set ōDrives = WshNetwork.EnumNetworkDrives
    Set ōPrinters = WshNetwork.EnumPrinterConnections
    Wscrīpt.Echo "Network drive mappings:"
    For i = 0 to oDrives.Count - 1 Step 2
       Wscrīpt.Echo "Drive " & oDrives.Item(i) & " = " & oDrives.Item(i+1)
    Next
    Wscrīpt.Echo
    Wscrīpt.Echo "Network printer mappings:"
    For i = 0 to oPrinters.Count - 1 Step 2
       Wscrīpt.Echo "Port " & oPrinters.Item(i) & " = " & oPrinters.Item(i+1)
    Next

  • QTP获取内存占有量

    2008-01-10 20:24:57

    On Error Resume Next
    strComputer = "localhost"
    Set ōbjWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_PerfRawData_PerfOS_Memory",,48)

    For Each objItem in colItems
    msgbox objItem.AvailableBytes
    Next
    Set ōbjWMIService = Nothing
    Set colItems = Nothing
  • VBS的常用函数

    2008-01-10 19:28:12

    Abs(number) 取得数值的绝对值。  
    Asc(String) 取得字符串表达式的第一个字符ASCII 码。  
    Atn(number) 取得一个角度的反正切值。  
    CallByName (object, procname, usecalltype,[args()]) 执行一个对象的方法、设定或传回对象的属性。  
    CBool(expression) 转换表达式为Boolean 型态。  
    CByte(expression) 转换表达式为Byte 型态。  
    CChar(expression) 转换表达式为字符型态。  
    CDate(expression) 转换表达式为Date 型态。  
    CDbl(expression) 转换表达式为Double 型态。  
    CDec(expression) 转换表达式为Decimal 型态。  
    CInt(expression) 转换表达式为Integer 型态。  
    CLng(expression) 转换表达式为Long 型态。  
    CObj(expression) 转换表达式为Object 型态。  
    CShort(expression) 转换表达式为Short 型态。  
    CSng(expression) 转换表达式为Single 型态。  
    CStr(expression) 转换表达式为String 型态。  
    Choose (index, choice-1[, choice-2, ... [, choice-n]]) 以索引值来选择并传回所设定的参数。  
    Chr(charcode) 以ASCII 码来取得字符内容。  
    Close(filenumberlist) 结束使用Open 开启的档案。  
    Cos(number) 取得一个角度的余弦值。  
    Ctype(expression, typename) 转换表达式的型态。  
    DateAdd(dateinterval, number, datetime) 对日期或时间作加减。  
    DateDiff(dateinterval, date1, date2) 计算两个日期或时间间的差值。  
    DatePart (dateinterval, date) 依接收的日期或时间参数传回年、月、日或时间。  
    DateSerial(year, month, day) 将接收的参数合并为一个只有日期的Date 型态的数据。  
    DateValue(datetime) 取得符合国别设定样式的日期值,并包含时间。 
    Day(datetime) 依接收的日期参数传回日。  
    Eof(filenumber) 当抵达一个被开启的档案结尾时会传回True。  
    Exp(number) 依接收的参数传回e 的次方值。  
    FileDateTime(pathname) 传回档案建立时的日期、时间。  
    FileLen(pathname) 传回档案的长度,单位是Byte。  
    Filter(sourcearray, match[, include[, compare]])  搜寻字符串数组中的指定字符串,凡是数组元素中含有指定字符串,会将它们结合成新的字符串数组并传回。若是要传回不含指定字符串的数组元素,则 include 参数设为False。compare 参数则是设定搜寻时是否区分大小写,此时只要给TextCompare 常数或1 即可。  
    Fix(number) 去掉参数的小数部分并传回。  
    Format(expression[, style[, firstdayofweek[, firstweekofyear]]]) 将日期、时间和数值资料转为每个国家都可以接受的格式。  
    FormatCurrency(expression[,numdigitsafterdecimal [,includeleadingdigit]]) 将数值输出为金额型态。numdigitsafterdecimal 参数为小数字数,includeleadingdigit 参数为当整数为0 时是否补至整数字数。  
    FormatDateTime(date[,namedformat]) 传回格式化的日期或时间数据。  
    FormatNumber(expression[,numdigitsafterdecimal [,includeleadingdigit]]) 传回格式化的数值数据。Numdigitsafterdecimal 参数为小数字数,includeleadingdigit 参数为当整数为0 时是否补至整数字数。  
    FormatPercent(expression[,numdigitsafterdecimal [,includeleadingdigit]]) 传回转换为百分比格式的数值数据。numdigitsafterdecimal 参数为小数字数,includeleadingdigit 参数为当整数为0 时是否补至整数字数。  
    GetAttr(filename) 传回档案或目录的属性值。  
    Hex(number) 将数值参数转换为16 进制值。
    Hour(time) 传回时间的小时字段,型态是Integer。  
    Iif(expression, truepart, falsepart) 当表达式的传回值为True 时执行truepart 字段的程序,反之则执行falsepart 字段。  
    InStr([start, ]string1, string2) 搜寻string2 参数设定的字符出现在字符串的第几个字符,start 为由第几个字符开始寻找,string1 为欲搜寻的字符串,string2 为欲搜寻的字符。  
    Int(number) 传回小于或等于接收参数的最大整数值。  
    IsArray(varname) 判断一个变量是否为数组型态,若为数组则传回True,反之则为False。 
    IsDate(expression) 判断表达式内容是否为DateTime 型态,若是则传回True,反之则为False。  
    IsDbNull(expression) 判断表达式内容是否为Null,若是则传回True,反之则为False。  
    IsNumeric(expression) 判断表达式内容是否为数值型态,若是则传回True,反之则为False。  
    Join(sourcearray[, delimiter]) 将字符串数组合并唯一个字符串,delimiter 参数是设定在各个元素间加入新的字符串。  
    Lcase(string) 将字符串转换为小写字体。  
    Left(string, length) 由字符串左边开始取得length 参数设定长度的字符。  
    Len(string) 取得字符串的长度。  
    Log(number) 取得数值的自然对数。  
    Ltrim(string) 去掉字符串的左边空白部分。  
    Mid(string, start[, length]) 取出字符串中strat 参数设定的字符后length 长度的字符串,若length 参数没有设定,则取回start 以后全部的字符。  
    Minute(time) 取得时间内容的分部分,型态为Integer。  
    MkDir(path) 建立一个新的目录。  
    Month(date) 取得日期的月部分,型态为Integer。 
    MonthName(month) 依接收的月份数值取得该月份的完整写法。  
    Now() 取得目前的日期和时间。  
    Oct(number) 将数值参数转换为8 进制值。  
    Replace(expression, find, replace) 将字符串中find 参数指定的字符串转换为replace 参数指定的字符串。  
    Right(string,length) 由字符串右边开始取得length 参数设定长度的字符。  
    RmDir(path) 移除一个空的目录。  
    Rnd() 取得介于0 到1 之间的小数,如果每次都要取得不同的值,使用前需加上Randomize 叙述。  
    Rtrim(string) 去掉字符串的右边空白部分。  
    Second(time) 取得时间内容的秒部分,型态为Integer。  
    Sign(number) 取得数值内容是正数或负数,正数传回1,负数传回-1,0 传回0。  
    Sin(number) 取得一个角度的正弦值。  
    Space(number) 取得number 参数设定的空白字符串。 
    Split(expression[, delimiter]) 以delimiter 参数设定的条件字符

     

     

     

     

    Abs 函数:返回数的绝对值。  
    Array函数:返回含有数组的变体。 
    Asc 函数:返回字符串首字母的 ANSI 字符码。
    Atn 函数:返回数值的反正切。  
    CBool函数:返回已被转换为 Boolean 子类型的变体的表达式。  
    CByte函数:返回已被转换为字节子类型的变体的表达式。  
    CCur 函数:返回已被转换为货币子类型的变体的表达式。  
    CDate函数:返回已被转换为日期子类型的变体的表达式。  
    CDbl函数:返回已被转换为双精度子类型的变体的表达式。  
    Chr 函数:返回与指定的 ANSI 字符码相关的字符。  
    CInt 函数:返回已被转换为整形子类型的变体的表达式。  
    CLng 函数;返回已被转换为Long子类型的变体的表达式。  
    Cos 函数:返回角度的余弦。   C
    reateObject函数:创建并返回对“自动”对象的引用。
    CSng函数:返回已被转换为单精度子类型的变体的表达式。
    CStr函数:返回已被转换为字符串子类型的变体的表达式。
    Date函数:返回当前系统日期。
    DateAdd 函数:返回的日期已经加上了指定的时间间隔。
    DateDiff 函数:返回两个日期之间的间隔。
    DatePart 函数:返回给定日期的指定部分。
    DateSerial函数:返回指定年月日的日期子类型的变体。
    DateValue 函数:返回日期子类型的变体。
    Day 函数:返回日期,取值范围为 1 至 31。
    Eval 函数:计算表达式并返回结果。
    Exp 函数:返回 e (自然对数的底) 的多少次方。
    Filter函数:根据指定的筛选条件,返回含有字符串数组子集的、下限为 0 的数组。
    Fix 函数:返回数的整数部分。
    FormatCurrency 函数:返回的表达式为货币值格式,其货币符号采用系统控制面板中定义的。
    FormatDateTime 函数:返回的表达式为日期和时间格式。
    FormatNumber 函数:返回的表达式为数字格式。
    FormatPercent 函数:返回的表达式为百分数(乘以 100)格式,后面有 % 符号。
    GetObject 函数:返回从文件对“自动”对象的引用。
    GetRef 函数:返回对能够绑定到一事件的过程的引用。
    Hex 函数:返回一字符串,代表一个数的十六进制值。
    Hour函数:返回表示钟点的数字,取值范围为 0 至 23。
    InputBox函数:在对话框中显式一提示,等待用户输入文本或单击按钮,并返回文本框的内容。
    InStr函数:返回一个字符串在另一个字符串中首次出现的位置。
    InStrRev函数;返回一个字符串在另一个字符串中出现的位置,但是从字符串的尾部算起。

  • VBS启动QTP并自动运行测试脚本

    2008-01-10 16:11:05

    VBS启动QTP并自动运行:

    Set qtApp = CreateObject("QuickTest.Application"
    qtApp.Launch 
    qtApp.Visible 
    = True
    qtApp.Open 
    "C:\Test1"
    qtApp.Test.Run

  • wsh键值表

    2007-12-29 16:14:18

    wsh键值表
    键          参数
    退格键      {BACKSPACE}、{BS}或{BKSP}
    BREAK       {BREAK}
    CAPS LOCK   {CAPSLOCK}
    DEL或DELETE{DELETE}或{DEL}
    下箭头      {DOWN}
    END         {END}
    ENTER       {ENTER}或~
    ESC         {ESC}
    HOME        {HOME}
    INS或INSERT{INSERT}或{INS}
    左箭头      {LEFT}
    NUM LOCK    {NUMLOCK}
    PAGE DOWN   {PGDN}
    PAGE UP     {PGUP}
    PRINT SCREEN{PRTSC}
    右箭头      {RIGHT}
    SCROLL LOCK{SCROLLLOCK}
    TAB         {TAB}
    上箭头      {UP}
    F1、F2、F3...{F1}、{F2}、{F3}Q
211/212>
Open Toolbar