发布新日志

  • (转)通过Action参数来传递数据

    2009-03-14 18:03:50

    Action2的脚本如下:
    ' Input Parameters
    Message = Parameter("Msg")
    Msgbox Message
     
    ' Output Parameters
    If NOT Message = "" Then
           Parameter("ReturnMsg") = "The Message is " & Message
    Else
           Parameter("ReturnMsg") = "The Message is Empty!"
    End If
     
    ' RetuenValue
    ExitAction "HAHAHAHHAHA!!!!!"
    'ExitAction Parameter("ReturnMsg")
     
     
    3种调用Action的方法,Action1的脚本如下:
    ' 调用Action2,输入参数为 “ Hello!”,把输出参数值写到ReturnMessage1变量
    RunAction "Action2", oneIteration,"Hello!" ,ReturnMessage1
    Msgbox ReturnMessage1
     
    ' 调用Action2,输入参数为 “ Hello!”,通过Parameter方法读取输出参数值
    RunAction "Action2", oneIteration,"Hello!"
    ReturnMessage2= Parameter("Action2","ReturnMsg")
    Msgbox ReturnMessage2
     
    ' 如果被调用的Action使用了ExitAction来退出Action并返回ReturnValue,则可以使用下面的方式来获取Return Value的值
    ' 注意OutPut Parameters与Return Value的区别
    ReturnMessage3 = RunAction( "Action2", oneIteration ,"Hello!")
    Msgbox ReturnMessage3
     
    通过全局数据表(Global Data Table)来共享数据
     
     
    在Action1中设置参数值,Action1的脚本如下:
    ' 获取全局数据表
    Set Sheet = DataTable.GetSheet("Global")
    ' 查找参数列
    Set Parameter1 = Sheet.GetParameter("Column1")
    Set Parameter2 = Sheet.GetParameter("Column2")
    ' 设置参数值
    Parameter1.Value="Hello"
    Parameter2.Value="World!"
    ' 调用Action2,Action2将使用前面设置的参数值
    RunAction "Action2", oneIteration
     
    在Action2中读取参数值,Action2的脚本如下:
    ' 获取全局数据表
    Set Sheet = DataTable.GetSheet("Global")
    ' 读取参数值
    Set Parameter1 = Sheet.GetParameter("Column1")
    Set Parameter2 = Sheet.GetParameter("Column2")
    ' 使用参数值
    Msgbox Parameter1 &" " & Parameter2
     
    使用环境变量(Environment Variables)来共享数据
     
     
    在Action1中使用环境变量中定义的LoginUserName和LoginPassWord,Action1的脚本如下:
    ' 在Action1中使用环境变量中定义的LoginUserName和LoginPassWord
    UserName = Environment.Value("LoginUserName")
    UserPassWord = Environment.Value("LoginPassWord")
     
    SystemUtil.Run "C:\Program Files\Mercury Interactive\QuickTest Professional\samples\flight\app\flight4a.exe"
    Dialog("Login").Activate
    Dialog("Login").WinEdit("Agent Name:").Set UserName
    Dialog("Login").WinEdit("Password:").SetSecure UserPassWord
    Dialog("Login").WinButton("OK").Click
     
    ' 调用Action2,在Action2中也将使用到定义的环境变量
    RunAction "Action2", oneIteration
     
    在Action2中使用环境变量中定义的LoginUserName,Action2的脚本如下:
    ' 在Action2中使用环境变量中定义的LoginUserName
    UserName = Environment.Value("LoginUserName")
     
    Window("Flight Reservation").Activate
    Window("Flight Reservation").WinObject("Date of Flight:").Click 1,6
    Window("Flight Reservation").WinObject("Date of Flight:").Type "121212"
    Window("Flight Reservation").WinComboBox("Fly From:").Select "Denver"
    Window("Flight Reservation").WinComboBox("Fly To:").Select "Frankfurt"
    Window("Flight Reservation").WinButton("FLIGHT").Click
    Window("Flight Reservation").Dialog("Flights Table").WinList("From").Select "14243   DEN   12:57 PM   FRA   01:41 PM   SR     $110.00"
    Window("Flight Reservation").Dialog("Flights Table").WinButton("OK").Click
    Window("Flight Reservation").WinEdit("Name:").Set UserName
     
     
    通过Dictionary对象来在Action之间共享数据
    (1)添加注册表
    HKEY_CURRENT_USER\Software\Mercury Interactive\QuickTest Professional\MicTest\ReservedObjects\GlobalDictionary
     
    ProgID = "Scripting.Dictionary"
     
     
    (2)使用GlobalDictionary对象
    ' 使用GlobalDictionary前清空里面的数据
    If GlobalDictionary.Count > 0 Then
           GlobalDictionary.RemoveAll
    End If
    ' 存储一个数值
    DepartDate = "2008-3-31"
    GlobalDictionary.Add "DateCheck", DepartDate
     
    ' 可在当前Action使用GlobalDictionary中的数据,也可在另外一个Action中使用添加到GlobalDictionary的数据
    'Dim CompareDate
    'CompareDate=GlobalDictionary("DateCheck")
    'Msgbox CompareDate
     
     
    ' 可在当前Action使用GlobalDictionary中的数据,也可在另外一个Action中使用添加到GlobalDictionary的数据
    Dim CompareDate
    ' 读取GlobalDictionary中的DateCheck数据
    CompareDate=GlobalDictionary("DateCheck")
    Msgbox CompareDate
     
  • (转)在QTP中如何运用XML管理参数

    2009-03-05 10:48:51

    我们现阶段是运用XML文件,存放页面输入操作数据
    优点:树型结构,可读性较好;操作简便
    缺点:如数据庞大,不便维护;以文件形式管理数据,效率太低

    另外也可以运用EXCLE维护数据
    优点:操作简便
    缺点:可读性差;维护效率低

    或者连接数据库,以数据库形式管理(这点LR支持的比较好,提供了连接功能接口,操作简便,而我用的QTP8.2支持不大好),总的来说,以数据库形式管理参数数据,其优势是其他两种数据管理方式无法取代的
    优点:对于参数数据量很大的情况下,便于管理
    缺点:平时要维护数据库,增加工作量

    2)实现方法与规范:
    QTP的“Test settings”->"Environment"中,提供了环境变量设置的功能。我们可以运用此接口,在外部文件的形式存储与管理对象库和参数,其中我们把对象集中放在名为Object Repository的文件夹中,对象文件的后缀名均为TSR。参数文件均放在名为XML的文件夹中,参数文件的后缀名均为XML。

    实现步骤:a、设置环境变量:
                    “Test settings”->"Environment"
                    b、Variable type:User-defined
                    c、Click “New”
                    d、input “name”、“Value”
                    (such as->name:XMLPath_1)
                    e、save
                    f、QTP脚本中写语句读取环境变量:
                    ( Such as->XMLPath=Environment.Value("XMLPath_1") )
                    g、用VB写函数,用于检索XML中的关键字,提取参数值
                    (见如下代码),VB函数可以写在后缀名为VBS的文件中
                    h、在QTP中加载VB函数:
                      “Test settings”->"Resources"
                      在"Associated library files"中加载VBS函数文件
                      点击“Set as Default”

    注:1)这里的Value我们可以输入XML的存放地址,用于把文件地址传到QTP脚本中

  • (转)ByVal和ByRef的区别

    2009-03-02 10:03:33

    ByVal 传送参数内存的一个拷贝给被调用者。也就是说,栈中压入的直接就是所传的值。
    ByRef 传送参数内存的实际地址给被调用者。也就是说,栈中压入的是实际内容的地址。被调用者可以直接更改该地址中的内容。

    ByVal 可选的。表示该参数按值传递。
    ByRef 表示该参数按地址传递。 ByRef 是 Visual Basic 的缺省选项。

    ByVal是传递值 源数据不会被修改
    你可以把这个值当作自己的局部变量来使用
    ByRef是传递地址 , 源数据可能被修改
    你对这个变量的操作将对你传入的那个变量产生影响,就像指针的感觉

    实例:
    sub Add1(ByVal no as int32)
        no=no+100
    end sub
    sub Add2(ByRef no as int32)
        no=no+100
    end sub
    private sub button1_click(sender as object,e as eventargs)handles button1.click
        dim a as int32
        a=100
        Add1(a)
        msgbox (\"a的值为:\" & a)     '显示:a的值为100
        Add2(a)
        msgbox (\"a的值为:\" & a)     '显示:a的值为200,因为Add2中的参数no为ByRef,即
                                     '按地址传递,因此在Add2中对no进行修改后,将会导致
                                     '源参数a的值也被修改。
    End Sub

    ——————————————————————————————————————
    3、ByVal和ByRef
        ByVal传递的参数值,而ByRef传递的参数的地址。在这里,我们不用去区别传指针/传地址/传引用的不同,在VB里,它们根本就是一个东西的三种不同说法,即使VB的文档里也有地方在混用这些术语(但在C++里的确要区分指针和引用)
        初次接触上面的程序二SwapPtr的朋友,一定要搞清在里面的CopyMemory调用中,在什么地方要加ByVal,什么地方不加(不加ByVal就是使用VB缺省的ByRef)
        准确的理解传值和传地址(指针)的区别,是在VB里正确使用指针的基础。
        现在一个最简单的实验来看这个问题,如下面的程序三:
    【程序三】:'体会ByVal和ByRef
        Sub TestCopyMemory()
            Dim k As Long
            k = 5
    Note:   CopyMemory ByVal VarPtr(k), 40000, 4
            Debug.Print k
        End Sub

        上面标号Note处的语句的目的,是将k赋值为40000,等同于语句k=40000,你可以在"立即"窗口试验一下,会发现k的值的确成了40000。
        实际上上面这个语句,翻译成白话:
    -----------------------------------------------------------------
    就是从保存常数40000的临时变量处拷贝4个字节到变量k所在的内存中。
    -----------------------------------------------------------------
        现在我们来改变一个Note处的语句,若改成下面的语句:
    Note2:   CopyMemory ByVal VarPtr(k), ByVal 40000, 4
        这句话的意思就成了,从地址40000拷贝4个字节到变量k所在的内存中。由于地址40000所在的内存我们无权访问,操作系统会给我们一个Access Violation内存越权访问错误,告诉我们"试图读取位置0x00009c40处内存时出错,该内存不能为'Read'"。
        我们再改成如下的语句看看。
    Note3:   CopyMemory VarPtr(k), 40000, 4
        这句话的意思就成了,从保存常数40000的临时变量处拷贝4个字节到到保存变量k所在内存地址值的临时变量处。这不会出出内存越权访问错误,但k的值并没有变。
        我们可以把程序改改以更清楚的休现这种区别,如下面的程序四:
    【程序四】:'看看我们的东西被拷贝到哪儿去了
        Sub TestCopyMemory()
            Dim I As Long, k As Long
            k = 5
            I = VarPtr(k)
    NOTE4:  CopyMemory I, 40000, 4
            Debug.Print k
            Debug.Print I
            I = VarPtr(k)
    NOTE5:  CopyMemory ByVal I, 40000, 4
            Debug.Print k
        End Sub

    程序输出:
    5
    40000
    40000
        由于NOTE4处使用缺省的ByRef,传递的是i的地址(也就是指向i的指针),所以常量40000拷贝到了变量i里,因此i的值成了40000,而k的值却没有变化。但是,在NOTE4前有:i=VarPtr(k),本意是要把i本身做为一个指针来使用。这时,我们必须如NOTE5那样用ByVal来传递指针i,由于i是指向变量k的指针,所以最后常量40000被拷贝了变量k里。

    引用
    ByVal vs ByRef
    The difference between ByVal and ByRef is very simple once we recall the subject on pointers. These keywords are simply abbreviations of the full definition of the differences between the two.

    ByVal = By Value and ByRef = By Reference

    Now we can recall what I said in the previous chapter about C/C++ and pointers. Pointers act as a Reference to a memory address location. In VB however, this means that the reference is occurring in your statement directly at the location of the actual data, and where it is stored.

    Selecting a ByVal would thereby mean you are only working on a copy or replica of the data, and not the actual data segment it self.

    This has specific implications for how your statements can handle and alter the data in your variable. The ByRef use, would imply that a change performed by the statement of the value you pass, has an affect on the actual data, while the ByVal use would only alter the copy the statement has to work on.

    Simply described, if passed ByRef, a procedure can permanently alter the data stored in the variable. Since it also is faster to send a memory address location, rather than passing a copy of a data argument, it is the default value used by Visual Basic.

    ByVal和ByRef的区别
  • QTP 常用的函数

    2009-02-26 15:53:41

    1.GetCellData函数

      作用:获取单元格的值

      例: 

     rowCount = Browser("xxx ").Page("xxx ").Frame("xxx").WebTable("xxx").RowCount
    For counter = 1 To rowCount
      text = Browser("xxx").Page("xxx").Frame("xxx").WebTable("xxx").GetCellData(counter,1)
      If (text = "xxx") Then
        counter = counter - 1
        selectNO = "#" & counter
        Browser("xxx").Page("xxx").Frame("xxx").WebRadioGroup("xxx").Select selectNO
        Exit For
      End If
    Next

      2.把值插入datatable里

      例:

          datatable.setcurrentrow(i)
            datatable.value("name","Global")="name"
            datatable.value("passwd","Global")="passwd"

      3.用代码来启动浏览器

       Browser1 = "IE"
      StartURL = "www.51testing.com"
      IF Browser1 = "IE" THEN
         set IE = CreateObject("InternetExplorer.Application")
         IE.Visible = true
         IE.Navigate StartURL
      END IF

      4.ExecuteFile函数

      作用:ExecuteFile 可以直接执行vbs文件,而不需要将其导入resource中
            ExecuteFile FileName
      说明:where FileName is the absolute or relative path of your VBscrīpt file.

      例:ExecuteFile("F:\test.vbs")

      5.Strcomp函数

      作用:比较文本

      例:

      dim strtext1,strtext2,str ,str1,comp1
         strtext1 = "xxx"
         strtext2 = "xxx"
         str = VbWindow("xxx").VbWindow("xxx").VbLabe1("xxx").GetTOProperty("text")
         str1= VbWindow("xxx").VbWindow("xxx").VbLabel("xxx").GetTOProperty("text")
         comp1=strcomp(strtext1,str,0)
         If  comp=0 Then
              msgbox “这两个串相等”
         else
           msgbox str
         End If

      6.CaptureBitmap

      作用:捕获屏幕

      7. GetROProperty

      作用:取对象属性值

      例:

     VbWindow("xxx").VbWindow("xxx").VbWindow("xxx").ActiveX("xxx").GetROProperty("TextMatrix(1,0)") 

      8.

       ExitAction - 退出当前操作,无论其循环属性如何。
      ExitActionIteration - 退出操作的当前循环。
      ExitRun - 退出测试,无论其循环属性如何。
      ExitGlobalIteration - 退出当前全局循环。

      9.如何使用Excel对象处理数据?

       Dim xl
      打开excel文件
      Function OpenExcelFile(strFilePath)
      Set xl = CreateObject("Excel.Application")
      xl.Workbooks.Open strFilePath
      End Function
      获得指定单元格数据
      Function GetCellData(strSheet,rwIndex,colIndex)
      GetCellData = xl.WorkSheets(strSheet).Cells(rwIndex,colIndex)
      End Function
      填充单元格数据
      Function PutCellData(strSheet,rwIndex,colIndex,varData)
      xl.WorkSheets(strSheet).Cells(rwIndex,colIndex) = varData
      End Function
      保存并推出
      Function SaveAndQuit()
      xl.Activeworkbook.save
      xl.Quit
      Set xl = nothing
      End Function

      10.连接sql数据库

      例:

         Dim res,cmd,sql
         Set Res=createobject("adodb.recordset")
         Set Cmd=createobject("adodb.command")
         Cmd.activeconnection="Provider=SQLOLEDB.1;Password=111111;Persist Security Info=True;User ID=sa;Initial Catalog=xhq;Data Source=192.168.191.142"  '这句话是连接数据库的数据源,要做修改
        Cmd.CommandType = 1
        sql="selec t * from 表 where name=username"
        Cmd.CommandText = sql
        Set res = Cmd.Execute()
        Set res = nothing
        Set cmd.ActiveConnection = nothing
        Set Cmd= nothing

  • (转)QTP测试页面的连接是否可用

    2009-02-17 09:51:36

     

    set a= Browser(“Yahoo!”)
            set b= Browser(“Yahoo!”)。Page(“Yahoo!”)
            call CheckLinks(a,b)
            Function CheckLinks (BrowserObject,BrowserPage)
            CheckLinks=TRUE
            Dim s_URL,i_CreationTime
            Dim s_LinkOuterText,s_LinkInnerText,s_Linkhref
            s_URL=BrowserPage。GetROProperty(“url”)
            i_CreationTime=1
            i_LinkCount=BrowserPage。object.links。length - 1

            Dim i_Link

            For i_Link=0 to i_LinkCount
            If Trim(BrowserPage。object。links(i_Link)。target)="" Then
            BrowserPage.object.links(i_Link)。target=“_blank" ”‘ Set the link to open i a new window so that we dont have any change in current window
            End If

            BrowserPage。object.links(i_Link)。click
            On error resume next
            Browser(“CreationTime::=” & i_CreationTime)。sync
            Browser(“CreationTime:=” & i_CreationTime)。Page(“micClass:=Page”)。sync
            On error goto 0
            Dim s_LinkDetails

            IHTML = Browser(“CreationTime:=” & i_CreationTime)。Page(“micClass:=Page”)。object。Body。innerHTML
            ‘Check if page was not able to be displayed
            If (InStr(IHTML,“HTTP 404”) 〈〉 0) Or (InStr(IHTML,,“cannot be displayed”) 〈〉 0) Then
            s_LinkDetails=“Link Broken” + vbcrlf + “Link Details:”+vbcrlf
            s_LinkDetails=s_LinkDetails+“OuterText: ”+ s_LinkOuterText + vbcrlf
            s_LinkDetails=s_LinkDetails+“InnerText:”+ s_LinkInnerText + vbcrlf
            s_LinkDetails=s_LinkDetails+ “href:” + s_Linkhref+ vbcrlf
            s_LinkDetails=s_LinkDetails+ “Links Open in New Browse:” & bNewBrowser & vbcrlf
            Reporter。ReportEvent micWarning,“Check Link(“ & i_Link & ”) -> “& s_LinkOuterText ,s_LinkDetails
            CheckLinks=FALSE
            Else
            s_LinkDetails=“Link Working” + vbcrlf + “Link Details:”+vbcrlf
            s_LinkDetails=s_LinkDetails+“OuterText: ”+ s_LinkOuterText + vbcrlf
            s_LinkDetails=s_LinkDetails+“InnerText:”+ s_LinkInnerText+ vbcrlf
            s_LinkDetails=s_LinkDetails+ “href::” + s_Linkhref+ vbcrlf
            s_LinkDetails=s_LinkDetails+ “Links Open in New Browse: ” & bNewBrowser & vbcrlf
            Reporter.ReportEvent micPass,“Check Link(“ & i_Link & ”) -> ”& s_LinkOuterText ,s_LinkDetails
            End If

            Browser(“CreationTime:=1”)。close ‘Close the link open.
            Next
            End Function

  • (转)揭秘QTP的DeviceReplay对象

    2009-02-16 08:46:21

    不知道为什么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

      当我想对UI上的控件做一些特定的操作的时候,例如鼠标左右键点击,键盘输入字符串等,特别是在Object.Set和Object.Type没法使用的时候,DeviceReplay就显得非常有用。]L%}2FB1A |N(^Z ^138711 51Testing软件测试网1so3LU!lJ DMq~ P

    DeviceReplay使用的前提是:51Testing软件测试网6m4Ks?1`m

    51Testing软件测试网Po\HmB o

    1. 应用程序窗口被激活。

    ;Ee{J:zR138711 51Testing软件测试网 |0`5vE'`9[ J*R

    对窗口应用程序: 可以使用Window( "W" ).Activate micLeftBtn

    $[3R"\G$_^)CIA138711 51Testing软件测试网7j0F)R8C2g-f|

    对网页应用程序: 可以使用

    o(gs4X/q138711

    hwnd = Browser( "B" ).GetROProperty( "hwnd" )51Testing软件测试网)j*lB XoW/\

    Window( "hwnd:=" & hwnd ).Activate micLeftBtn51Testing软件测试网0Sf5?ho/A6rd;L v

    c-Ik1UP0x!H1387112. 目标控件为焦点。51Testing软件测试网3FOH"Xp!] G)A

    51Testing软件测试网u!@ w0k+rj;B7q/i

    WebEdit( "WE" ).object.focus 或者 WebEdit( "WE" ).FireEvent "onfocusin"

    h7smk7\ k8Ee2~%x138711

    W.G.c-g(\r[yk8W138711使用以下方法可以判断当前哪些键是否按下:(Microsoft.VisualBasic.Devices.Keyboard

    #H3ee!x_ s Rf138711

    Set Keyboard = DotNetFactory.CreateInstance( "Microsoft.VisualBasic.Devices.Keyboard", "Microsoft.VisualBasic" )51Testing软件测试网5Y"r'Z^.r7_ L

    Print CBool( Keyboard.AltKeyDown )

    d,r&AT8HJ138711

    Print CBool( Keyboard.CapsLock )

    R{.cL7PM(J-\s138711

    Print CBool( Keyboard.CtrlKeyDown )

    ;pGee%n(t,u138711

    Print CBool( Keyboard.NumLock )

    o3e@;G,h"y138711

    Print CBool( Keyboard.ScrollLock )51Testing软件测试网/e8p5tP p)]T$j(N%g]

    Print CBool( Keyboard.ShiftKeyDown )

    &v^4y)lb/~X138711

    +B+T+sf@$|138711注意:使用DotNetFactory的时候要注意数据类型的转换

    \,XX5iSm:Y138711

    Fy2w-f1GU,bi138711使用以下方法可以判断当前鼠标的位置:(System.Windows.Forms.Control)

    0t3kOsS&K(i138711

    Set ctlr = DotNetFactory.CreateInstance("System.Windows.Forms.Control")51Testing软件测试网D c"RWr0w;{^S

    For i = 1 To 10

    l ~ zi8TS:d138711

       Wait 251Testing软件测试网5Aa'F5e7e

       Print "1. X=" & ctlr.MousePosition.X & "; Y=" & ctlr.MousePosition.Y51Testing软件测试网l]*RQ"Urk9HT\d ?

    Next51Testing软件测试网.?/h$k(r'P$@0oieG?

     51Testing软件测试网 P|e*a-iB s

    DeviceReplay有以下常用方法:

    M$P|AFIa6e138711

    1。 object.SendString( str )

    v@r,S9YZ&[138711

    Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )51Testing软件测试网 d[P)MH8B

    SystemUtil.Run "notepad.exe", "", "", "open"51Testing软件测试网Bz7b5]^

    ' ** this line always identifies the notepad window.

    HLa(Y@6J138711

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

    'U:|6hfAm8[EagH138711

    deviceReplay.SendString( "DeviceReplay" )

    #N)|_2HC3ftP-u138711

    Set deviceReplay = Nothing

    ;O&Tw!r Le|0H138711

    2。 object.KeyDown( key )|object.KeyUp( key )

    h$p*h M ?JC138711

    Const VK_SHIFT = 42

    (bk"]v)y|@#qw138711

    Const VK_RETURN = 28

    'h.mN ot'u3y E:G|138711

    Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )

    k{JRO@#P(pR138711

    SystemUtil.Run "notepad.exe", "", "", "open"51Testing软件测试网 r'HC.~0uq ^

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

    y+K`BN)wxWS }u138711

    ' ** Typing uppercase51Testing软件测试网.D1@7N?+}&vw

    deviceReplay.KeyDown VK_SHIFT51Testing软件测试网/y4t&{!I+g9C0P

    deviceReplay.SendString( "devicereplay" )

    #k7w |%DNF#G138711

    deviceReplay.PressKey VK_RETURN

    -~%]'f1Nz&h9e138711

    deviceReplay.KeyUp VK_SHIFT51Testing软件测试网f$e }'`TH ~#v

    ' ** Typing in lower case51Testing软件测试网a9w.[Ju*`1k9b

    deviceReplay.SendString( "devicereplay" )

    :r?:`l O#F138711

    Set deviceReplay = Nothing

    UIx0{ l+BOr s138711

    !H}0pbZ6v;m8n1387113。 object.PressKey( key )51Testing软件测试网9]i5c(A|(E;i/iW

    Const VK_O = 24 : Const VK_F = 33

    #kFC Gl,oHM138711

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

    9X?&|.sV4oxq138711

    Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )51Testing软件测试网cWJsv

    SystemUtil.Run "notepad.exe", "", "", "open"51Testing软件测试网:pG*B UO

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

    |kV'QFQ*}T)t138711

    Wait 1

    B'Wl4yP:W"C138711

    ' ** Opening the menu Alt + F + O51Testing软件测试网X(V%Tq*SXG

    deviceReplay.PressKey VK_MENU51Testing软件测试网]kV!^#a.c5x CfpJ;`

    deviceReplay.PressKey VK_F

    :C0S9`\8]#b)x138711

    deviceReplay.PressKey VK_O

    9A NJ+C(e&F138711

    Wait 2

    0C%I D:j A+Gp:v138711

    ' ** Closing the menu

    Th-N;Txe%q138711

    deviceReplay.PressKey VK_ESCAPE51Testing软件测试网QK u%Fk,x+z k

    deviceReplay.SendString "Open menu was closed."

    ^4b3Qz-{P B138711

    Set deviceReplay = Nothing51Testing软件测试网ED/a6U8Dpz

    4. object.PressNKeys( key, N )

    R;n+]}$@7}138711


    2`;wI9yAAv |Y138711用于模拟连续多次按某个键。51Testing软件测试网Fl)~C,T]|Fh

    5. object.DragAndDrop( dragX, dragY, dropX, dropY, Button )51Testing软件测试网@'^8GqR_+yw3L

    LEFT_MOUSE_BUTTON = 051Testing软件测试网1H*i @x_

    MIDDLE_MOUSE_BUTTON = 1

    uu'G*AsC!HCT,y138711

    RIGHT_MOUSE_BUTTON = 251Testing软件测试网)gJ,@ |.sg7_5t$B

    等同于object.MouseDown( x, y, Button ), object.MouseDown( x, y ), object.MouseUp( x, y, Button )的组合

    tz#N[)o(y138711

    6. object.MouseClick( x, y, Button )51Testing软件测试网 Fv3l1Ewu!Bw c {Z

    7. object.MouseDblClick( x, y, Button )

    0o'Y%N3BdB"j138711

    8。 object.SetSynchronizationTimeout( object, nSyncTimeout, is_sec)

  • (转)WshShell 对象

    2009-02-02 11:12:16

    WshShell作为WSH对象的一部分,  它的主要任务如下:

    在本地运行程序 操纵注册表内容。 创建快捷方式 访问系统文件夹 操纵环境变量(如 WINDIR、PATH 或 PROMPT)

    1.运行CMD命令行命令

    set ōbshell=wscrīpt.createobject("wscrīpt.shell")

    obshell.run ("ipconfig"),,true

    如果要运行的命令中包含双引号,可使用&chr(34)&代替


    2.操纵注册表内容

    注册表的修改,读取,删除,创建

    Set wso = CreateObject("Wscrīpt.Shell") '声明

    wso.RegWrite "%Path%"               '创建子键

    wso.RegWrite "%Path%","%Value%"     '修改"默认"键值

    wso.RegWrite "%Path%",%Value%,%RegType%   '修改特定类型的键值

    '(字符串值 REG_SZ 可扩充字符串值 REG_EXPAND_SZ DWORD值 REG_DWORD 二进制值 REG_BINARY)

    Set WSHShell= Wscrīpt.CreateObject("Wscrīpt.Shell")

    WSHShell.RegRead (%Path%) '读取注册表子键或键值(一般用于判断某一事件是否执行)

    Set wso = CreateObject("Wscrīpt.Shell")

    wso.RegDelete "%Path%" '删除子键或键值

    '(根键缩写HKEY_CLASSES_ROOT HKCR HKEY_CURRENT_USER HKCU HKEY_LOCAL_MACHINE HKLM,其余无)

    Set wso = CreateObject("Wscrīpt.Shell")

    wso.RegWrite "HKLM\SOFTWARE\Microsft\Windows NT\#1"

    wso.RegWrite "HKLM\SOFTWARE\Microsft\Windows NT\#1","0"

    wso.RegWrite "HKLM\SOFTWARE\Microsft\Windows NT\#1\#2",0,REG_BINARY

    wso.RegDelete "HKLM\SOFTWARE\Microsft\Windows NT\#1"

    Wscrīpt.quit

    3.创建快捷方式
    Set a = CreateObject("Wscrīpt.Shell")

    Dim b
    Set b = a.CreateShortcut("C:\lin.lnk")
    b.TargetPath = "notepad.exe"
    b.WorkingDirectory = "C:\windows\system32"
    b.IconLocation = "notepad.exe,0"
    b.Save

     


    4.访问系统文件夹

    文件的复制,删除,创建,简单的写入

    Set fso = Wscrīpt.CreateObject("scrīpting.FileSystemObject") ‘声明

    Set f = fso.CreateTextFile("%PATH%") '创建文件,其中f可任意,包含缩略名

    f.WriteLine("VBS") '写文件内容,该命令功能太简单,目前看来只能用于TXT文件

    f.Close

    set c=fso.getfile("%path%") ’拷贝某文件

    c.copy("%PATH2%") '拷贝文件到指定地点

    fso.deletefile("%PATH%") '删除文件

    Wscrīpt.quit

    Set fso = Wscrīpt.CreateObject("scrīpting.FileSystemObject")

    Set f=fso.CreateTextFile("C:\Sample.txt")

    WriteLine("VBS")

    f.close

    set e=fso.getfile(C:\Sample.txt)

    e.copy("D:\Sample.txt")

    fso.deletefile(C:\Sample.txt)

    Wscrīpt.quit

    5.操纵环境变量(如 WINDIR、PATH 或 PROMPT)

    dim wsh
    Set wsh = Wscrīpt.CreateObject("Wscrīpt.Shell")
    wsh.Environment("system").Item("<变量名>")="<值>"
    或使用使用REG
    set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
    ::系统环境变量
    ::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
    ::用户环境变量
    ::HKEY_CURRENT_USER\Environment
    reg add "%regpath%" /v "<name>" /d "<data>"
    将上面的<>内容替成你需要定义的名称和值就可以了.

    6.向应用程序输出简单的连串指令

    dim program1 '声明变量program1

    program1= "%Path%" '应用程序路径

    set wshshell=createobject("wscrīpt.shell") '声明饮用函数

    set ōexec=wshshell.exec(program1) '运行程序

    wscrīpt.sleep 2000 '(该行命令未知作用.估计是设定延迟,请高手指点)

    wshshell.appactivate "%WindowsName%" '激活运用程序窗口

    wshshell.sendkeys "+{%KeyBoardName%}" '第一次输出键盘按键指令前要加+

    wshshell.sendkeys "555555" '在程序输入栏中输入运用该系列命令须首先确定程序可以实施连串的键盘操作,这在QQ登录中最适用,如下例。

    dim program1

    program1="D:\Program Files\Tencent\coralQQ.exe"

    set wshshell=CreateObject("wscrīpt.shell")

    set ōexec=wshshell.exec(program1)

    wscrīpt.sleep 2000

    wshshell.appactivate "QQ登录"

    wshshell.sendkeys "+{TAB}"

    wshshell.sendkeys "250481892"

    wscrīpt.sleep 2000

    wshshell.sendkeys "{TAB}"

    wshshell.sendkeys "****************"

  • (转)SQLSERVER和ORACLE数据库连接代码

    2009-01-20 09:57:56


    1、Oracle数据库

    要求在客户端机器上安装了oracle客户端并已配置完成

    代码:

    Set Conn = CreateObject("ADODB.CONNECTION")
    StrCon = "Provider=OraOLEDB.Oracle.1;Persist Security Info=True;" &_
      "User ID=xxx;Password=xxx;Data Source=xxxx;"
    Conn.Open StrCon

    SqlStr = "select number from table"
    Set Res = CreateObject("ADODB.RecordSet")
    Res.Open SqlStr,Conn,1,1

    2、sqlserver数据库

      Dim rs,conn,sqlstr,strcon

      strcon = "Provider=SQLOLEDB.1;User ID=sa;Password=xxxx;"&_
    "Data source=10.10.7.11;DATABASE=qcsiteadmin_db"

      Set conn = createobject("adodb.connection")
      conn.open strconn

      sqlstr="select * from td.SESSIONS_HISTORY where USER_NAME = '"_
         &LOGINUSER&"'"

      Set rs=createobject("adodb.recordset")
       rs.open sqlstr,conn,1,1

  • (转)vbs之createobject大全收藏

    2009-01-19 17:12:19

    ADO对象
    Connection
    Command
    RecordSet
    Record
    Stream


    Server.CreateObject("scrīpting.FileSystemObject")
    Server.CreateObject("scrīpting.Dictionary")   HashTable
    Server.CreateXObject("Word.Application")    //Server
    ActiveXObject("Word.Application")    //Client
    Server.CreateObject("Excel.Application")   //Server
    ActiveXObject("Excel.Application")    //Client
    CreateObject("PowerPoint.Application")
    Server.CreateObject("Microsoft.XMLHTTP")
    Server.CreateObject("Microsoft.XMLDOM")
    Server.CreateObject("MSXML2.XMLHTTP.4.0")
    Server.CreateObject("Wscrīpt.Shell")
    Server.CreateObject("wscrīpt.network") 
    Server.CreateObject("MSWC.AdRotator")
    CreateObject("Excel.Sheet")
    MS FrontPage: oFP = CreateObject("FrontPage.Application")
    MS Access: oAccess = CreateObject("Access.Application")
    MS Graph: oGraph = CreateObject("MSGraph.Application")


    CreateObject("PhotoShop.Application")

    CreateObject("SQLDMO.SQLServer")
    CreateObject("SQLDMO.Login")
    CreateObject("SQLDMO.Backup")
    CreateObject("SQLDMO.User")
    Server.CreateObject("SQLDMO.BackupDevice")
    Server.CreateObject("SQLDMO.Database")
    Server.CreateObject("SQLDMO.Restore")

    Server.CreateObject("MSMQ.MSMQQueueInfo")
    CreateObject("MSMQ.MSMQQuery")
    Server.CreateObject("ixsso.Query")
    Server.CreateObject("ixsso.Util")

    AccPac Advantage Corporate: 
    oAccPac=CreateObject("ACCPAC.xapiSession")

    AccPac Report Master for Windows: 
    oImpApp=CreateObject("Impromptu.Application.30")

    BarTender: 
    oBarTender = CreateObject("BarTender.Application")

    CrystalReports: 
    oCRApplication = createobject ("CrystalRuntime.Application") 
    This doesn't invoke an IDE actually.

    EUDORA: 
    oEud = CreateObject("Eudora.EuApplication.1")

    FaxMaker: 
    oFax = CREATEOBJECT("fmfaxapi.application")

    GroupWise:
    oGroupWise = CreateObject("NovellGroupWareSession")

    LotusNotes: 
    oNotes = CreateObject("Notes.NotesSession")
    oNotes = CreateObject("Notes.NotesUIWorkspace")
    oNotes = CreateObject("Lotus.Notessession") (Domino 5.0.3)

    MS Common Dialog: 
    oCommmonDialog = CreateObject("MSComDlg.CommonDialog") && !!! You can't directly create this object without a development licence, so for dynamically doing it on another machine, see below. -- PeterCrabtree

    MS Internet Explorer: 
    oIE = CreateObject("InternetExplorer.Application") 
    IEAutomationExample

    MS MapPoint:
    oMapPoint = CreateObject("MapPoint.Application")

    MSN Messenger:
    oMessenger = CREATEOBJECT("MSNMessenger.MessengerApp")

    MS NetMeeting:
    oNetMeeting=CREATEOBJECT("netmeeting.app.1")

    MS Outlook: 
    oOutlook = CreateObject("Outlook.Application")

    MS Outlook Express: None - It is not a COM server!

    MS PowerPoint: 
    oPP = CreateObject("PowerPoint.Application")

    MS Project: 
    oProj = CreateObject("msProject.Application")

    MS SourceSafe: 
    oVSS = CreateObject("SourceSafe.0")

    MS Word: 
    oWord = CreateObject("Word.Application")

    MS Visio: 
    oVisio = CreateObject("Visio.Application")


    MS VisualCPlusPlus: (VC++)
    oCpp = CreateObject("MSDev.Application")

    MS VisualFoxpro: 
    oVFP = CreateObject("VisualFoxPro.Application")

    MS WindowsscrīptingHost: 
    oWSH = CreateObject("Wscrīpt.Shell") 

    Novell GroupWise: 
    oGroupWise = CreateObject("NovellGroupWareSession")

    PCAnywhere (host): 
    oPCAHost = CreateObject("WinAWSvr.BeHostDataManager")

    PCAnywhere (remote): 
    oPCARem = CreateObject("WinAWSvr.RemoteDataManager")

    QuickBooks: 
    QBSessionManager = CreateObject("QBFC2.QBSessionManager")

    RationalRose: 
    oRose = CreateObject("Rose.Application")

    TAPIFax: 
    oTAPIFax = CreateObject('FaxServer.FaxServer')

    WindowsShell: 
    oWSH = CreateObject("Shell.Application")

    Windows Media Player: 

    oWMP = CREATEOBJECT("WMPlayer.OCX")
    oPlayList = oWmp.PlaylistCollection.GetAll()
    oWmp.currentPlaylist = oPlayList.Item(0) && Zero based array
    *!* Music starts!

    Windows Messenger: 
    oMessenger = CREATEOBJECT("Messenger.MessengerApp")

    WinFax: 
    oWinFax = CreateObject("WinFax.SDKSend") 

    WinPrint : 
    oWinPrint = CreateObject("WinPrint.WinPrintX")

    SQL-DMO object: 
    loSQL = CREATEOBJECT("SQLDMO.Application")

    Others:

    scrīpting Shell: 
    oShell = CreateObject("Wscrīpt.Shell")

    scrīpting Network Object: 
    oNet = CreateObject("Wscrīpt.Network")

    scrīpting Regular Expression Parser: 
    oReg = CreateObject("VBscrīpt.RegExp")

    SQL DMO SQL Server: 
    CreateObject("SQLDMO.SQLServer")

  • (转)RegExp对象正则表达式功能用法

    2009-01-15 10:10:46

    RegExp对象的用法:

    Function RegExpTest(patrn, strng)
    Dim regEx, Match, Matches ' 建立变量。
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = True ' 设置是否区分字符大小写。
    regEx.Global = True ' 设置全局可用性。
    Set Matches = regEx.Execute(strng) ' 执行搜索。
    For Each Match in Matches ' 遍历匹配集合。
    RetStr = RetStr & "Match found at position "
    RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
    RetStr = RetStr & Match.Value & "'." & vbCRLF
    Next
    RegExpTest = RetStr
    End Function

    MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))

      RegExp 对象的属性

      ◎ Global属性

      Global属性设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。
      语法
    object.Global [= True | False ]
      object 参数总是 RegExp 对象。如果搜索应用于整个字符串,Global 属性的值为 True,否则其值为 False。默认的设置为 True。

      Global 属性的用法(改变赋予 Global 属性的值并观察其效果):
    Function RegExpTest(patrn, strng)
    Dim regEx ' 建立变量。
    Set regEx = New RegExp ' 建立规范表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = True ' 设置是否区分字母的大小写。
    regEx.Global = True ' 设置全程性质。
    RegExpTest = regEx.Execute(strng) ' 执行搜索。
    End Function

    MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))

      ◎ IgnoreCase属性

      IgnoreCase属性设置或返回一个Boolean值,指明模式搜索是否区分大小写。
      语法
    object.IgnoreCase [= True | False ]
      object 参数总是一个 RegExp 对象。如果搜索是区分大小写的,则 IgnoreCase 属性为 False;否则为 True。缺省值为 True。

      IgnoreCase 属性的用法(改变赋予 IgnoreCase 属性的值以观察其效果):
    Function RegExpTest(patrn, strng)
    Dim regEx ' 建立变量。
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = True ' 设置是否区分大小写。
    RegExpTest = regEx.Execute(strng) ' 执行搜索。
    End Function

    MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))

      ◎ Pattern属性

      Pattern属性设置或返回被搜索的正则表达式模式。
      语法
    object.Pattern [= "searchstring"]
    Pattern 属性的语法包含以下几个部分:

      语法说明:
    object 必需的。总是一个 RegExp 对象变量。
    searchstring 可选的。被搜索的正则字符串表达式。它可能包含设置部分表格中的各种正则表达式字符。

      设置
      在书写正则表达式的模式时使用了特殊的字符和序列。下面描述了可以使用的字符和序列,并给出了实例。
     \ 将下一个字符标记为特殊字符或字面值。例如"n"与字符"n"匹配。"\n"与换行符匹配。序列"\\"与"\"匹配对面,"\("与"("匹配。
     ^ 匹配输入的开始位置。
     $ 匹配输入的结尾。
     * 匹配前一个字符零次或几次。例如,"zo*"可以匹配"z"、"zoo"。
     + 匹配前一个字符一次或多次。例如,"zo+"可以匹配"zoo",但不匹配"z"。
     ? 匹配前一个字符零次或一次。例如,"a?ve?"可以匹配"never"中的"ve"。
     . 匹配换行符以外的任何字符。
     (pattern) 与模式匹配并记住匹配。匹配的子字符串可以从作为结果的 Matches 集合中使用 Item [0]...[n]取得。如果要匹配括号字符(和 ),可使用"\(" 或 "\)"。
     x|y 匹配 x 或 y。例如 "z|food" 可匹配 "z" 或 "food"。"(z|f)ood" 匹配 "zoo" 或 "food"。
     {n} n 为非负的整数。匹配恰好n次。例如,"o{2}" 不能与 "Bob 中的 "o" 匹配,但是可以与"foooood"中的前两个o匹配。
     {n,} n 为非负的整数。匹配至少n次。例如,"o{2,}"不匹配"Bob"中的"o",但是匹配"foooood"中所有的o。"o{1,}"等价于"o+"。"o{0,}"等价于"o*"。
     {n,m} m 和 n 为非负的整数。匹配至少 n 次,至多 m 次。例如,"o{1,3}" 匹配 "fooooood"中前三个o。"o{0,1}"等价于"o?"。
     [xyz] 一个字符集。与括号中字符的其中之一匹配。例如,"[abc]" 匹配"plain"中的"a"。
     [^xyz] 一个否定的字符集。匹配不在此括号中的任何字符。例如,"[^abc]" 可以匹配"plain"中的"p".
     [a-z] 表示某个范围内的字符。与指定区间内的任何字符匹配。例如,"[a-z]"匹配"a"与"z"之间的任何一个小写字母字符。
     [^m-z] 否定的字符区间。与不在指定区间内的字符匹配。例如,"[m-z]"与不在"m"到"z"之间的任何字符匹配。
     \b 与单词的边界匹配,即单词与空格之间的位置。例如,"er\b" 与"never"中的"er"匹配,但是不匹配"verb"中的"er"。
     \B 与非单词边界匹配。"ea*r\B"与"never early"中的"ear"匹配。
     \d 与一个数字字符匹配。等价于[0-9]。
     \D 与非数字的字符匹配。等价于[^0-9]。
     \f 与分页符匹配。
     \n 与换行符字符匹配。
     \r 与回车字符匹配。
     \s 与任何白字符匹配,包括空格、制表符、分页符等。等价于"[ \f\n\r\t\v]"。
     \S 与任何非空白的字符匹配。等价于"[^ \f\n\r\t\v]"。
     \t 与制表符匹配。
     \v 与垂直制表符匹配。
     \w 与任何单词字符匹配,包括下划线。等价于"[A-Za-z0-9_]"。
     \W 与任何非单词字符匹配。等价于"[^A-Za-z0-9_]"。
     \num 匹配 num个,其中 num 为一个正整数。引用回到记住的匹配。例如,"(.)\1"匹配两个连续的相同的字符。
     \n 匹配 n,其中n 是一个八进制换码值。八进制换码值必须是 1, 2 或 3 个数字长。例如,"\11" 和 "\011" 都与一个制表符匹配。"\0011"等价于"\001" 与 "1"。八进制换码值不得超过 256。否则,只有前两个字符被视为表达式的一部分。允许在正则表达式中使用ASCII码。
     \xn 匹配n,其中n是一个十六进制的换码值。十六进制换码值必须恰好为两个数字长。例如,"\x41"匹配"A"。"\x041"等价于"\x04" 和 "1"。允许在正则表达式中使用 ASCII 码。

      Pattern 属性的用法:
    Function RegExpTest(patrn, strng)
    Dim regEx ' 建立变量。
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = True ' 设置是否区分大小写。
    RegExpTest = regEx.Execute(strng) ' 执行搜索。
    End Function

    MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))

      RegExp对象的方法

      ◎ Execute方法

      Execute方法对指定的字符串执行正则表达式搜索。
      语法
    object.Execute(string)
      语法部分描述
    object 必需的。总是一个 RegExp 对象的名称。
    string 必需的。要在其上执行正则表达式的文本字符串。

      说明
      正则表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。
      Execute 方法返回一个 Matches 集合,其中包含了在 string 中找到的每一个匹配的 Match 对象。如果未找到匹配,Execute 将返回空的 Matches 集合。

      Execute 方法的用法:
    Function RegExpTest(patrn, strng)
    Dim regEx ' 建立变量。
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = False ' 设置区分大小写。
    regEx.Global = True ' 搜索全部匹配。
    RegExpTest = regEx.Execute(strng) ' 执行搜索。
    End Function

    MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))

      ◎ Replace方法

      Replace方法替换在正则表达式查找中找到的文本。
      语法
    object.Replace(string1, string2)
      语法部分描述
    object 必需的。总是一个 RegExp 对象的名称。
    string1 必需的。string1 是将要进行文本替换的字符串。
    string2 必需的。 string2 是替换文本字符串。

      说明
      被替换的文本的实际模式是通过 RegExp 对象的 Pattern 属性设置的。
      Replace 方法返回 string1 的副本,其中的 RegExp.Pattern 文本已经被替换为 string2。如果没有找到匹配的文本,将返回原来的 string1 的副本。

      eplace 方法的用法:
    Function ReplaceTest(patrn, replStr)
    Dim regEx, str1 ' 建立变量。
    str1 = "The quick brown fox jumped over the lazy dog."
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = True ' 设置是否区分大小写。
    ReplaceTest = regEx.Replace(str1, replStr) ' 作替换。
    End Function

    MsgBox(ReplaceTest("fox", "cat"))
    ' 将 'fox' 替换为 'cat'。

    ;另外,Replace 方法在模式中替换 sube­xpressions 。 下面对以前示例中函数的调用,替换了原字符串中的所有字对:
    MsgBox(ReplaceText("(\S+)(\s+)(\S+)", "$3$2$1")) ' Swap pairs of words.

      ◎ Test方法

      Test方法对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。
      语法
    object.Test(string)
      语法部分描述
    object 必需的。总是一个 RegExp 对象的名称。
    string 必需的。要执行正则表达式搜索的文本字符串。

    说明
      正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的。RegExp.Global属性对Test方法没有影响。
      如果找到了匹配的模式,Test方法返回True;否则返回False。

      Test 方法的用法:
    Function RegExpTest(patrn, strng)
    Dim regEx, retVal ' 建立变量。
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = False ' 设置是否区分大小写。
    retVal = regEx.Test(strng) ' 执行搜索测试。
    If retVal Then
    RegExpTest = "找到一个或多个匹配。"
    Else
    RegExpTest = "未找到匹配。"
    End If
    End Function

    MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))

    文章转载自【迷失路上│Lost63's Blog】http://www.lost63.com/article.asp?id=369

  • (转)QTP使用技巧

    2009-01-12 15:33:56

    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

     

     

    20 .如何一一获得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

  • (转)GlobalSheet与LocalSheet的执行次序组合

    2009-01-12 09:40:21

    论坛上有人问到这个问题,顺便整理一下。File>Test Settings中Run标签控制GlobalSheet的执行,每个Action的Call Properties控制对应LocalSheet的执行。很多人碰到的问题都是忽略了在读取测试数据时,实际上是有这两个控制参数的。两者的组合如下:

    假设Globalsheet和LocalSheet的数据如下:

    GlobalSheet有3行数据:1,2,3

    LocalSheet有3行数据 :a,b,c

    1.Global Setting = run on all rows

      Local Setting = run on all rows

      运行:1a,1b,1c,2a,2b,2c,3a,3b,3c

    2.Global Setting = run on all rows

      Local Setting = run one iteration only

      运行:1a,2b,3c

    3.Global Setting = run on all rows

      Local Setting = run from row 1 to 2

      运行:1a,1b,2a,2b,3a,3b

    4.Global Setting = run one iteration only

      Local Setting = run on all rows

      运行:1a,1b,1c

    5.Global Setting = run one iteration only

      Local Setting = run one iteration only

      运行:1a

    6.Global Setting = run one iteration only

      Local Setting = run from row 1 to 2

      运行:1a,1b

    就不再继续列了,其他的情况也能推断出来。

  • (转)QTP调用WindowsAPI实例集

    2009-01-02 15:44:43

    例1:运行一个 可执行文件 文件
    Extern.Declare micLong, "WinExec", "kernel32.dll", "WinExec", micString,micLong
    Extern.WinExec "d:\1.exe ", 1

    例2:Beep
    Extern.Declare micLong, "Beep", "kernel32.dll", "Beep", micLong  
    Extern.Beep 500
    '它让我的机器在办公室里狂响不止!(不停的响暂不知如何中止,最好在虚拟机中试)

    例3:QTP运行后锁键盘和鼠标。
    Extern.Declare micLong, "BlockInput", "user32.dll", "BlockInput", micLong  
    ' Use the following statement to lock keyboard and mouse input at the
    Extern.BlockInput 1 ' beginning of the test:
    wait(5)
    ' Use the following statement to unlock keyboard and mouse input at the
    Extern.BlockInput 0 ' end of the test:

    以下示例使用 Extern.Declare 和 Extern.<已声明的方法> 方法更改记事本窗口的标题。

    '声明 FindWindow 方法

    Extern.Declare micHwnd, "FindWindow", "user32.dll", "FindWindowA", micString, micString

    '声明 SetWindowText 方法

    Extern.Declare micLong, "SetWindowText", "user32.dll", "SetWindowTextA", micHwnd, micString

    '获取记事本窗口的 HWND

    hwnd = Extern.FindWindow("Notepad", vbNullString)

    if hwnd = 0 then

    MsgBox "找不到记事本窗口"

    end if

    '更改记事本窗口的标题

    res = Extern.SetWindowText(hwnd, "hukai")

    以下示例使用 GetPrivateProfileString 从外部 INI 文件中检索信息,并将该信息用于测试。注意,如果使用 micByRef 标志,则表示为输出参数。

    Extern.Declare micInteger,"GetPrivateProfileStringA", "kernel32.dll","GetPrivateProfileStringA", micString, micString, micString, micString+micByRef, micInteger, micString

    Dim key, i, key2

    key = String(32, "-")

    i = Extern.GetPrivateProfileStringA("WREnv","addons","xxx", key, 32, "wrun.ini")

    key2 = Left(key,i)

    msgbox key & ";" & key2 & ";" & CStr(i)

    以下示例检查光标何时显示为沙漏。

    extern.Declare micLong,"GetForegroundWindow","user32.dll","GetForegroundWindow"

    extern.Declare micLong,"AttachThreadInput","user32.dll","AttachThreadInput",micLong,

    micLong,micLong

    extern.Declare micLong,"GetWindowThreadProcessId","user32.dll",

    "GetWindowThreadProcessId",micLong,micLong

    extern.Declare micLong,"GetCurrentThreadId","kernel32.dll","GetCurrentThreadId"

    extern.Declare micLong,"GetCursor","user32.dll","GetCursor"

    function get_cursor()

    hwnd = extern.GetForegroundWindow()

    pid = extern.GetWindowThreadProcessId(hWnd, NULL)

    thread_id=extern.GetCurrentThreadId()

    extern.AttachThreadInput pid,thread_id,True

    get_cursor=extern.GetCursor()

    extern.AttachThreadInput pid,thread_id,False

    end function

    Msgbox get_cursor()

    FindWindow函数用于查找窗体  
    函数原型
    HWND FindWindow(
    LPCTSTR lpClassName, // pointer to class name
    LPCTSTR lpWindowName // pointer to window name
    );
    lpWindowName是要查找窗体的标题,即这里的“无标题 - 记事本”。
    如果找到窗体,函数返回该窗体的句柄;如果找不到,函数返回空值或者零 。

    句柄和窗口标题,若只知其中之一,""要用vbNullString表示

  • (转)数据驱动

    2008-12-31 10:11:13

    所谓数据驱动就是用一个数据文件把测试脚本驱动起来,来达到更接近用户化更智能的测试.其目的是把测试人员从维护复杂的脚本程序中解放出来,只需维护好数据文件即可,减少了很多修改脚本的麻烦.下面讲一下通过四种途径来达到数据驱动.

    1.datatable

            QTP本身程序就给我们提供了这么一个数据表,我们可以把测试数据或测试用例填入这个数据表中.

    如:设计用例

       username  passwd

    case1  mercury mercury

    case2 xxxxxxx xxxxxx

    录制脚本

    For i=1 to Datatable.GetRowCount
    Dialog("Login").WinEdit("Agent Name:").Set DataTable("username", dtGlobalSheet)
    Dialog("Login").WinEdit("Password:").Set DataTable("passwd", dtGlobalSheet)
    Dialog("Login").WinButton("OK").Click
    datatable.GlobalSheet.SetNextRow
    Next

            本例是验证一个登录系统,通过DataTable不同的用例设计,驱动起这段脚本,达到测试的效果.当然上面的例子中还少一个很重要的步骤,那就是结果比较.如果不能进行结果比较的自动化测试不能够称为自动化测试.
            当然我们这里主要讲的是数据驱动,所以不在对上面的例子进行补充.

    2.文本文件

            我们可以把文本文件当成数据文件,通过对文本文件的读写操作,来实现数据驱动.

    例:文本文件内的内容

      mercury,mercuy

    读文件的代码

    Function writeorderno(orderno)
    Dim fso, myfile,username,passwd
    Set fso=CreateObject("scrīpting.FileSystemObject")
    Set myfile=fso.openTextFile("C:\testing.txt",1,false)
    tmp=split(myfile.readline,",")
    username=tmp(0)
    passwd=tmp(1)
    myfile.close
    End Function

    写文本文件的代码

    Function writeorderno(orderno)
    Dim fso, myfile
    Set fso=CreateObject("scrīpting.FileSystemObject")
    Set myfile=fso.openTextFile("C:\result1.txt",8,false)
    myfile.writeline orderno
    myfile.close
    End Function

    3.EXCEL文件

            我们可以把EXCEL文件当成数据文件,通过对EXCEL文件的读写操作,来实现数据驱动.

            可以把EXCEL文件当作对象的方式来完成写的操作

    Dim Excel,ExcelSheet
    Set Excel=CreateObject("Excel.Application")
    Set ExcelSheet=CreateObject("Excel.Sheet")
    ExcelSheet.Application.visible=true
    ExcelSheet.ActiveSheet.Cells(1,1).value=1
    ExcelSheet.ActiveSheet.Cells(1,2).value=2
    ExcelSheet.ActiveSheet.Cells(1,3).value=3
    Excel.Save "C:\test.xls"
    Set ExcelSheet=Nothing

            用ADO的方式连接EXCEL文件来做读的操作


    Dim conn,input,filename
    filename="D:\公基本情况(tb_gsgk)-标准格式.xls" '
    Set conn= createobject("ADODB.Connection")
    conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source="&filename&";Extended Properties='Excel 8.0;hdr=yes'"
    Set input= createobject("ADODB.Recordset")
    input.Open "select * from [公基本情况-标准格式$] " ,conn,2,2
    input.close
    Set input=nothing

    4.数据库

            可以利用设计数据表,把测试数据和测试用例放在数据表里,用ADO或者其他任何可以访问连接数据库的方式连接数据库,来实现数据驱动

       Dim res,cmd,sql
    Set Res=createobject("adodb.recordset")
    Set Cmd=createobject("adodb.command")
    Cmd.activeconnection="Provider=SQLOLEDB.1;Password=111111;Persist Security Info=True;User ID=sa;Initial Catalog=xhq;Data Source=192.168.191.142"  '这句话是连接数据库的数据源,要做修改
    Cmd.CommandType = 1
    sql="selec t * from 表 where name=username"
    Cmd.CommandText = sql
    Set res = Cmd.Execute()
    Set res = nothing
    Set cmd.ActiveConnection = nothing
    Set Cmd= nothing

    以上四种方法都可以帮助我们实现数据驱动,应该说数据驱动在自动化测试中运用的比较的广泛,才有必要拿出来探讨一下.

  • (转)录制模式的选择

    2008-12-30 21:02:49

    QTP中有三种录制模式:正常录制、模拟录制、低级录制。

    正常录制模式是QTP默认的录制模式,这种录制模式是QTP最突出的特点,是直接对对象的操作,录制完之后,不管再次打开的对象位置在哪,它都能执行到。

    模拟录制模式录制的是鼠标和键盘的精确操作,对于正常录制模式不能录制到的动作,可以使用模拟录制模式来弥补。比如说录制一个鼠标拖动的动作,正常录制模式录不下来,这时就可以使用模拟录制模式。

    低级录制模式是用来录制QTP不能识别的环境或对象。它录制了鼠标和键盘的所有操作,对对象的位置要求非常严格,对象的坐标有一点改变就有可以录制失败。

    只有在正常模式不能录制自己想要的操作时才可以使用模拟录制和低级录制,模拟录制和低级录制比正常录制需要占用更多的硬盘资源。先使用正常录制模式录制脚本,碰到正常模式不能录制到的脚本时再切换到模拟录制或低级录制来录制这些步骤,之后再切换回来。

    模拟录制模式分为两种:一种是相对于指定窗口录制;另一种是相对于屏幕录制。

    选择相对于指定窗口录制,就会只录制鼠标键盘的指定窗口内的所有动作,在窗口外的动作不会录制。

    相对于屏幕录制就可以录制在整个屏幕内所做的所有动作,包括点击win任务栏上的Quicktest图标,但在QTP窗口内所做的所有操作不会进行录制。

  • (转)使用QTP的Debug功能

    2008-12-30 20:31:00

    一、Step Into、Step Out、Step Over     
    在运行脚本时,可以使用Step Into、Step Out、Step Over等单步执行命令。    
    (通过Viw>toolbars>Debug可以显示Debug菜单。)
    1.Step Into     执行Step Into命令有三种方式:菜单Debug>Step Into、点击Step Into按钮、按F11。通过Step Into命令,执行当前脚本步骤。如果当前脚本是一个调用Function的语句,则Function脚本会在QTP窗口中打开,并且当前步骤指向Function的第1行代码。
    2.Step Out      执行Step Out命令有三种方式:菜单Debug>step Out、点击Step Out按钮、按SHIFT+F11。只在当用户使用了Step Into命令执行了调用Function语句,打开了Function后,才需要使用Step Out命令。Step Out自动运行到Function结束,然后返回到调用语句,并暂停运行脚本。

    3.Step Over      执行Step Over命令有三种方式:菜单Debug>Step Over、点击Setp Over按钮、按F10。Step Over只能运行当前代码行,当运行到调用Function语句时,Function被自动完整执行,QTP不打开Function的脚本。

    二、Debug Viewer     使用Debug VieWer面板,可以查看、设置、修改Object对象或变量的值。当脚本运行到断点时可以通过Degug VieWer面板查看、设置、修改Object对象或变量的值;或当脚本运行失败时,在Debug弹出窗口中选择“Debug”选项后,也可以通过Degug VieWer面板查看、设置、修改Object对象或变量的值。     
    通过 View>Debug viewer或点击Debug Viewer按钮,可以打开Debug Viewer面板。 Debug viewer面板可以显示变量或对象Object的值。它有3个页签:Watch、Variables以及Command。
    1.Watch     通过“Add to Watch”方法将Object或变量加入到Watch页后,就可以查看到Object或变量的当前值。在脚本逐步执行的过程中,如果值发生了改变,QTP会自动进行更新。在脚本运行到断点暂停时你还可以手工对Watch页面的值进行更新。向Watch页中添加表达式的方法有以下几种:     (1)在脚本中选中表达式,然后选择菜单Debug>Add to Watch。     (2)在脚本中选中表达式,然后按Ctrl+T。     (3)在脚本中选中表达式,然后选择右键菜单Add to Watch。     (4)在Watch页,手工粘贴或输入Object或变量名到“Name”列,然后点击回车,在“Value”列就会显示数值。     Add to Watch既可以在脚本运行前使用,也可以在脚本运行时使用。在脚本运行时添加时,可以马上查看到它的当前数值。
    2.Variable     当脚本运行停止或暂停时在Variable页,QTP自动显示所有变量的当前值。脚本在运行过程中,将变量及其值显示在Variable列表中,如果在后续的脚本中变量值发生了改变,则列表中的值也会相应改变。在脚本运行到断点暂停时,你还可以手工修改变量值。
    3.Command 在Command页,用户可以输入并执行脚本命令。此功能帮助用户设置或修改变量值或Object值,当脚本继续运行时,QTP使用修改过的值

  • (转)QuickTestPro小结

    2008-12-29 15:45:06

    1. QTP 识别对象原理

    QTP对每个控件类都定义了一些强制属性和辅助属性。当qtp对对象进行识别的时候,首先qtp会取出控件的所有强制属性,如果这些强制属性能够唯一标识这个控件则选强制属性来标识控件,如不能唯一标识控件,qtp则逐一取出控件类的辅助属性直到能唯一标识控件为止。

    如果使用强制属性和辅助属性还不能唯一标识控件。 则有以下两种可能:

    QTP对控件类的识别使用了智能识别(Smart Identification),qtp会忽略之前对强制属性与辅助属性的识别,这时qtp会使用smart identification 中的 basic filter properties和optional filter properties来对对象进行识别. basic filter properties就是一些控件的基础属性,例如button的Name,这个属性变了button也就变成另外一个button了。

    如果对控件类的识别没有使用Smart Identification,系统会使用Ordinal Identifier来对控件进行识别。

    2. QTP的测试流程。大多自动化测试工具都是使用录制回放这种方式:

    录制:QTP录制方式有三种,标准录制,模拟录制与低级录制。

    标准录制一般就是最常用的,录制对标准控件的一些操作,如对button的click,winEdit的Set value等等。

    模拟录制,可以录制鼠标的轨迹,主要用与绘图此类软件的录制。

    低级录制,与标准录制不同,不是Object.Operation value 而是记录屏幕坐标点上的操作。 稳定性较差。

    录制的时候,QTP会将用户的操作以VBscrīpt的形式保存在Expert View里头,录制的时候还会判断控件是否存在对象库里面,如果没有则创建对象。对象库里面的对象称为 Test Object 与程序UI上的控件对象Run Time Object 相对应。

    和TO、RO相关的几个函数有:

    GetTOProperty():取得仓库对象的某个属性的值
    GetTOProperties():取得仓库对象的所有属性的值 //返回一个对象类型,属性集为对象标识属性集
    SetTOProperty():设置仓库对象的某个属性的值
    GetROProperty():取得实际对象的某个属性的值

    录制完成需要对代码进行修改,增加代码的稳定性与可移植性。

    1. Add Comments. 代码中加必要的解释能增加代码的可读性,利于回归测试中代码的维护。

    2. 增加控制流语句。如程序的登陆,正常流程是输入验证信息,点击登陆按钮进入主界面。若用户已经登陆则系统就应该弹出一个确认框问用户是否需要删除原来的session。 这是录制的教本里面我们就应该加一个判断, 判断是否这个弹出框存在。

    3. 参数化。 QTP 参数化有一下几种方式:1)action parameter. Keyword View -> 右键ActionName ->Action Properties, Parameter tab. 可以配置action的传入参数与传出参数,参数的使用为: strInput = Parameter("input"), input为action的传入参数。 Parameter("output") = strOutput, output为action的输出参数。 2)Environment, 在脚本中使用strTemp = Environment("environmentVariable"). 3)datatable, 使用DataTable.SetCurrentRow(RowVale)  strTemp = DataTable.RowValue(Parameter, SheetID).

    4. CheckPoint.

    5. 同步点. WaitProperty(Property, value, Timeout). Object.exist(Timeout). Wait Time.

    6. QTP错误处理机制:

    QTP 有三种错误处理机制:

    1, 全局错误响应: Test setting中run设置

    全局错误响应是qtp的系统缺省错误处理,当没有使用其他错误处理方式时,系统会自动调用这里指定的方式进行错误处理。

    在整个脚本有效。 若是出错在Function Library,则错误号只存在library,不会传到Action中。

    2, VBscrīpt on Error错误处理: On Error Resume Next

    VBscrīpt的错误处理方式,三种相关方式为:

    a)On Error Resume Next: 一旦这个语句已经被处理,脚本将继续后面的程序,不理会已经出现的错误。

    b)On Error GoTo 0: 使用On Error GoTo 0语句恢复缺省的错误处理行为, 在运行这个语句后, 发生的运行期错误将导致缺省错误处理,在qtp中,缺省的出错处理就是全局错误响应。

    c)Err对象: Err对象有三个属性  Number, Source, Descrīption. Err对象在运行时错误发生的时候赋予新的值,原来的值将被丢弃。 Err对象是全局的, 不受函数调用的影响。 Err对象可以使用clear方法清空。 任何时候使用On Error Resume Next或者On Error GoTo 0都会清空Err对象。

    只对语句所在的函数或Action中该语句之后的代码生效,对于子函数,调用Action均无效。若On Error 语句存在Action中而出错在Function Library则系统会调用全局错误响应处理。若是Action中函数调用,则会返回到使用On Error 语句的环境中。

    3, 错误恢复场景: Recovery Scenario.

    触发条件有:

    a) Pop-up Window

    b) Object state

    c) Test run error.

    d) Application Crash.

    错误恢复有以下几种方式:

    a) Keyboard or mouse operation

    b) Close Application process

    c) Function Call

    d) Restart Microsoft Windows

    7. 关于虚拟对象的使用:

    虚拟对象管理器中显示的虚拟对象集合存储在您的计算机中,而不是随包含虚拟对象步骤的测试或组件存储。这意味着如果您在测试或组件步骤中使用虚拟对象,则仅当在包含正确的虚拟对象定义的计算机中运行时,该对象在运行会话过程中才能被识别。要将您的虚拟对象集合定义复制到另一个计算机,请将您的 <QuickTest 安装文件夹>\dat\VoTemplate 文件夹的内容(或该文件夹中的单个 .vot 集合文件)复制到目标计算机上的相同文件夹中

     <QuickTest 安装文件夹>\dat\VoTemplate 文件夹只有在已经定义虚拟对象的情况下才会出项

    8. 使用RegisterUserFunc注册用户定义的测试对象方法

    RegisterUserFunc TOClass, MethodName, FunctionName

    如果输入已经和指定的对象类关联的方法的名称,则用户定义的函数将覆盖现有方法。如果输入新名称,将添加到对象支持的方法列表中。

    Function MySet (obj, x)

    dim y

    y = obj.GetROProperty("value")

    Reporter.ReportEvent micDone, "previous value", y

    MySet=obj.Set(x)

    End Function

    RegisterUserFunc "WebEdit", "Set", "MySet"

    Browser("MercuryTours").Page("FindFlights").WebEdit("Country").Set "Canada"

    使用UnRegisterUserFunc TOClass, MethodName 可以取消用户注册方法

  • (转)QuickTestPro处理带有IFRAME的问题(续)

    2008-12-29 13:59:41

    今天一上blog就看到有人转我的文章!发了这篇文章很久了,但是一直都没有人问我另外一个问题,就是我解决这个问题所用到的另外一套代码是什么,很遗憾,所以今天看到其他人转这篇文章的时候,我把另外一套代码也贴出来,共享给大家!

      1.首先建立HTML文件,具体页面文件是什么样子请看《QuickTestPro处理带有IFRAME的问题》一文

       2.利用vb,建立vb工程文件,代码如下(工程需要引入MSHtml,在CPE课程中QTP自动化测试工具实现原理一章我介绍过这个对象,还有加入另外一个activex 空间SHDocVwCtl)

       Dim webdoc As HTMLDocument

        Private Sub cmdfindlink_Click()

        Dim ElementCollection As IHTMLElementCollection
        Dim x
        Dim kx As HTMLDocument
        Dim xAcollection As IHTMLElementCollection
        '
        '提取超链接
        ''定义元素集
        Dim Acollection As IHTMLElementCollection
       
       
       
        Set webdoc = wbBrowser.Document
        Set ElementCollection = webdoc.All
       
       
        ''设置元素集为所有的Anchor元素,用tags方法引用元素
        Set Acollection = webdoc.All.tags("a")
        ''把Anchor元素转换为相应的字符串表示,用items方法引用元素
        For i = 0 To Acollection.length - 1
            lstUrl.AddItem Acollection.Item(i).toString
        Next
        'length属性返回元素集中元素的个数
       
        For i = 0 To webdoc.frames.length - 1
          Set x = webdoc.frames.Item(i)
          Set kx = x.Document
             
          Set xAcollection = kx.All.tags("a")
         
            For j = 0 To xAcollection.length - 1
                lstUrl.AddItem xAcollection.Item(j).toString
            Next
       
       
        Set xAcollection = Nothing
         

    Next


    End Sub

    Private Sub cmdOpenURL_Click(Index As Integer)
     wbBrowser.Navigate "C:\Documents and Settings\Administrator\桌面\针对某些人的问题\test.html"
    End Sub

    实现代码如上。

  • (转)QuickTestPro处理带有IFRAME的问题

    2008-12-29 13:58:27

    “我的web页最下面一块是引入iframe的版权页面.导致我动态读取不到iframe外的其它链接。
    我的动态读取语句如下:
    set ōDesc = Descrīption.Create()
    oDesc("Class Name").value="Link"
    set ōbjColl = Browser("供应商").Page("供应商").ChildObjects(oDesc)
    NumberOfLists =ObjectColl.Count()
    -----页面上本来有十几个link的,但因为页面下面有iframe的原因,跟踪以上语句发现读取的是iframe里的link,始终读取不到iframe外的link , 请问如何解决?

    这道问题核心是取得所有的页面链接然后进行处理,但是由于其中包含了iframe导致利用集合无法得到页面中的所有链接(link)对象。为了解决这个问题,我自己模拟了一个环境,写了带有iframe的页面,然后利用qtp进行处理。

    html代码如下:

    1.带有iframe的html代码

    <html>
    <body>
    <p>这是一个测试</p>


    <p>
    <a href="com">com</a>
    </p>

    <p>
    <a href="nethttp://edu.51testing.net">net</a>
    </p>

    <iframe. src="包含的页面路径\url.html" width=100% name=comment frameborder=0 3onload="document.all['comment'].style.height=comment.document.body.scrollHeight"></iframe>

    </body>
    </html>

    2.iframe包含的页面文件Html代码 -  url.html

    <html>
    <body>

    <p>
    <a href="sohuhttp://www.sohu.com">sohu</a>
    </p>

    <p>
    <a href="hao123http://www.hao123.com">hao123</a>
    </p>

    </body>
    </html>

    qtp代码如下:枚举所有的页面link

    Dim objPage
    Dim objTag
    Dim intTotalLink
    Dim intCtr
    Dim strLink
    Dim strHref

    Dim oDesc
    Dim NumberOfiframe
    '枚举网页中除了带有iframe里所有外部的链接
    '#############################################
    Set ōbjPage = Browser("Browser").Page("Page").Object
    Set ōbjTag = objPage.GetElementsByTagName("A")
    intTotalLink = objTag.Length - 1

    For intCtr = 0 to intTotalLink
     strLink = objTag(intCtr).InnerText
     strHref = objTag(intCtr).Href
     msgbox  strLink
     msgbox strHref
    Next
    '#############################################
    '枚举iframe内的所有链接
    Set ōDesc = Descrīption.Create()
    oDesc("html tag").Value = "iframe"
    Set iframe. = Browser("Browser").Page("Page").ChildObjects(oDesc)
    NumberOfiframe. = iframe.Count()
    For i = 0 To NumberOfiframe. - 1
        Set ōbjPage = iframe(i).Object
     Set ōbjTag = objPage.GetElementsByTagName("A")
     intTotalLink = objTag.Length - 1

     For intCtr = 0 to intTotalLink
      strLink = objTag(intCtr).InnerText
      strHref = objTag(intCtr).Href
      msgbox  strLink
      msgbox strHref
     Next
    Next

    Set  ōDesc=nothing
    '######################################

    以上代码在中Window2000ad sp4+qtp8.2上调试通过。

  • (转)QTP数据库检查点手动SQL写法

    2008-12-26 14:42:58

    一、SQL Server格式(本地无需安装SQL Server)
    connectionstring(连接字符串):
    1.本地没有创建数据源的方式
    DRIVER=SQL Server;SERVER=数据库IP地址;UID=用户名;PWD=密码;APP=Microsoft Office 2003;WSID=本地主机名;DATABASE=数据库名

    实例:
    DRIVER=SQL Server;SERVER=10.160.11.10;UID=sa;PWD=sa;APP=Microsoft Office 2003;WSID=RJHLJUN;DATABASE=dcwork

    2.本地已创建数据源的方式
    DSN=数据源名称;UID=用户名;PWD=密码;APP=Microsoft Office 2003;WSID=数据库的主机名;DATABASE=数据库名

    实例:
    DSN=LocalServer;UID=sa;PWD=sa;APP=Microsoft Office 2003;WSID=RJDCWORKTEST;DATABASE=dcwork

    3.SQL语句实例(从数据库表HR_LANGUAGE_TYPE中,查询字段语言名称LANGUAGE_NAME,条件语言名称=中文,按语言名称升序排序结果)
    source(SQL语句):
    SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME  FROM dcwork.dbo.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE  WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文')  ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME


    二、DB2格式:(本地至少安装DB2 Run-Time Client Lite)
    connectionstring(连接字符串):
    1.本地没有创建数据源的方式
    DRIVER={IBM DB2 ODBC DRIVER};UID=用户名;PWD=密码;MODE=SHARE;DBALIAS=数据库名;

    实例:
    DRIVER={IBM DB2 ODBC DRIVER};UID=db2admin;PWD=db2admin;MODE=SHARE;DBALIAS=DCWORK;

    2.本地已创建数据源的方式
    DSN=数据源名称;UID=用户名;PWD=密码;MODE=SHARE;DBALIAS=DCWORK;

    实例:
    DSN=DWCORKDB2;UID=db2admin;PWD=db2admin;MODE=SHARE;DBALIAS=DCWORK;

    3.SQL语句实例
    source:SQL语句
    SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME  FROM DB2ADMIN.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE  WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文')  ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME


    三、Oracle格式:(本地需要安装Oracle ODBC DRIVER)
    connectionstring(连接字符串):
    1.本地没有创建数据源的方式
    DRIVER={Oracle in OraHome92};SERVER=数据库服务名;UID=用户名;PWD=密码;DBQ=数据库名;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;

    打开QTP
    1.insert--checkpoint--database checkpoint
    2.在弹出来的窗口选择第二项 specify SQL ....,然后点下一步,再点create
    自己创建一下ODBC,如果能链通ORACLE,那在QTP回放应该没有问题
    我的是LINUX AS4+ORACLE 10G
    在QTP中的脚本是
    Dim Cnn
    Set Cnn = CreateObject("ADODB.Connection")
    Cnn.ConnectionString ="DRIVER={Oracle in OraClient10g_home1};SERVER=TEST;UID=system;PWD=test;DBQ=TEST;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=Me;CSR=F;FWC=F;FBS=60000;TLO=O;"

    Cnn.Open
    If Cnn.State = 0 Then
         Reporter.ReportEvent micFail, "testing", "连接数据库失败"
    else
         Reporter.ReportEvent micPass, "testing",   "连接数据库成功"

    end if
    回放是通过的!

    先确定你的ODBC能否正确连通先!

    四  MYSQL格式:(本地需要安装MYSQL ODBC DRIVER)

    Dim Cnn
    Set Cnn = CreateObject("ADODB.Connection")
    Cnn.ConnectionString ="DATABASE=testmysql;DSN=192.168.1.63;OPTION=0;PWD=123456;PORT=0;SERVER=192.168.1.63;UID=root"
    Cnn.Open
    If Cnn.State = 0 Then
         Reporter.ReportEvent micFail, "testing", "连接数据库失败"
    else
         Reporter.ReportEvent micPass, "testing",   "连接数据库成功"
    end if

    2.本地已创建数据源的方式
    DSN=数据源名称;UID=用户名;PWD=密码;DBQ=数据库名;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=F;BAM=IfAllSuccessful;MTS=F;MDI=F;CSR=F;FWC=F;PFC=10;TLO=0;

    实例:
    DSN=dcworkoracle;UID=DCWORK;DBQ=DCWORK;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=F;BAM=IfAllSuccessful;MTS=F;MDI=F;CSR=F;FWC=F;PFC=10;TLO=0;

    3.SQL语句实例
    source:SQL语句
    SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME  FROM DCWORK.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE  WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文')  ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME

1395/7<1234567>
Open Toolbar