发布新日志

  • (转)我的QTP的学习方法及总结—参数化(2)

    2009-03-29 11:47:53

    关于QTP中的参数化51Testing软件测试网A F N-Y@9l.uf|s

    方法一、DataTable方法51Testing软件测试网^o^+d'MQ

    这是QTP提供的一种方法,也是最容易实现参数化的一种方式。QTP针对DataTable对象提供了很多方法,可以对DataTable进行灵活的操作。DataTable分为GlobalLocal两种,Global所有的Action都可以用,而Local就是只能Action自己用。

    zm,B.]&o-a!t138711

    通过DataTable做参数化最直接的方法就是在Keyword View视图下通过选项进行,这样即方便又减少出错的几率。单击要参数化项目的value列,选择出现的箭头弹出Value Configuration Option对话框,在这里可以很方便的进行参数化。

    6q.?|0s#Q4a138711

    51Testing软件测试网 Q6Ha@s]fWcE

    Zf;nzAz uc#G138711

    Parameters选择数据来源类型。DataTable是从数据表中取值,Environment是从环境变量中取值,Random Number是选择随机值。下拉列表选择DataTable后,选择所要使用的数据表Global还是local,最后选择name,参数取自哪列,点击确定后即可完成参数化过程。51Testing软件测试网.Av f|cw.u

    Dialog("Login").WinEdit("Agent Name:").Set DataTable("UserName", dtGlobalSheet)51Testing软件测试网Ja:|Mf-FU ^6b(G

    这是最简单最直接的方式。用这种方式需要注意,在File---Seting---Run需要做相应设置,否则运行结果很容易出错,使实际取到的参数值和预期的不一样或是循环不正确的错误。最好的方式是通过写语句来控制迭代过程中的取值。在脚本开发过程中,这种方式是最常用的。类似如下代码:51Testing软件测试网4J6} ~'Z:x/i4f

    For i=0 to DataTable.GetCurrentRow

    }IBvF*J5a:Fx138711

    Dialog("Login").WinEdit("Agent Name:").Set DataTable("UserName", dtGlobalSheet)51Testing软件测试网1oo@ Z/PU0J:b'[

    DataTable.SetNextRow51Testing软件测试网 X*q*^ h"cU+Rw0{i!e

    Next51Testing软件测试网/Pw*h{M

    51Testing软件测试网G_1J5eW"X1K rz$u

    Vv%RXQ`4IoY138711

    DataTable提供了很多相关的方法和属性,具体参考帮助文档。帮助目录下的Utility.chm文档中有关于DataTable对象的详细介绍。

    )^ d w`U E+if;^138711

    方法二、环境变量实现参数化

    ^1Ys m(~Z(z138711

    Environment对象提供对环境变量的访问。环境变量的来源有两种方式:内部环境变量和用户定义的环境变量,其中后者支持从外部导入,格式为XML文件。用环境变量做参数化有一定的局限性,因为环境变量对数据的操作没有方法一灵活,所以环境变量用的最多还是数据的共享。在此暂作为一种方式来学习,灵活运用就好。

    vi~|F3vMl!O138711

    首先说内部环境变量。它是QTP默认定义的一组变量,包括一些系统信息、项目信息等。目前用到最多的是TestDir,利用这个可以实现一个相对目录的目的。具体应用,在做一个数据驱动的脚本时,将数据文件放到脚本文件夹中,然后利用Environment("TestDir")+DataName导入数据文件。这样可以很方便的移植,而不需要考虑将数据文件放到具体目录下。

    2S:f9rn SR7[Q138711

    用户定义的环境变量,需要自己定义变量名和值。定义好后就可以用这些变量去参数化脚本中的常量。51Testing软件测试网+u{)yOH]_1i

    Dialog("Login").WinEdit("Agent Name:").Set Environment("test1")

    ;}E8s"x#\138711

    51Testing软件测试网D4pBXlx

    y"U"C0A C"p.v138711

    这样做参数时,每个参数值都需要指定,而且不能批量的生成。所以它有一定的应用场景:当一个Test中的不同Action需要同样一个参数,用环境变量去参数化常量是很好的一种方式;其次就是不同的Test需要用到同样的参数时,用环境变量可以很好的解决这个问题。

    9^1m\2B/stb.i138711

    方法三、外部数据源实现参数化51Testing软件测试网 }Tl K z

    利用外部数据驱动脚本的运行,这是经常用到的方法,这样可以很方便的组织测试数据。相对前两种方法,这种方式数据的读取、控制稍有些麻烦。下面以常见的几种方式进行说明。(以下代码并不复杂,没做注释)

    II B0}K/h.?[138711

    1.      数据文件以Excel组织

    c:c#X l]%m'W138711

    Excel组织测试数据是最常用的了。此种驱动可以采用两种方式,将数据ImportDataTab中或是利用com来操纵Excel文件。下面给出这两种方式的示例代码。(输入flight用户名和密码)51Testing软件测试网:{,x_ qwYI.FIt V;a

    方式一、导入到DataTable

    .C;p"LKI*?138711

          '获得数据文件路径,并将数据文件导入到DataTable运行表中51Testing软件测试网d4L+i.e`:A*c Ss7Cw+nE

          DataStr= Environment("TestDir")&"\data.xls"51Testing软件测试网L_.@/bbh R

          DataTable.AddSheet("TestData")

    -WT q tY138711

          DataTable.ImportSheet DataStr,"Sheet1","TestData"

    JQi pj&[&E'o138711

          '输入用户名和密码

    |#k}n*hF138711

          For i=1 to DataTable.GetSheet("TestData").GetRowCount

    5Y!B ?t*hPA'mV!K*P138711

                 DataTable.SetCurrentRow i

    +[ u-l+_0w(G$G-O138711

                 UserName=DataTable.Value("UserName","TestData")51Testing软件测试网 [|z&` ]G{ ^5I

                 PassWord=DataTable.Value("PassWord","TestData")

    nM|)S3qaba138711

                 Dialog("Login").WinEdit("Agent Name:").Set UserName51Testing软件测试网 C5LmIN)s r1D

                 Dialog("Login").WinEdit("Password:").SetSecure PassWord51Testing软件测试网'S;v!C2N5ZiQ

          Next

    ;u/}arn+e138711

    Wv-n[_(B~"V138711

    QrS{.ktXh0E138711

    方式二、利用com操纵Excel51Testing软件测试网1z S.X(b }-? J:]

          DataStr= Environment("TestDir")&"\data.xls"51Testing软件测试网!cb8lN"ZH@"o;n

          Set ExlObj=CreateObject("Excel.Application")51Testing软件测试网7U8D?$~:e:@

          ExlObj.Visible = True

    RB`&_~6d ZZX.cP138711

          ExlObj.DisplayAlerts = FALSE

    (vC'u T%F7b#{138711

          Set book=ExlObj.Workbooks.Open(DataStr)

    Gjz,it-n)T:c8r138711

          Set sheet=book.Worksheets("Sheet1")51Testing软件测试网 Z\.G3Ii#c:X5?$S[s

          For i=2 to sheet.usedrange.rows.count

    $Uf:m,e[4J138711

                 UserName=ExlObj.WorkSheets("Sheet1").Cells(i,1)51Testing软件测试网9v ^w@/I t^'E\

                 PassWord=ExlObj.WorkSheets("Sheet1").Cells(i,2)

    R1k/o;tzfL138711

                 Dialog("Login").WinEdit("Agent Name:").Set UserName51Testing软件测试网n UBS6c5B ? a

                 Dialog("Login").WinEdit("Password:").SetSecure PassWord

    7An\ w)nn6s'Au138711

          Next

    lM0M/d7{0b4b138711

          ExlObj.Quit51Testing软件测试网Z9x3nc A1["wF {

          Set ExlObj = nothing

    e:|^G}V X\0Kj!`138711

     51Testing软件测试网1B5[2oj&|

    2.      数据文件以txt组织51Testing软件测试网%?m.R}{ VgU{

    不多说,直接附上代码。

    3WVuQ+P9|138711

    Const ForReading=1

    I f Z}d138711

    TFilePath= Environment("TestDir")&"\data.txt"

    Ds9?S+Q ?R9KNj138711

    Set Fso3 = CreateObject("Scripting.FileSystemObject")51Testing软件测试网 \$f(b qI,bw8L

    Set DataFile= Fso3.OpenTextFile(TFilePath,ForReading,False)

    7TbwS~7T138711

    DataFile.SkipLine51Testing软件测试网3J4\jtT

    Do while DataFile.AtEndOfLine<>true51Testing软件测试网*KhM9e%haG$S"x

          ReadString = DataFile.ReadLine51Testing软件测试网lr'ml6J%s;{"b_

          DataStr=split(ReadString,",")

    5N`7Da{138711

          Dialog("Login").WinEdit("Agent Name:").Set DataStr(0)51Testing软件测试网:i(PW| E"R

          Dialog("Login").WinEdit("Password:").SetSecure DataStr(1)51Testing软件测试网q;xB5^ CZ d

    loop51Testing软件测试网:Z"}d VCt

    DataFile.close

    9D}rF-FV138711

    Set Fso3=Nothing51Testing软件测试网] o7dv)c

    +TC0q,N4RqH1l138711

    }Z5|KL1d;X138711

    3.      数据文件以数据库组织

    @,zv l"rMz|138711

    下面代码是用Access做的,其他类型数据库类似。不多说继续贴出代码。

    bkF~EN0[4g138711

    strDB="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\zilingold\桌面\Testdata.mdb;Persist Security Info=False"51Testing软件测试网!q/ik7u3t"V]y^:R

    strTableName="data"

    @~+R-_ Rjh138711

    SetConn=createobject("adodb.connection")

    #zu3CfI`4\ N8p138711

    Set Rst=createobject("adodb.recordset")

    d}E}7g!T138711

    Conn.open strDB51Testing软件测试网4S6a4ph)p

    Rst.open "select * from "+strTableName,Conn,2,251Testing软件测试网3[$gTct/S:JN

    Dim strTest(1)51Testing软件测试网4VTddi'\*UD0Lp

    Rst.MoveFirst51Testing软件测试网E,R(r&B8o%X$Jd?(F

    Do while not Rst.eof51Testing软件测试网EJH6ks'g

          strTest(0)=trim(cstr(Rst.fields(0)))51Testing软件测试网!g's,PU-yFf h

          strTest(1)=trim(cstr(Rst.fields(1)))

    x&XN1E-l(As138711

          Dialog("Login").WinEdit("Agent Name:").Set strTest(0)51Testing软件测试网(w1`4_{fe:L

          Dialog("Login").WinEdit("Password:").SetSecure strTest(1)51Testing软件测试网2clBd#|1{7?,b

          Rst.MoveNext

    H,f;t VQV3{t138711

    Loop

    ?A x,d Fp?138711

    Rst.close

    yxy.zdw138711

    SetConn=nothing51Testing软件测试网],t Hy p/c,y

    $I,IJ!mb`y138711

    51Testing软件测试网-J0cb9i^T

    4.      数据文件以XML组织

    r-{$vL oeN&W9{138711

    XML也是会经常用到的一种方式。继续贴代码。51Testing软件测试网-Z{ X!qYL z {`G

    Dim xmlDoc 'As DOMDocument需要引用xml对象51Testing软件测试网A7ROp:J'bs

    set xmldoc=CreateObject("microsoft.xmldom")

    ,w5q j;a$@138711

    xmldoc.load(Environment("TestDir")&"\testdata.xml")51Testing软件测试网?O2j9G@9w%d9X

    Set Root=xmldoc.documentElement

    kCp|Rm"m138711

    For i = 0 To Root.childNodes.Length-151Testing软件测试网-UC!g9P8hTCEY

                 Set TestCases = Root.childNodes.Item(i)51Testing软件测试网WJ2TUod mK

                        For j = 0 To TestCases.childNodes.Length-1

    |G#Sk0Ecl138711

                               Set TestCase = TestCases.childNodes.Item(j)51Testing软件测试网8D,Hb9J7[-p E

                                      If cstr(TestCase.nodeName)="UserName" Then51Testing软件测试网_!p-@_*N9jNy

                                             Dialog("Login").WinEdit("Agent Name:").Set TestCase.text      51Testing软件测试网 G*C%X4F{

                                      end if

    Df%ws8GI:oDV-T.A138711

                                      If cstr(TestCase.nodeName)="PassWord" Then51Testing软件测试网R^*zb(N

                                             Dialog("Login").WinEdit("Password:").SetSecure TestCase.text                                                             End If                         51Testing软件测试网2[HQ xT

       &nbs

    Next51Testing软件测试网.tp ~\/Zx.[

          Next51Testing软件测试网Q/F"\:y\9@A

    Set root=nothing

    B tV!^ du3_;i#^7u138711

    Set xml=nothing51Testing软件测试网[|'WI^b2_

  • (转)我的QTP的学习方法及总结(1)

    2009-03-29 11:41:34

    上一部分说了QTP识别对象的原理,运行机制问题。接下来自然就是正确识别对象以后,如何操作这些对象。换句话说就是我们用QTP对界面上的元素都能干些什么。在测试过程中,我们要尽量模拟出用户的操作场景,验证系统在这些场景下的响应。QTP的脚本,就是让程序去实现这些操作,如单击、选择数据、输入数据等操作。

    8]4SLCXvkr+o.FH138711

     51Testing软件测试网#{)kEK J`%c-N]mq G

    QTP正对每一种对象,均提供了一套方法。写脚本时,在对象后输入英文“.”则会自动感知,列出该对象所有支持的方法。如图51Testing软件测试网%]M~ U)X"yq/]

     51Testing软件测试网!_mv7lgWi ma

    W1q y$~"Ip J3w-\[138711

    51Testing软件测试网&H(A(k%vBOV

     

    6}Eh0G[CP$?S138711  学习、掌握这些方法的用法是很重的一环。这也是QTP很基础的一些应用。学习这些方法最好的方法就是挨个的自己去验证,并结合帮助文档把每个用法的要点、应用场景、作用搞明白。有些方法网上的朋友也做过详细的分析、比较,可以参考加深理解。所以在这个阶段就尽情的按“F1”吧。
    N-K2v1E;B-m }u13871151Testing软件测试网&g2O4J5X]#Q.Eo
      附中文帮助地址:http://bbs.ltesting.net/thread-57752-1-1.html51Testing软件测试网3j~"^ B&r)c

    2\#} }$UT No$?138711  经常有朋友问我这么多对象,这么多方法,怎么能记的住呢。其实只要安下心,慢慢钻研1到2个小时,就会发现其中的规律。很多方法对很多对象都是通用的,而且方法都是相通的,所以只要把一个对象下边的方法掌握了,
    其他对象的方法掌握起来也就很简单了。有一些方法一点要牢记,做到就像吃饭前要拿筷子一样得心应手。如Click,Select,WaitProperty,Set,ColumnCount,GetCellData,RowCount等这种常用的方法。还有一些很相似的用法的区别要搞清楚,如:GetROProperty,GetTOProperties,GetTOProperty,GetTOProperty。这几个很相近,但从名字上很容易区分开,他们的介绍网络上已经介绍的很清楚,这里不再累述。51Testing软件测试网MH1n1T-Pf jL

    "` \h*@)UEDH{{138711  Browser对象一个很有用的表示符creationTime,这个属性在写
    web系统的脚本时可以发挥很大作用。它是根据Browser的打开顺去去识别对象,而不会根据具体的属性。这样可以避免由于属性改变造成对象不识别的麻烦。Browser("creationTime:=1")识别得失第二个打开的浏览器。creationTime是Browser对象特有,其他对象类似属性时index和Location。
    !O4x Gf#c |138711
    d`+?S8Ak138711  WebTable对象,有时系统里存在多个表,但表面看是一个表而且这些表的属性都一样。但只有一个表里有数据,其他都是空表。我曾经遇到脚本不报错,但取的值一直为空就是因为这个原因。解决办法就是在属性里加上index去识别表。51Testing软件测试网M"^b;? \6p
    51Testing软件测试网R"e*O$LE;@|"K[
      通过对象的Object属性可以访问对象的内部方法和属性,这样可以使脚本更灵活,有时可以解决大问题。通过spy可以知道对象都有哪些内部属性和方法。如图,在Run-time列出了内部方法。

     51Testing软件测试网N9z(o5s3oNl

    51Testing软件测试网 g0fbc'U2w l

     51Testing软件测试网~ `%|\ xSi}

    51Testing软件测试网|;g1N+uC7w]Z6TtM}

    代码1

    |m{J~5jX^138711

    SerchText("")51Testing软件测试网antah(S

    Sub SerchText(testStr)51Testing软件测试网.m?u;dz

          set a=Browser("name:=百度一下,你就知道").Page("title:=百度一下,你就知道").Object.body.createTextRange()51Testing软件测试网)c)O^zMS:F

          b=a.text51Testing软件测试网%jfV5f?

          Set regEx=new RegExp

    Bv&R\-S5r4x138711

          regEx.Pattern=testStr51Testing软件测试网h)hC#dgp1^

          regEx.IgnoreCase=true

    FL"g3rL$C5KX138711

          regEx.Global=true

    ,n,yd4`#Y:q138711

          Set Matches=regEx.Execute(b)

    f[g;M*d138711

           For Each Match in Matches     'Matches集合进行迭代。

    $D;KU9E ~DV|c138711

                 RetStr = Match.Value

    C3T+ARL'~*g;r WN"k138711

                 msgbox RetStr51Testing软件测试网j ^7VdH/e

           Next51Testing软件测试网Rb&rv,fMx?4[

    End Sub51Testing软件测试网ySXh`iy.WZ)L)l9T^

    以上代码实现通过Object和正则表达式在页面上查找字符串功能。51Testing软件测试网/[P ~"gP

     

    Z7i'\h'MB138711

    代码251Testing软件测试网D,pT i N+}1{

    Browser("百度一下,你就知道").Page("百度一下,你就知道").WebButton("百度一下").Object.setAttribute "value","我的搜索"51Testing软件测试网8i @+@)H0?1s\g9X

        这句代码通过ObjectsetAttribute修改运行时按钮的value值。运行一下看看效果。运用场景:输入框需要单击激活输入状态,通过QTP脚本不能激活,此时可以通过修改运行对象的属性将其激活。


     

  • (转)数据驱动在QTP中的运用--使用SQL数据库

    2009-03-20 16:22:33

    本篇主要讲述Flight打开订单的正确性测试,通过数据库进行数据驱动测试,主要步骤和考虑思路如下:

            1.从数据库中随机读取一条存在的记录
            2.在Flight中打开本条记录
            3.比较数据库中的数据和软件界面上的显示是否一致
       - 其中数据库中读出的记录数据保存在局部变量中
       - 界面显示的实际数据通过Output Value保存到QTP自带的DataTable中.

     

    Option Explicit

    Dim conn, rst, maxnumber, rndNumber, sql
    Dim dbFlightNumber, dbTicketNumber, dbPlaneType, dbCustomerName
    Dim oPlaneType
    '------------------------------------------------------------------------------------------------------------------------------------------------------

    '获取数据库中的记录数据(期望结果)
    Const  strConn = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=QT_Flight32"
    Set conn=CreateObject("Adodb.Connection")
    Set rst=CreateObject("Adodb.RecordSet")
    conn.open strConn

    '获取最大Order_Number
    sql = "select max(order_number) from orders "
    rst.Open sql, conn
    maxNumber = rst.Fields(0).Value
    rst.Close

    '随即获取一条记录
    rndNumber = RandomNumber(1, maxNumber)
    sql = "Select  Flight_Number, Tickets_Ordered, Class, Customer_Name  from orders where order_number =" & CStr(rndNumber)
    rst.Open sql, conn

    While rst.EOF
     rndNumber = RandomNumber(1, maxNumber)
     sql = "Select  Flight_Number, Tickets_Ordered, Class, Customer_Name  from orders where order_number =" & CStr(rndNumber)
     rst.Open sql, conn
    Wend

    rst.MoveFirst
    While not rst.EOF
        dbFlightNumber = rst.Fields(0).value
        dbTicketNumber =rst.Fields(1).value
        dbPlaneType = rst.Fields(2).value
        dbCustomerName = rst.Fields(3).value
        rst.MoveNext
    Wend

    conn.close
    Set rst=nothing
    Set conn=nothing


    '------------------------------------------------------------------------------------------------------------------------------------------------------
    '录制脚本程序
    SystemUtil.CloseProcessByName "Flight4a.exe"
    SystemUtil.Run Environment.Value("ProductDir") & "\samples\flight\app\flight4a.exe"
    Dialog("Login").WinEdit("Agent Name:").Set "Admin"
    Dialog("Login").WinEdit("Password:").Set "Mercury"
    Dialog("Login").WinButton("OK").Click
    Window("Flight Reservation").WinButton("Button").Click
    Window("Flight Reservation").Dialog("Open Order").WinCheckBox("Order No.").Set "ON"
    Window("Flight Reservation").Dialog("Open Order").WinEdit("Edit").Set rndNumber  '在这里Set 随机打开的订单
    Window("Flight Reservation").Dialog("Open Order").WinButton("OK").Click
    Window("Flight Reservation").Activate


    '获取 界面显示的实际数据(实际结果)
    Window("Flight Reservation").WinEdit("Flight No:").Output CheckPoint("Flight No:")
    Window("Flight Reservation").WinEdit("Tickets:").Output CheckPoint("Tickets:")
    Window("Flight Reservation").WinEdit("Name:").Output CheckPoint("CustomerName")

    '将界面上的仓位转换为1,2,3
    If Window("Flight Reservation").WinRadioButton("First").GetROProperty("Text") = "ON" Then
     oPlaneType = 1
    ElseIf Window("Flight Reservation").WinRadioButton("Business").GetROProperty("Text") = "ON" Then
     oPlaneType = 2
    ElseIf Window("Flight Reservation").WinRadioButton("Economy").GetROProperty("Text") = "ON" Then 
     oPlaneType = 3
    End If


    '检查Flight Number
    If CStr(dbFlightNumber) = CStr(DataTable("oFlightNumber", dtLocalSheet)) Then
     Reporter.ReportEvent micPass, "打开订单- Flight Number", "期望结果是:" & dbFlightNumber & ", 界面显示实际结果是:" & DataTable("oFlightNumber", dtLocalSheet)
    Else
     Reporter.ReportEvent micPass, "打开订单- Flight Number", "期望结果是:" & dbFlightNumber & ", 界面显示实际结果是:" & DataTable("oFlightNumber", dtLocalSheet)
    End If

    '检查Ticket Number
    If CStr(dbTicketNumber) = CStr(DataTable("oTicketNumber", dtLocalSheet)) Then
     Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是:" & dbTicketNumber & ", 界面显示实际结果是:" & DataTable("oTicketNumber", dtLocalSheet)
    Else
     Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是:" & dbTicketNumber & ", 界面显示实际结果是:" & DataTable("oTicketNumber", dtLocalSheet)
    End If

    '检查Customer Name
    If CStr(dbCustomerName) = CStr(DataTable("oCustomerName", dtLocalSheet)) Then
     Reporter.ReportEvent micPass, "打开订单- CustomerName", "期望结果是:" & dbCustomerName & ", 界面显示实际结果是:" & DataTable("oCustomerName", dtLocalSheet)
    Else
     Reporter.ReportEvent micPass, "打开订单- CustomerName", "期望结果是:" & dbCustomerName & ", 界面显示实际结果是:" & DataTable("oCustomerName", dtLocalSheet)
    End If

    '检查Plane Type
    If CStr(dbPlaneType) = CStr(oPlaneType) Then
     Reporter.ReportEvent micPass, "打开订单- Plane Type", "期望结果是:" & dbPlaneType & ", 界面显示实际结果是:" & oPlaneType
    Else
     Reporter.ReportEvent micPass, "打开订单- Plane Type", "期望结果是:" & dbPlaneType & ", 界面显示实际结果是:" & oPlaneType
    End If

    'Close Prog
    Window("Flight Reservation").Close

  • (转)数据驱动在QTP中的运用--使用ADODB导入EXCEL数据文件

    2009-03-20 16:21:56

    前面介绍的是直接使用EXCEL导入数据文件,在这里介绍使用ADODB导入EXCEL数据文件的方法。操作思想基本上是一致的,就是链接数据文件的方法不同。

    Option Explicit

    Dim conn, rst, fileName, strConn
    Dim var, i

    fileName = Environment.Value("TestDir") & "\test.xls"
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info = False;"
    strConn = strConn & "Data Source = " & filename & ";Extended Properties='Excel 8.0'"

    Set conn = CreateObject("ADODB.Connection")
    conn.Open strConn
    Set rst = CreateObject("ADODB.RecordSet")
    rst.Open "select * from [Sheet1$]", conn, 1, 1

    Print rst.RecordCount
    i = 0
    '读取Excel表格时,自动从第二行开始读起,将第一行作为Title
    While Not rst.EOF
     i = i + 1
     Print "LINE " & CStr(i) & " : " & rst.Fields(0).Value & " " & rst.Fields(1).Value
     rst.MoveNext
    Wend
     
    rst.Close
    Set rst = Nothing 

  • (转)数据驱动在QTP中的运用--自定义EXCEL文件

    2009-03-20 16:21:10

    本节共有两个实例,第一个是把测试用例的数据写到EXCEL文件中,第二个是通过读取EXCEL文件中的数据,并把执行结果写入到EXCEL文件中。

    1.对EXCEL文件进行写操作
     
    Option Explicit
     
    Dim fso, ddFilePath, i
    Dim ExcelBook, ExcelSheet
     
    ddFilePath = Environment.Value("TestDir") & "\ddFile.xls"
     
    Set fso = CreateObject("Scripting.FileSystemObject")
    If fso.FileExists(ddFilePath) Then
           fso.DeleteFile(ddFilePath)
    End If
    wait 3
     
     
    Set ExcelBook = CreateObject("Excel.Application")
    Set ExcelSheet = CreateObject("Excel.Sheet")
    ExcelSheet.Application.visible = False
     
    ExcelSheet.ActiveSheet.Cells(1,1).Value = "Agent Name"
    ExcelSheet.ActiveSheet.Cells(1,2).Value = "Password"
    ExcelSheet.ActiveSheet.Cells(1,3).Value = "Expire Value"
    ExcelSheet.ActiveSheet.Cells(1,4).Value = "Fact Value"
    ExcelSheet.ActiveSheet.Cells(1,5).Value = "Execute Result"
     
    ExcelSheet.ActiveSheet.Cells(2,1).Value = "ad"
    ExcelSheet.ActiveSheet.Cells(2,2).Value = "Mercury"
    ExcelSheet.ActiveSheet.Cells(2,3).Value = "Agent name must be at least 4 characters long."
     
    ExcelSheet.ActiveSheet.Cells(3,1).Value = "Admin"
    ExcelSheet.ActiveSheet.Cells(3,2).Value = "Merc"
    ExcelSheet.ActiveSheet.Cells(3,3).Value = "Incorrect password. Please try again"
     
    ExcelSheet.ActiveSheet.Cells(4,1).Value = "Admin"
    ExcelSheet.ActiveSheet.Cells(4,2).Value = "Mercury"
    ExcelSheet.ActiveSheet.Cells(4,3).Value = "Flight Reservation"
          
    ExcelSheet.SaveAs ddFilePath
    ExcelBook.Quit
    Set ExcelBook = Nothing
     
     
    2.对EXCEL文件进行读写操作
    Option Explicit
     
    Dim fso, filePath, i
    Dim ExcelBook, ExcelSheet, myExcelBook, myExcelSheet
     
    filePath = Environment.Value("TestDir") & "\ddFile.xls"
     
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ExcelBook = CreateObject("Excel.Application")
    Set ExcelSheet = CreateObject("Excel.Sheet")
     
    Set myExcelBook = ExcelBook.WorkBooks.Open(filePath)
    Set myExcelSheet = myExcelBook.WorkSheets("Sheet1")
     
    For i = 2 To 4
           SystemUtil.CloseProcessByName "Flight4a.exe"  
           SystemUtil.Run Environment.Value("ProductDir") & "\samples\flight\app\flight4a.exe"
     
           Dialog("Login").WinEdit("Agent Name:").Set myExcelSheet.Cells(i,1)
           Dialog("Login").WinEdit("Password:").Set myExcelSheet.Cells(i,2)
           Dialog("Login").WinButton("OK").Click
     
           If Dialog("Login").Dialog("Flight Reservations").Exist Then
                   myExcelSheet.Cells(i,4).Value = Dialog("Login").Dialog("Flight Reservations").Static("errInfo").GetROProperty("text")
                  
                  If Dialog("Login").Dialog("Flight Reservations").Static("errInfo").GetROProperty("text") = myExcelSheet.Cells(i,3) Then
                      myExcelSheet.Cells(i,5).Font.Color = vbBlue
                         myExcelSheet.Cells(i,5).Value = "测试成功"
                  Else
                         myExcelSheet.Cells(i,5).Font.Color = vbRed
                         myExcelSheet.Cells(i,5).Value = "测试失败"
                  End If
     
                  Dialog("Login").Dialog("Flight Reservations").WinButton("确定").Click
                  Dialog("Login").WinButton("Cancel").Click
                 
           Elseif Window("Flight Reservation").Exist Then
                  myExcelSheet.Cells(i,4).Value = Window("Flight Reservation").GetROProperty("text")
                  myExcelSheet.Cells(i,5).Font.Color = vbBlue
                  myExcelSheet.Cells(i,5).Value = "测试成功"
                  Window("Flight Reservation").Close
           Else
                  logFile.WriteLine "没有窗口弹出,测试失败!"
                  ExitAction
           End If    
    Next
     
    myExcelBook.Save
     
    ExcelBook.Quit
    Set ExcelBook = Nothing


  • (转)数据驱动在QTP中的运用--自定义TXT文件

    2009-03-20 16:19:55

    以下是对Mercury Interactive公司的Flight飞机订票系统的Login模块进行数据驱动测试的VBScript脚本实例,
            通过对自定义TXT文件进行读写操作。
    Option Explicit
     
    Dim fso
    ‘数据驱动文件路径,数据文件,当前行
    Dim ddFilePath, ddFile, ddCurrLine
    ‘执行日志文件路径,日志文件
    Dim logFilePath, logFile
     
    ddFilePath = Environment.Value("TestDir") & "\ddFile.txt"
    logFilePath = Environment.Value("TestDir") & "\logFile.txt"
     
    '====写入测试用例数据到数据驱动文件中===='
    Set fso = CreateObject("Scripting.FileSystemObject")
    'OpenTextFile第三个参数如果是False表示如果文件一定要存在.
    Set ddFile = fso.OpenTextFile(ddFilePath, 2, True)
     
    ddFile.WriteLine "ad,Mercury,Agent name must be at least 4 characters long."
    ddFile.WriteLine "admin,merc,Incorrect password. Please try again"
    ddFile.WriteLine "admin,Mercury,Flight Reservations"
    ddFile.Close
     
     
    '====写入测试结果到数据日志文件中===='
    Set logFile = fso.OpenTextFile(logFilePath, 2, True)
    logFile.WriteLine "************************************************************"
    logFile.WriteLine "************************************************************"
    logFile.WriteLine "*************************测试日志***************************"
    logFile.WriteLine "******************用例名称:用户登陆**************************"
    logFile.WriteLine "**********************作者:Holly zhao*************************"
    logFile.WriteLine "********************执行时间:" & Date & "*********************"
    logFile.WriteLine "************************测试开始:**************************"
     
    '从ddFile中读取测试数据
    Set ddFile = fso.OpenTextFile(ddFilePath, 1, True)
     
     
    While NOT ddFile.AtEndOfLine
           ddCurrLine = Split(ddFile.ReadLine, ",")
     
           SystemUtil.CloseProcessByName "Flight4a.exe"
           SystemUtil.Run Environment.Value("ProductDir") & "\samples\flight\app\flight4a.exe"
     
           Dialog("Login").WinEdit("Agent Name:").Set ddCurrLine(0)
           Dialog("Login").WinEdit("Password:").Set ddCurrLine (1)
           Dialog("Login").WinButton("OK").Click
     
          If Dialog("Login").Dialog("Flight Reservations").Exist Then
    If Dialog("Login").Dialog("Flight Reservations").Static("errInfo").GetROProperty("text") = ddCurrLine(2) Then
    logFile.WriteLine "测试成功!"
                  Else
                         logFile.WriteLine "测试失败!"
                  End If
                  Dialog("Login").Dialog("Flight Reservations").WinButton("确定").Click
                  Dialog("Login").WinButton("Cancel").Click
           Else
                  If Window("Flight Reservation").Exist Then
                         logFile.WriteLine "测试成功!"   
    End If    
                  Window("Flight Reservation").Close   
           End If    
    Wend
     
    logFile.WriteLine "==========================测试结束==================================="
    logFile.WriteLine "*********************************************************************"
  • (转)QTP关键技术—Test和Top-Level Action间参数传递

    2009-03-20 14:20:15

    以下讲述一个关于QTP的Test参数和Top-Level Action参数的使用例子,

            有些人不知道这个参数做什么用的,尤其是Test的output不知道怎么取。

            其实它是外部对象传给它的(这个外部对象可以是Quality Center,也可以是vbs这样的驱动程序)。

            以下给大家讲解一个关于QuickTest的Flight的例子。

            首先,在QTP里录制一段脚本,代码如下:

            SystemUtil.CloseProcessByName "Flight4a.exe"

            SystemUtil.Run Environment.Value("ProductDir") & "\samples\flight\app\flight4a.exe"

            Dialog("Login").WinEdit("Agent Name:").Set Parameter("InAction1")

            Dialog("Login").WinEdit("Password:").SetSecure "46f1f4259cf01348f5a4c630bcee96084f3d1619"

            Dialog("Login").WinButton("OK").Click

            Window("Flight Reservation").Close

            Parameter("OutAction1") = true

            然后在QTP中进行参数设置,

            1)设置Action的参数

            鼠标选中Keyword View中的Action1,

            点右键---Action Property,

            在Parameters的Tab标签下,分别加入:

            输入参数 InAction1 ,类型String;

            输出参数 OutAction1,类型 Boolean。

            2)设置Test的参数

            在QTP的菜单File--->>Settings的Parameters的Tab标签下,分别加入:

            输入参数 InTest1 ,类型String;

            输出参数 OutTest1,类型 Boolean。

            3)将Test和Action间参数进行关联传递

            鼠标还是选中Keyword View中的Action1,点右键,

            这次点“Action Call Properties”,

            在Parameter Values里进行参数化传递设置,

            把InTest1的值传递给InAction1,

            把OutAction1的值传递给OutTest1。

            以上设置完毕后,点“保存”,保存到C:\下,存为Test1好了。

            最后,在你的硬盘上新建一个vbs文件,文件内容如下:

            Dim qtApp ,pDefColl,pDef ,rtParams,rtParam

            Set qtApp = CreateObject("QuickTest.Application")

            qtApp.Launch

            qtApp.Visible = True

            qtApp.Open "C:\Test1"

            Set pDefColl = qtApp.Test.ParameterDefinitions

            cnt = pDefColl.Count

            Indx = 1

            While Indx <= cnt

                Set pDef = pDefColl.Item(Indx)

                Indx = Indx + 1

            Wend

            Set rtParams = pDefColl.GetParameters()

            Set rtParam = rtParams.Item("InParam1")

            rtParam.Value = "songfun"

            qtApp.Test.Run , True, rtParams

            MsgBox rtParams.Item("OutParam1").Value

            做完这步之后,保存这个vbs文件,双击执行这个vbs文件,你会发现它自动启动了QTP,而且进行了自动测试,最后还取到了运行成功与否的布尔值。

            这就是关于Test、Top-Level Action参数使用的例子,它的参数的整个传递过程是:

            外部vbs文件 传参数给QuickTest的Test的输入参数InTest1,然后InTest1传参数到InAction1去驱动了Action1的测试

            然后通过这个Action1得出了OutAction1的值,然后通过OutAction1传给OutTest1,最后再传回到vbs文件中。

            示例用MsgBox来打出重新传回到vbs文件中的字符串。

  • (转)QTP关键技术(二)——QTP同步点、并行Action间的参数传递

    2009-03-19 19:48:34

    一 对同步点的理解

      1)QTP的脚本语言是VBScript,脚本在执行的时候,执行语句之间的时间间隔是固定的,也就是说脚本在执行完当前的语句之后,等待固定的时间间隔后开始执行下一条语句
     
      2)问题:假设后一条语句的输入是前一条语句的输出,如果前一条语句还没有执行完,这时候将要导致错误的发生!
     
      3)措施:加入同步点、加入Wait语句

      4)同步点Synchronization Point
      QTP脚本在执行过程中如果遇到同步点,则会暂停脚本的执行,直到对象的属性获取到了预先设定的值,才开始执行下一条脚本。
    如果在规定的时间内没有获取到预先设定的值,则会抛出错误信息。
     
    例如:
      Window("Flight Reservation").ActiveX("Threed Panel Control").WaitProperty "text", "Insert Done...", 10000
      执行到上面这条语句时,QTP会暂停执行,直到显示”Insert Done…”,
      如果在规定的时间10,000ms后text的值没有等于”Insert Done…”,则会抛出错误信息
     
    5)如何获取Synchronization Point
           A.在Recording状态下,通过Insert è Synchronization Point实现
           B.非Recording状态下,在Expert View下,通过Insert è Step Generator è Category(Test Objects)è Object(The Object you’re Testing) è Operation(WaitProperty)è PropertyName、PropertyValue、TimeOut分别填写"text", "Insert Done...", 10000

    6)Wait
      总的来说就是死等,比如说wait 10,当运行到这条语句时,等待10秒钟后,才开始再读下面的语句。所以说写脚本的时候一定要估计好时间,否则的话会浪费运行的时间,或者出现等待时间不足的现象。

    二 并列Action间的参数传递 

      思路:将Action1的输出参数,传递给Action2作为输入参数。
     
      1)创建两个Action,关系是并列关系,不是嵌套的.
               

      2)右键Action1,选Action Properties,在Output Parameters中添加参数OutAction1,点OK
     
      3)右键Action2,选Action Properties,在Input Parameters中添加参数InAction2,点OK
      
      4)将Action1的输出OutAction1,传递给Action2的输入InAction2
     
      右键Action2,选Action Call Properties,弹出Action Call Properties窗口;
      选中InAction2的Value,弹出Value Configuration Options窗口;
      在Parameter中共有四项可供选择,选择Test/Action parameter,
      在Output from previous call(s)中的Action选择Action1,Parameter中选择OutAction1;
      表示Action2中的参数InAction2,是由Action1中的参数OutAction1传递而来。

          

      以上就完成了两个并列Action间参数的传递,Action2只能调用Action1的输出参数,而不能调用Action的输入参数。
     
    三 嵌套Action间的参数传递
      参数传递思路:
      将Action1的输入参数InAction1传递给Action2的输入参数InAction2,
      将Action2的输出参数OutAction2传递给Action1的输出参数OutAction1。
      此文为Hollyzhao于2007年09月在http://blog.csdn.net/softesting 发布,夜深了,有点累~
      1)创建两个Action,嵌套关系,在关键字视图,拖动Action2到Action1下面有缩进的地方
        
      2)右键Action1,选Action Properties,
      在Input Parameters中添加参数InAction1,
      在Output Parameters中添加参数OutAction1,点OK
     
      3)右键Action2,选Action Properties,
      在Input Parameters中添加参数InAction2,
      在Output Parameters中添加参数OutAction2,点OK
     
      4)在Action1和Action2间建立关联
      右键Action2,选Action Call Properties,弹出Action Call Properties窗口;
      此文为Hollyzhao于2007年09月在http://blog.csdn.net/softesting 发布,夜深了,有点累~
      选中InAction2的Value,弹出Value Configuration Options窗口;
      在Parameter中共有四项可供选择,选择Test/Action parameter,
      在Parent action parameters的parameter中选择Action1
      同理,OutAction2的Store In值为OutAction1
                 
      以上的操作就是把输入值 通过Action1的输入参数,传递给Action2的输入参数进行使用,
      然后Action2运行后,将输出参数通过Action1的输出参数传递出去。
      这里只是对嵌套Action进行最基本的讲解,在实际使用当中还要灵活运用。
  • (转)QTP关键技术(一)——对象识别及存储技术基本常识

    2009-03-19 19:45:32

    一 对象识别及存储技术基本常识

    1)测试对象模型(Test Object Model)
            测试对象模型是QTP用来描述应用程序中对象的一组对象类。每个测试对象类拥有一系列用于唯一确定对象属性和一组QTP能够录制的方法
     
    2)测试对象(Test Object)
            用于描述应用程序实际对象的对象,QTP存储这些信息用来在运行时识别和检查对象
     
    3)运行时对象(Run-Time Object)
            是应用程序中的实际对象,对象的方法将在运行中被执行
     
    4)QTP的录制过程
            A.确定用于描述当前操作对象的测试对象类,并创建测试对象
            B.读取当前操作对象属性的当前值,并存储一组属性和属性值到测试对象中
            C.为测试对象创建一个独特的有别于其他对象的名称,通常使用一个突出属性的值
            D.记录在对象上执行的操作
     
    5)QTP的回放过程
            A.根据对象的名称到对象存储库(Object Repository)中查找相应的对象
            B.读取对象的描述,即对象的属性和属性值
            C.基于对象的描述,QTP在应用程序中查找相应的对象
            D.执行相关的操作
     
    二 对Check Point的较为深入理解

    1. 定义:
            将特定属性的当前数据与期望数据进行比较的检查点,用于判定被测试程序功能是否正确
            Check Point可以分两类:QTP内置验证点和自定义验证点
     
    2. QTP内置验证点实现原理及优缺点
            A.录制时,根据用户设置的验证内容,记录数据作为基线数据
            B.回放时,QTP捕获对象运行时的数据,与脚本中的基线数据进行比较
            C.如果基线数据和运行数据相同,结果为PASS,反之为Failed.
            D.优点是 操作简单方便
            E.缺点是 QTP默认的检查的属性有时不符合自己的要求,如希望得到检查的属性没有在里面, 而默认的属性不需要检查等。
     
    3. QTP内置验证点结果的应用
            A.录制的验证点在没有进行调整前,仅仅是给出了检查结果是通过还是错误的
            B.实际的测试过程中,可以根据验证点的结果进行不同的操作
           If Window("Flight Reservation").WinEdit("Name:").Check(CheckPoint("Name:")) = True then
                  msgbox "oh, success!"
    Else
                  msgbox "oh, failure!"
    End If
     
    4. 自定义验证点的应用及优缺点
            A.使用条件语句对实际值和期望值进行对比,然后用Reporter对象报告结果
           '检查Ticket Number
    If CStr(dbTicketNumber) = CStr(DataTable("oTicketNumber", dtLocalSheet)) Then
           Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是:" & dbTicketNumber & ", 界面显示实际结果是:" & DataTable("oTicketNumber", dtLocalSheet)
    Else
           Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是:" & dbTicketNumber & ", 界面显示实际结果是:" & DataTable("oTicketNumber", dtLocalSheet)
    End If
            B.优点是 非常灵活,前者实现的所有检查都可以用此方法来实现;
            C.缺点是 代码量大,对测试人员的要求高。
     
    5. 对Check Point的深入理解

            A.个人认为在比较简单的和有Active Screen的情况下可以使用QTP内置的Check Point,在比较复杂的情况下可以通过编程和使用Reporter来完成.
            B.在使用check方法时,必须先在Keyword View或者Active Screen中新建CheckPoint。否则无法对该对象进行check,系统报错说无法在对象仓库中找到此对象。如果插入检查点,系统会自动把相关的对象添加到对象库中。
            我认为检查点并不是一个实实在在的对象。因为你可以对同一个对象设置不同的检查点,可以把它的某个属性既设定成True,也可以设定为False。而对象库中的对象的属性值是必须依赖于对象的实际属性值的。如果随意更改有可能无法识别。还有就是可以针对同一个对象设定多个检查点。在测试窗口中可以看到这两个检查点的名称是区分开来的。所以我认为检查点并不是实际存在的对象,而是一些类似映射的东西。
            尽管检查点并不是对象库中的实在的对象,但是它必须对应到对象库中的某个实实在在的对象,好像它的一个映像一样,而且在实际的操作过程中,QTP还是把它作为一个对象来处理的。
            因为我们无法像其他对象一样把“检查点对象”添加到对象库中,而QTP又认为它是个对象,所以我们无法在专家视图中直接添加检查点脚本。但是我们可以采用编成描述的方式来实现检查点的功能。
            CheckPoint 是一个依赖于Object Repository(对象库)中的某个对象的“虚拟对象”。其具体含义是:如果它所依赖的QTP 对象库中的对象没有了,那么此CheckPoint 也就不存在了;这个“虚拟对象”的属性是从它所依赖的对象的属性中“抽取”出来的,它具有它所依赖的对象的一个或几个属性,但不能增加它所依赖的对象没有的任何属性。
            CheckPoint 是一个“虚拟对象”的重要原因是:每个Object都能在Object Repository找到它的Name、Class Properties,而CheckPoint 在Object Repository中就根本不存在。选择脚本中的某个对象后,在Object Property 的对话框里面有个Respository按钮,点击它后,你会看到此对象在Object Respository 的Name、Class 和 Properties。
            选择一个CheckPoint后,在CheckPoint Properties 的对话框里没有 Respository 按钮,在Object Respository中也找不到此CheckPoint的Name、Class 和 Properties(因为它在对象库中根本就不存在!)。

  • (转)QTP脚本触发WEB客户端控件的事件

    2009-03-19 18:06:28

          前两天遇到一个QTP脚本编写的问题。脚本需要填写一个WEB表单然后提交,表单里面有两个WebEdit“商品单价”和“购买数量”,只要在“购买数量”中填写数据,页面会立即自动计算出商品的总价。结果发现,脚本回放的时候,无法计算出总价。
     
            经过分析发现原因是这样的。即时计算总价这个功能,是由客户端的js函数实现的,触发这个函数的事件是“购买数量”这个控件的“onkeyup”事件。在手工操作时候,我们敲击键盘会触发这个事件,但是在QTP脚本里面是这样写的:
    Browser("购买").Page("订单").WebEdit("购买数量").Set "8"
     
            这行代码是直接修改了控件的值,因此并没有触发“onkeyup”这个事件
     
            解决这个问题也很简单,只要再增加一句代码即可:
    Browser("购买").Page("订单").WebEdit("购买数量").FireEvent "onkeyup"
     
            需要注意的是,由于开发人员的编程习惯不同,有的可能是“onkeydown”或者其他事件,所以我们需要先弄清楚,是什么事件触发了js函数。
  • (转)QTP动作参数值传递

    2009-03-19 18:04:41

     关于QTP动作的参数,我做了四个动作,各自进行值传递。

            关键字视图如下:
        

            以Action2为例,设置属性如下:

        

            其代码为:

            

            Action2获得的值就是其它动作的输出值,此时获得Action1的输出值:

          

            直接修改Action2的动作调用参数,在Value选择值的来源。当你已经给Action1定义了输出值后,它将会在Value的列表中显示出来。


            这样,我就可以从Action1到Action4各定义输入值,然后输出给下一个动作。

            运行出来结果就是:

           

  • (转)QTP:FileSystemObject基础知识

    2009-03-19 17:57:43

      在QTP测试中,比较本地的两个文件是不是相同,需要使用VBScript的FileSystemObject对象,在此作简要的概述
    一.基础FileSystemObject
    1.     创建 FileSystemObject 对象
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
      Scripting 是类型库的名字,而 FileSystemObject 则是想要创建的对象的名字。
      要用 FileSystemObject (FSO) 对象模式来编程,则:使用 CreateObject 方法来创建 FileSystemObject 对象。
      FSO 对象模式包含在 Scripting 类型库中,该库位于 Scrrun.dll 文件中。因而,要使用 FSO 对象模式,必须把 Scrrun.dll 放在 Web 服务器的适当系统目录中。
    2.     使用方法:
      访问现有驱动器、文件和文件夹
    GetDrive()、GetFolder()、GetFile()、CreateFolder()、CreateFile()、CreateTextFile ()、OpenTextFile()、FolderExists(url)、DeleteFolder(url)、MoveFolder(src,to)、FileExists(url)、CopyFile()、MoveFile()、DeleteFile()、
    例如:
    Dim fso, f1
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f1 = fso.GetFile("c:\test.txt")
    3.     访问属性:
    Name、Path、Size、Type、DateLastModified(上一次修改的文件时间)
    二.FSO的一些特殊功能
    1.        GetSpecialFolder Method 返回特定的Windows文件夹的路径:
      Windows安装目录;Windows系统目录;Windows临时目录
      FSO.GetSpecialFolder([0, 1, or 2]) 
    2.        GetTempName Method 返回一个随机产生的文件或者目录名字,用于存储临数据
    3.        GetAbsolutePathName Method 返回文件夹的绝对路径(类似于Server.MapPath)。
    比如,FSO.GetAbsolutePathName("region") 将返回类似于下面的结果:"c:mydocsmyfolder egion"
    4.        GetExtensionName Method 返回路径中最后部分的扩展名 (比如:FSO.GetExtensionName("c:docs est.txt") 将返回txt)
    5.        GetBaseName and GetParentFolder Methods 返回路径中最后部分的父文件夹 (比如:FSO.GetParentFolder ("c:docsmydocs") 将返回'docs')
    6.        Drives Property 返回所有本地可用驱动器的集合,用于建立资源浏览器样的用户接口。
  • (转)学习QTP后的总结

    2009-03-19 17:52:23

    1、拆分语句split
    例:取得当前日期后拆分
    riqi=date()
        my=split(riqi,"-")
        riqi=my(1)&"月"&my(2)&"日"
        datatable("riqi",DtGlobalSheet)=riqi
        本地表:DataTable("a", dtLocalSheet)
    riqi= year(date)& "-" & Right("0"& month(date),2) & "-"&Right("0"&   Day(Date),2)

    2、取得表格中某行某列的值GetCellData
    例:飞机票取票价
    shuA=Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebTable("New York to Zurich").GetCellData(3,3)


    3、取距某年某月某日的天数datediff
    例:计算距2008-08-08奥运天数
    datediff("d",now,"2008-8-8")


    4、描述性编程text:=
    例:取得某页面上某文字的链接
    Browser("").Page("").Link("text:=娱乐").Click
         或
         neirong="娱乐"
         Browser("").Page("").Link("text:="&neirong).Click


    5、网页中HTML编辑器的录制
    功能:验证126邮箱的发信功能正确
    操作步骤:
          a.录制脚本,动作包括整个发信的过程。
          b.修改脚本,在输入信件主题代码后加wait 10语句
           c.回放脚本,观察在邮件正文中输入的内容,回放时QTP是否写入
          d.重新修改脚本,保证回放时QTP在邮件正文中写入内容

    英文解决方案:
        Browser("网易126免费邮--你的专业电子邮局").Page("网易电子邮箱 - xueqinzhaoqing@126.co").Frame("indexFrame").WebEdit("subject").Click
        wait 1
         Setting.WebPackage( "ReplayType")=2      '配置使用浏览器事件或鼠标运行鼠标操作的'方式.1 - 使用浏览器事件运行鼠标操作,2 - 使用鼠标运行鼠标操作。
         Set ōbj=createobject("wscrīpt.shell")
         obj.sendkeys "{TAB}"
         wait 2
         obj.sendkeys "abc1111"
         wait 1
         Setting.WebPackage( "ReplayType")=1
    中文解决方案

    strCopy = "软件测试." 
    Set ōbjIE = CreateObject("InternetExplorer.Application") 
    objIE.Navigate("about:blank") 
    objIE.document.parentwindow.clipboardData.SetData "text", strCopy 
    objIE.Quit

    wait 1
    Setting.WebPackage( "ReplayType")=2
    Set ōbj=createobject("wscrīpt.shell")
    obj.sendkeys "{TAB}"
    wait 2
    obj.sendkeys "^v"
    wait 1
    Setting.WebPackage( "ReplayType")=1

    6.使用Multi Test Manager添加文件时可以直接往里拖的哦。

    7.函数:新建记事本,改名为public.vbs例:
       function ZHIRSS
    ZHIRSS="RSS行业资讯分类维护"
    end function
      使用语句executefile "d:\zhaopin\case\denglu.vbs"或设置QTP test/settings/resources/+函数目录

    8.设置动作循环:右击/actiong call properties/run on all rows

    9.设置动作允许被调用:右击/action properties/general/reusable action打勾

    10.QTP与MTM连接:Tools/option/run/allow other mercury products to run...

    11.插入已存在的动作1)insert/call to copy of action...复制可修改
                       2)insert/call to existing of action...复制不可修改

    12.QTP报告自动跳出设置:Options>Run>View results when run session ends

    13.判断表格是否存在:
    If Browser("数商3.0后台管理系统").Page("Page").Frame("main_5").WebTable("标题").Exist then
    reporter.ReportEvent 0,"pass","系统显示了所有的资讯列表!"
    else
      reporter.ReportEvent 1,"fail","系统没有显示资讯列表!"
    end if

    14.获取表格行数:Browser("数商3.0后台管理系统").Page("Page").Frame("main_5").WebTable("标题").RowCount

    15.注释脚本存在位置:qtp/dat/ActionTemplate.mst

    16取本地文件名称Function ShowFileList(folderspec)
       Dim fso, f, f1, fc, s
       Set fso = CreateObject("scrīpting.FileSystemObject")
       Set f = fso.GetFolder(folderspec)
       Set fc = f.Files
       For Each f1 in fc
          s = s & f1.name
          s = s &   "  "
       Next
       ShowFileList = s
    End Function
    wenjian=ShowFileList("D:\下载\本地下载1\")

    17.取本地文件删除:del= DeleFile("D:\下载\本地下载1\")
    Function DeleFile(folderspec)
       Dim fso, f, f1, fc, s
       Set fso = CreateObject("scrīpting.FileSystemObject")
       Set f = fso.GetFolder(folderspec)
       Set fc = f.Files
       For Each f1 in fc
             f1.delete
       Next
    End Function

    18.sousuo2=Browser("Browser").Page("Page_4").Check (CheckPoint("2007-11-08 14:21"))
    If (sousuo2)eqv(true) Then
        reporter.ReportEvent 0,"",""
    else
       reporter.ReportEvent 1,"",""
    End If

    19.取参数化数据的行数,只在某几行进执行某些语句
    row=datatable.GetSheet(3).getcurrentrow
    If row = 3 Or row = 4 Then

    20.单选框置灰zhihui=Browser("下载中心--新增下载文件").Page("下载中心--新增下载文件_4").WebRadioGroup("downloadType").GetROProperty("disabled")
    If  zhihui=1 Then
    End If

    29.取树结构
    Set Desc=descrīption.create
    Desc("micclass").value="WebTable"
    Set List=Browser("Browser").Page("Page").Frame("main").ChildObjects(Desc)
    yuqi=List(0).GetROProperty("innertext")
    msgbox yuqi
    yuqi=split(yuqi," ")
    msgbox yuqi(1)

    30.关闭所有IE
    SystemUtil.CloseProcessByName("iexplore.exe")

    31.创建action template.
        当希望在每一个新建action时都增加一些头部说明,比如作者、创建日期、说明等,用action template
        来实现最简单快捷。
        方法:用记事本等文本编辑器,输入如下类似的内容:
              'Company: xxxx
              'Author: xxx
              'Product: xxx
              'Date: xx
             然后将文件保存为ActionTemplate.mst,并存放到QTP安装目录下的dat目录。

    32.启动IE的语句:SystemUtil.Run "iexplore.exe", "http://www.***.com"
       关闭IE或其他程序的语句:SystemUtil.CloseProcessByName "app.exe"
         or  SystemUtil.CloseProcessByWndTitle "Some Title"

    33.获取图片的名称
    ObjectName = Browser(…).Page(…).Image("Find").GetProperty("Name")

    34.检查某个对象是否存在,如果存在弹出对话框说明对象存在。
    If Browser("Browser").Page("Page").Applet("login.html").JavaEdit("username").Exist Then
    MsgBox("The object exists.")
    End if

    35.同步点
    Browser("数商3.0制作平台").Dialog("Microsoft Internet Explorer").WaitProperty "visible", True, 120000
    设置test/test settings/object synchronizationg timeout 一致

    36.视图框显示为乱码时:调整原页面编码,在QTP/tools/change active screen

    37.添加附件:
       Browser("**").Page("**").WebFile("filePath").Click
    Browser("**").Dialog("**").WinEdit("文件名(N):").Set "D:\**.jpg"
    Browser("下载中心--新增下载文件").Dialog("选择文件").WinButton("打开(O)").Click
    添加相应的对象


    38.在图片上右击添加:tools/web event recording configuration/custom settings
    webedit/event/add/onblur,onchange,onfocus,onpropertychan,onsubmit
    webdlement/event/add/onclick,onmousedown,onmouseup/listen always

    39.数据执行保护
      方法一、右击我的电脑/高级/性能/设置/数据执行保护/为除下列选定程序之外的所有程序和服务启用DEP/添加被保护的程序。
      方法二、C:/BOOT.INT修改noexecute=alwaysoff

    40.在图片上右击添加:tools/web event recording configuration/custom settings
    webedit/event/add/onblur,onchange,onfocus,onpropertychan,onsubmit
    webdlement/event/add/onclick,onmousedown,onmouseup/listen always

    41.去掉前后空格
    If trim(mingcheng)=trim(yuqi) Then

    42.分类树问题解决
    Set Desc=descrīption.create
    Desc("micclass").value="WebTable"
    Set List=Browser("Browser").Page("Page").Frame("main").ChildObjects(Desc)
    yuqi=List(0).GetROProperty("innertext")
    msgbox yuqi
    yuqi=split(yuqi," ")
    msgbox yuqi(1)


    43.引用自定义环境变量
    Environment.LoadFromFile "D:\询价\case\环境\huiyuan.xml"

    44.环境变量有2种,一种是QTP的内置变量,一种是用户自定义的变量。内置变量是可以直接就可以用,自定义环境变量需要在菜单中选择“文件”——>“设置”——>“环境”,在变量类型中选择“用户自定义”,然后进行添加,可以对添加的变量全部导出,导出的文件为.xml格式的文档。既然可以导出,那么必然可以导入.xml文件,你可以在该对话框中的选中“从外部文件导入”,然后添加其文件路径即可。(当然这些操作都可以直接使用脚本来实现,如:Environment.LoadFromFile(“FileName”))
    例如:在桌面建立一个Var.xml,如下
    -<Environment>    //以这个开始的内部都是定义环境变量,直到以</Environment>结束
    - <Variable>                           // 变量定义起始标识
                     <Name>aa</Name>               // 变量名称
                     <Value>11</Value>               // 变量值
            </Variable>                            // 变量定义结束标识
    - <Variable>
                     <Name>bb</Name>
                     <Value>22</Value>
            </Variable>
    - <Variable>
                     <Name>cc</Name>
                     <Value>33</Value>
                  </Variable>
      </Environment>
    然后导入本测试的环境变量文件中,在专家视图里编写下面的脚本代码:
    Dim aParam3
    aParam3=Environment.Value(“aa”)          // 调用环境变量
    msgbox aParam3
    运行测试,会输出”11”

    45.在HTML编辑器中写入数据
    用低水平录制写入编辑器过程,增加编辑部器前的对象,加入click事件,再用TAB
    例如:
    Browser("广告管理").Page("广告管理").WebEdit("descrīption").Click
    Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Type mictab
    Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Type "aaa"

    46.Browser("creationtime:=1").close
       两个页面title相同无法识别时使用描述必编辑
        Browser("creationtime:=1").page(title:=****).WebEdit("name:=***").Set "***"
        或Browser("creationtime:=1").page(index:=1).WebEdit("index:=0").Set "***"

    47.场景恢复:
       当某些提示框会在不定期时有提示时,如果自动点击确定或某些按钮
       1、tools/recovery scenaril manager,制作相应的提示框和要点击的按钮,并保存
       2、test/settings/recovery,添加刚保存的.qrs

    48.输入验证码,先提示一个输入框,在输入框内输入验证码,点击[确定],把输入的验证码框
       Dim a
      a = InputBox("输入名字")

    49.对象库中对象名称不分为_2,_3...设置:tool/options/web/page/fram options/
         crate a new page test object for为different test object descrīptons
         crest a new frame. test object for为different test object descrīptions

    50.验证测试输入框输入的最大允许字数功能的正确

    QTP脚本代码中编写
    Set aa=Browser("Browser").Page("Page").Frame("main").WebEdit("PayTypeName")
    if konglen(aa,20) eqv true then
    reporter.ReportEvent 0,"添加支付方式,支付方式输入框允许输入的最大字符功能正确",""
    else
    reporter.ReportEvent 1,"添加支付方式,支付方式输入框允许输入的最大字符功能错误",""
    end if

    此函数的功能为:验证测试输入框输入的最大允许字数功能的正确,函数可写在public.vbs中
    Function konglen(duixiang,guifanshu)
    duixiang.Click
    wait 1
    Setting.WebPackage( "ReplayType")=2
    Set ōbj=createobject("wscrīpt.shell")
    i=0
    ōld="a"
    xin="b"
    while old<>xin
    ōld=duixiang.GetROProperty("value")
    i=i+1
    wait 0,20
    obj.sendkeys "1"
    wait 0,20
    xin=duixiang.GetROProperty("value")
    wend
    'msgbox i
    If i-1=guifanshu Then
    konglen=true
    else
    konglen=false
    End If
         Setting.WebPackage( "ReplayType")=1
    End Function

    51.超时设置:Setting("DefaultTimeout") =1000000

    52.共享对象库:Set App = CreateObject("QuickTest.Application")
    App.Test.Settings.Resources.ObjectRepositoryPath = "path"

    53.取颜色   browser("b").page("p").Object.currentStyle“:.color
    54.显示行号设置:Tools- --> Editor Options...-->General-->Show line number,


    55.不同数据库检查点手动SQL写法
    QTP插入数据库检查点,手动指定SQL语句的写法。
    一、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;

    实例:
    DRIVER={Oracle in OraHome92};SERVER=DCWORK;UID=DCWORK;PWD=DCWORK;DBQ=DCWORK;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;



    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



    四, mysql
    Set Conn = CreateObject("ADODB.Connection" )
    str="DRIVER={MySQL ODBC 3.51 Driver};SERVER=192.168.1.100;DATABASE=wp_blog;user id=zzz ; password=123456"
    Conn.open str
    Set Rs = CreateObject ("ADODB.Recordset" )
    sql = "select * from `wp_blog`.`blg_webcategory` limit 0, 5000;"
    Rs.open sql,conn,1,3
    If (not Rs.eof) then
    Rs.MoveFirst
    MsgBox Rs(0)
    MsgBox Rs(1)
    MsgBox Rs(2)
    MsgBox Rs(3)
    end if

    Rs.close
    Set Rs = Nothing
    Conn.close
    Set Conn = Nothing
    (转载于 http://bbs.51testing.com/thread-42921-1-1.html )

    五. access

    Set Conn = CreateObject("ADODB.Connection" )
    str="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/db1.mdb"
    Conn.open str
    Set Rs = CreateObject ("ADODB.Recordset" )


    56.*.xml
    Environment.LoadFromFile "D:\新建文件夹\a.xml"
    Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").Set Environment("HuiYuanB")

    57、类似时间控件,不能手到输入的文本档
       1)手工添加对象,
       2).object.value="2008-4-12"

  • (转)QTP测试报表table内容的思路

    2009-03-19 17:39:26

    使用QTP对报表中的webtable内容进行正确性验证。

        基本思路是:

        一:使用getcelldata(i,j)的方法遍历webtable把表格内容存入一个数组中,一般为二维数组

        二:使用数据库连接组件ADODB连接后台数据库,使用数据结果集对象保存select查询结果,也是一个二维数组

        三:此时区分是否需要验证排列顺序,如果需要,直接对两个二维数组进行一对一遍历比较

        四:不需要验证排列顺序,或者顺序无法控制的情况下,我们需要对显示内容和查询预期内容进行比较,这时候牵涉到两个结果集的数据顺序问题,如果采用单对多遍历的情况,效率会十分低。

        这时候我们换一种思路考虑,既然是验证内容,那我们就可以把二维数组的验证转换成排序一维数组比较,实现方式是,采用join方法将二维数组的每一行转换成一个字符串(内容没有变化,只加入拼接符),两个二维数组进行相同转换,成为两个一维的字符串数组。

        然后使用快速排序法对两个一维数组进行一次排序,同样的机制下,如果原本内容相同,那么排序出的内容也应该相同。然后直接进行一维数组一对一比较。

        下面是vbs的快速排序代码,合适数字和字符串数组:

    Public Function QSort(ByRef ReArr, ByVal head, ByVal tail)

    'ReArr 是待排序数组, head和tail是该数组的最小下标和最大下标
    Dim lef, rig
    Dim pivot

    If head < tail Then
     lef=head
     rig=tail
     pivot=ReArr(lef)
     While (lef <> rig)

      While (lef < rig and ReArr(rig) >= pivot)
       rig = rig-1
      Wend
      If lef <rig Then
       ReArr(lef) = ReArr(rig)
       lef = lef+1
      End If

      While (lef < rig and ReArr(lef) <= pivot)
          lef = lef+1
      Wend
      If lef <rig Then
       ReArr(rig) = ReArr(lef)
          rig = rig-1
      End If
     
     Wend

     ReArr(lef) = pivot
     call QSort(ReArr, head, lef-1)
     call QSort(ReArr, lef+1, tail)
     
    End If
    End Function

  • (转)对象库管理和编写脚本

    2009-03-19 17:14:00

    使用QTP录制一些脚本再回放,这不难,难的是一个测试团队共同开发脚本,并能不断的完善脚本,创建一个结构化的自动测试脚本体系。这篇文章重点讨论的是,如何管理QTP的对象仓库,以便能让对象仓库易于维护、管理。51Testing软件测试网} Y1m3Y3[NtB
      如果只是简单的录制、回放脚本,可能感觉不到对象仓库的存在。但是要做到QTP脚本的结构化管理,就必须对QTP的对象仓库进行严格的管理。51Testing软件测试网+F[ Q!t:A#[Y
    51Testing软件测试网:?F!s!nV-CN
      在实际工作中我们发现,QTP脚本做好后绝不是一成不变的,而是随着需求和页面的变化,需要不断修改的。如果每次修改脚本的时候,都重新录制脚本,成本极高,所以最有效的方法是,先修改对象仓库,然后修改脚本,以适应新的系统。51Testing软件测试网 jQU.zvf
    51Testing软件测试网 UW2}*t%ts
      如果对象仓库里的管理比较混乱的话,修改脚本时就会遭受地狱般的痛苦,比如n多对象全堆在一起根本理不出头绪,对象的命名不知所云,找不到自己需要的对象等等。下面我们讲一下如何管理对象仓库,避免这些问题。51Testing软件测试网"I1{|!Q^;Y6]y

    HL*c YT-]g$Z&X138711先介绍一下对象仓库中的对象层次,主要分为3个层次51Testing软件测试网b~`0K!b5f"r
    1、Browser浏览器51Testing软件测试网n`7T0Jnn Np*f
    2、Page页面51Testing软件测试网9cHE%nO.oe
    3、页面中的各种对象,比如Link、Button
    _k i jq3jf m13871151Testing软件测试网 _di L}$@
      Browser对应的是已经打开的IE窗口对象,Page对应的是不同的网页,比如登录首页是一个Page,登录成功后跳转到我的淘宝页面,这就是另一个Page。而页面中的各种对象就比较好理解了,图片、按钮、链接都是对象。
    [#xB {3Ha;n7t13871151Testing软件测试网r$jr _4|g
      了解了对象层次,我们再讲一下命名。如果QTP在录制过程中自动记录对象,命名是非常乱的,缺乏逻辑性,经常看到一个Browser下面有n多“淘宝网_1”、“淘宝网_2”这样的Page,这对我们以后的管理非常不利。与其修改这些命名,我们不如用一种思路更清晰的方式,手动添加对象。51Testing软件测试网(`$z H'n+C_KM

    !Q S.]i+|.{e)m3^ P138711  QTP中有一个工具实现了对象仓库的管理,Object Repository Manager,我们用它来添加对象。操作很简单,直接点击toolbar中的Add Object按钮,然后在web上点击你需要添加的对象即可,添加过后再修改名称。更新对象也比较简单,先选中需要更新的对象,然后点击Update from Application即可。
    6r [9a[C]+z%H,q138711
    .[(~/aAf138711  这项工作其实可以在系统页面出来以后就开始做,我们一边进行手工测试,一边把对象添加起来,为后面的脚本开发做准备。这时暂时不制作脚本。51Testing软件测试网B*a([)JA6l
    51Testing软件测试网)`:L atd&BuO|XH
      总结一下,对象仓库的管理要满足以下几个原则:51Testing软件测试网 g^3\)iA!kq
    1、每个Browser下的Page不要太多,最好不要超过5个,即使我们的系统都在同一个IE窗口下(没有弹出新IE),我们也可以分几个Browser管理,把业务上关联较强的几个Page放在一个Browser下;51Testing软件测试网5n7FD \ E m'w^
    2、每个对象都按照所代表的业务属性命名,最好用中文,不要出现一些难理解的字符,比如abc这样的。
    ,][a1Hs;SD1387113、尽量避免在一个tsr文件中堆放过多的对象,最好根据业务,把对象分为几个tsr文件保存。这里没有统一标准,以每个tsr文件结构清晰为宜。51Testing软件测试网"L;A-pJm3\.X}!V

    (N%m1Z(V.h.u138711  现在我们完成了对象仓库的整理,好,可以开始制作脚本了。可是问题来了,录制脚本的时候,QTP能不能自动和这些对象对应上呢?QTP会不会又自动添加一堆对象进来呢?别担心,不会出现这个问题,因为我们将进行一场脚本编写的革命:放弃“录制脚本”这种传统的脚本编写方法,完全手工编写脚本Gj'}%v-\6gF*P_+w138711

    ? D;kc~ces138711我们有了一套结构清楚的对象仓库以后,我们就可以轻松的手工编写QTP脚本了。
    E?S6@$rRepZd138711
    +~ _.TGv3e'IO$\j138711  这里可能有人会问,QTP的录制功能不是很强大么,为什么还要自己手写脚本,这样是不是更麻烦。我先说一下我对手写测试脚本的感受,供大家参考。首先,如果我们整理好对象仓库,再录制脚本,QTP就会又自动生成一批新的对象,命名很乱,再修改替换太费事;其次,录制脚本的过程如果出现问题,再重来,很麻烦;最后,也是最重要的,手写脚本时思路非常清楚,而且写完再运行,感觉非常好,呵呵。
    A0nDT2t X(dzS13871151Testing软件测试网a+uB0oOm@ T#r
      与编写脚本相比,脚本的维护工作同样很重要,而且维护脚本一般都是直接修改脚本,并不会去重新录制,所以开始的时候就用手写的方式,维护起来就会更轻松。
    *z"{vN5L*c-S138711
    U$~$M!XF5XoU138711  编写QTP脚本其实是比较简单、快速的。我们首先创建一个Test,然后把所有相关对象仓库的tsr文件和vbs文件添加到这个Test里面,下面就可以开始写了。写脚本大致会遇到这么几种情况:
    IP1X9a {yc.i1387111、调用vbs函数
    ~ `3TiwR1387112、调用其他Test51Testing软件测试网A&^#l_e
    3、打开指定的URL
    s"HnWU1387114、操作页面Page上的控件51Testing软件测试网z M m fi%Y
    5、添加CheckPoint51Testing软件测试网a&RaE um4kCkW
    6、其他逻辑运算51Testing软件测试网`1~O:LG*iEF
    51Testing软件测试网 o1G/?M1}hA @
      我们分别讲一下。调用vbs函数比较简单,直接Call [函数名]。如果要调用其他的Test,那么首先点击Call to Existing Test,然后在QC中选择一个可以复用的Test,例如登录。如果登录的Test有参数,那么可以这样写:51Testing软件测试网']1To4E2Z
    RunAction "Action1 [login]", oneIteration , "张三"
    2` c5Lf q`138711
    ,C7{*{ m/x*u1r6?138711  下面的脚本要操作对象仓库了。我们先写出“Browser(”,这时就会发现,对象仓库里面的Browser对象都列了出来,然后我们选择需要的那个B对象就好。我们先从打开指定URL的脚本开始讲,打开指定的URL使用的机会比较多,特别是在Test的开始。一般我们这样写51Testing软件测试网;RI2o`!O6ELR
    Browser("登录").Navigate "指定的URL"
    )if6`I#JJ138711
    J0Z,Fz+s138711  这里的“登录”是一个Browser对象,一般我们要选业务上符合的B对象。写完这句以后要再写:51Testing软件测试网0\"^ X4Z9z.W%d[2C
    Browser("登录").Page("登录首页").Sync
    }X*B?,?2@138711
    Kg(`d)UW? V138711  这句的意思是等待“登录首页”这个Page加载完毕,注意不要用Wait几秒这种方式来等待页面加载结束。51Testing软件测试网ww,LED/} i
    51Testing软件测试网;g5S5f{/U Tq:th
      操作Page的对象是比较简单的,由于控件的类型太多,比如下拉菜单WebList、文本输入框WebEdit、按钮WebButton,这里就不一一说明了,大家看下面的一些例子吧:
    a$m|0Wl U138711Browser("购买直充").Page("购买直充").WebList("游戏区").Select 151Testing软件测试网7\.re0O(B8d6h:Q
    Browser("购买直充").Page("购买直充").WebEdit("PlayerName").Set "abc"
    1J4d:`QC T ~138711Browser("购买直充").Page("购买直充").WebEdit("PlayerNameAgain").Set "abc"51Testing软件测试网'J1XHv"? T C5VR
    Browser("购买直充").Page("购买直充").WebEdit("CheckCode").Set "8888"
    )?sWFx1N!@138711Browser("购买直充").Page("购买直充").Image("Submit").Click
    L(D1v7J ]s/r13871151Testing软件测试网ia9m ]F!Y$H"q
      如果遇到问题,不知道怎么写,可以先用录制的方式,生成一些脚本,然后仿照脚本写就可以了。另外在Page下面有可能会有Frame对象,这个没关系,就像这样写即可:
    X c1L0D3Z/OKv1H$RfU138711Browser("我的直充").Page("我的直充").Frame("直充入口").Image("立即直充").Click
    dk)B[d[/^;^,ks I138711
    .Il Y`u r/p.H!O/~.O138711  添加CheckPoint要稍微复杂一些,比如说我们要检查Page上的一个WebElement的显示字符是否正确,那么首选要把这个WebElement完整的写在Test里面,这一句后面需要删除:51Testing软件测试网 qs3vq0k;k1v
    Browser("购买直充").Page("购买直充").WebElement("购买结果").Click51Testing软件测试网D/X&B5n]_B$x

    b9V}&{0C138711  然后右击这一行脚本,选择Insert Standard CheckPoint,在弹出的CP属性窗口,设置CP的细节。确认后脚本就会自动生成一行:51Testing软件测试网a*^2WeP8L#Z l
    Browser("购买直充").Page("购买直充").WebElement("购买结果").Check CheckPoint("购买结果")
    P4[ ID${7Q J!vO(o2S13871151Testing软件测试网9C_3H%O6S~#qc%S3\S
      最后再把上面那一行删除就可以了。51Testing软件测试网}4k;P;c(T v6LdV

    U?f| Wj+U138711  其他的逻辑运算,例如循环、判断,请参考vbs脚本语法,这里不说了。51Testing软件测试网$k"x:_'BZr*u

    p!k.A/Xh%Y$L5_138711  总之,手动编写QTP脚本有很多好处,我在尝试了录制和手写两种方式之后,最终选择了手写的方式,大家不妨也试试,特别是对编码有兴趣的朋友

  • (转)QTP资料整理

    2009-03-19 16:40:17

      QTP调用外部api

      '例1:运行一个exe文件

      Extern.WinExec "d:\1.exe ", 1

      '例2:Beep

       '它让我的机器在办公室里狂响不止!

      Extern.Declare micLong, "Beep", "kernel32.dll", "Beep", micLong

      Extern.Beep 500

      QTP 获取对话框中的信息

      如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证

      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)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理

      QTP获取对象属性名称用法:

      GetRoProperty----从应用程序界面上获取对象属性(即,是脚本运行时,获取的对象动态属性值)

      例如:获取对象库中index属性值,似乎只能用GetToProperty,因为应用程序界面上对象没有该属性,只是QTP为识别该对象创立的描述属性;

      GetToproperty----从对象库中描述对象的属性,静态值

      GetToProperties----获取用于标识对象的属性集;对于这个集合,有count等属性方法

      QTP在执行过程中往excel中写入值

      DataTable.GlobalSheet.AddParameter "Name", "liuxuedong"

      取datatable特定行的数据可以这样使用

      DataTable.GetSheet("Action1").GetParameter("test\").ValueByRow(1)
  • (转)QTP-使用技巧

    2009-03-19 16:01: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多个TestCaseTD是否可以管理)

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

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

       MI有另一个工具叫MTMmultitestmanager

     

     

     

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

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

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

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

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

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

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

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

     

     

     

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

     A:Text not displayed能解决问题

       关于Text Checkpoint的总结。

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

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

       3) Text not displayed。这个选项本质上就是一个结果取反的过程。就是把检查的结果给反过来,pass变成FailFail变成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服务项将被重新开启。

     

    其实,在Windowssamples目录下,有个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.关于dtGlobalsheetdtLocalsheet

     

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

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

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

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

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

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

    这些action也分别对应有各自默认的LoaclSheet.即:actiion1actiion2actiion3

     

    如果每个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

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

     

    如果function中出现控件调用,那么必须确保该控件在相应的Actionobject 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. QTPDebug状态,Export View区域不能写入任何东西

     

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

     

    如: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某栏linktext?

     

    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

  • (转)QTP模拟鼠标和键盘事件整理

    2009-03-19 15:57:37

      1、鼠标事件

      1.1 使用自带的Click方法

      看QTP的帮助,每个对象都有自带的Click方法,通过其中第三个参数指定具体的鼠标事件

      例如:

      Browser("New Page").page("New Page").WebElement("html tag:=Form").Click

      0,0,micRightBtn

      注意Click方法的前两个参数是相对坐标,即相对于对象控件左上角的坐标。

      然而执行脚本时常常发现右键功能无法回放。这需要通过设置回放级别解决。例如:

      Setting.WebPackage("ReplayType") = 2

      Browser("New Page").page("New Page").WebElement("html tag:=Form").Click

      0,0,micRightBtn

      Setting.WebPackage("ReplayType") = 1

      1.2 使用自带的FireEvent方法

      具体使用参考QTP的帮助吧,需要提醒一下,右键菜单的弹出对应的是"oncontextmenu"事件,这个帮助里没有提到,当然依赖于开发的代码实现。

      1.3 使用mercury.devicereplay

      Set devReplay = CreateObject("mercury.devicereplay")

      devReplay.MouseClick absx+4,absy+4,2

      1.4 使用Windows底层的mouse_event

      如果上面的方法仍然不管用,就要采用更底层的方法了。不过这种方式不推荐,因为mouse_event识别的是绝对坐标,你还需要在调用 mouse_event前获取对象的绝对坐标。需要说明的是,如果没有使用MOUSEEVENTF_ABSOLUTE,函数默认的是相对于鼠标当前位置的点,用0,0表示,会被认为是当前鼠标所在的点。

      Extern.Declare micVoid, "mouse_event", "user32.dll", "mouse_event", micByte,micByte,micDWord,micULong

      Extern.mouse_event MOUSEEVENTF_RIGHTDOWN,0,0,0

      2、键盘事件

      2.1 SendKeys

      最常用的模拟键盘操作的事件就是SendKeys了,具体说明一样参考QTP的帮助。

      需要说明的是QTP帮助中的例子,需要做一些调整,QTP中执行不需要显示指定Wscrīpt执行shell命令,否则会报错。正确的例子如下:

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

      WshShell.sendKeys "{DOWN}"

      2.2 Mercury.DeviceReplay

      Set devReplay = CreateObject("mercury.devicereplay")

      devReplay.SendString("a")

      下面这篇文章介绍的比较清楚。

      http://www.51testing.com/?161787/action_viewspace_itemid_84200.html

      2.3 使用Windows底层的keybd_event

      Extern.Declare micVoid, "keybd_event", "user32.dll", "keybd_event", micByte,micByte,micDWord,micULong

      Extern.keybd_event 42,0,0,0

      注意一下这里的第一个参数是10进制的。

      SendKeys的使用要方便一点,但是稳定性不如后者,

      Function RtClick( Obj )

      absx = Obj.GetROProperty("abs_x")

      absy = Obj.GetROProperty("abs_y")

      Set devReplay = CreateObject("mercury.devicereplay")

      devReplay.MouseClick absx+4,absy+4,2

      set devReplay = nothing

      End Function
  • (转)QTP自动化测试工程师需要掌握的DOM

    2009-03-19 15:49:54

    在使用QTP测试WEB页面时,经常需要利用测试对象中的Object属性来访问和操作DOM,因此,QTP自动化测试工程师非常有必要掌握一些常用的DOM知识。 下面就列举了一些常用的DOM属性、方法和集合:

      常用DOM 属性

      ●  className.同一样式规则的元素用相同的类名。可以通过className快速过滤出一组类似的元素。

      ●  document.用于指向包含当前元素的文档对象。

      ●  id.当前元素的标识。如果文档中包含多个相同id的元素,则返回一个数组。

      ●  innerHTML.用于指向当前元素的开始标记和结束标记之间的所有文本和HTML标签。

      ●  innerText.用于指向当前元素的开始标记和结束标记之间的所有文本和HTML标签。

      ●  offsetHeight, offsetWidth.元素的高度和宽度。

      ●  offsetLeft, offsetTop.当前元素相同对于父亲元素的左边位置和顶部位置。

      ●  outerHTML.当前元素的开始标记和结束标记之间的所有文本和HTML标签。

      ●  outerText.当前元素的开始标记和结束标记之间的所有文本,但不包括HTML标签。

      ●  parentElement.当前元素的父亲元素。

      ●  sourceIndex.元素在document.all集合中的索引(index)。

      ●  style.元素的样式表单属性。

      ●  tagName.当前元素的标签名。

      ●  title.在IE中,代表元素的tool tip文本。

      常用DOM 方法

      ●  click().模拟用户对当前元素的鼠标点击。

      ●  contains(element).用于判断当前元素是否包含指定的元素。

      ●  getAttribute(attributeName, caseSensitive).返回当前元素所包含的某个属性,参数attributeName为属性名、caseSensitive表示是否大小写敏感。

      ●  setAttribute(attributeName, value, caseSenstive). 设置当前元素的属性。

      常用DOM 集合

      ●  All[].当前元素中包含的所有HTML元素的数组。

      ●  children[].当前元素包含的孩子元素。

  • (转)QTP中调用带有参数的Action

    2009-03-16 17:24:38

    调用带有参数的操作

            如果所调用的操作已定义了输入和/或输出参数,您还可以提供输入参数的值以及输出参数的存储位置,作为 RunAction 语句的参数。输入参数列在输出参数之前。

            对于输入参数,可以指定一个固定值,也可以指定另一个已定义的参数(数据表参数、环境参数或调用操作的操作输入参数)的名称,输入参数将采用该已定义参数的值。

            对于输出参数,可以指定一个用于存储值的变量,或者是一个已定义参数(数据表参数、环境参数或调用操作的操作输出参数)的名称。

            带有参数的操作调用使用以下语法:

            RunAction ActionName,IterationQuantity,Parameters

            例如,假设从 Action1 调用 Action2,并且 Action2 有一个已定义的输入参数和一个已定义的输出参数。

            RunAction "Action2", oneIteration, "MyValue", MyVariable

            为输入参数提供 MyValue 的字符串值,并将输出参数生成的值存储在名为 MyVariable 的变量中。

            RunAction "Action2", oneIteration, Parameter(ìAxn1_In), DataTable("Column1_out", dtLocalSheet)

            使用为 Action1 的 Axn1_In 输入操作参数定义的值作为该输入参数的值,并将输出参数生成的值存储在 Action1 的数据表工作表中名为 Column1_out 的一列中。

1394/7<1234567>
Open Toolbar